Suchen-Ersetzen EXCEL Makro?
Hi !!
Hab folgendes Problem!
Ich habe 2Sheets in einer Mappe: Sheet1 und Sheet2
usw......
Jetzt möchte ich, dass ein makro für mich die Namen in Sheet1 ersetzt und zwar wie folgt :
Gesucht wird nach C3 aus Sheet2 (Werner) in Sheet1 -> ersetzt wird (Werner) durch den Namer der in B3 in Sheet2 (Uwe)
und das soll für ca 5000 namen geschehen !!!!!
Ich komme einfach mit dem Makro aufzeichnen nicht weiter da ich bei suchen und ersetzen nicht weiß wie ich die zellen verknüpfen kann?????
also dass das makro in sheet1 nach "C3 aus Sheet2" sucht und mit "B3 aus Sheet2" ersetzt!!
*
Das nächste wäre nur als zusatz hab mich noch nicht damit befasst weil ich beim ersetzten nicht weiterkomme!!
Wenn erfolgreich ersetzt wurde sollte in der dazugehörigen (E-Zelle) ein Ja stehen
und wenn nicht ein nein!!
Ich hoffe ihr könnt mir helfen und das ich das problem genau beschrieben habe!!
Danke schon mal im Vorraus an alle!
Hab folgendes Problem!
Ich habe 2Sheets in einer Mappe: Sheet1 und Sheet2
usw......
Jetzt möchte ich, dass ein makro für mich die Namen in Sheet1 ersetzt und zwar wie folgt :
Gesucht wird nach C3 aus Sheet2 (Werner) in Sheet1 -> ersetzt wird (Werner) durch den Namer der in B3 in Sheet2 (Uwe)
und das soll für ca 5000 namen geschehen !!!!!
Ich komme einfach mit dem Makro aufzeichnen nicht weiter da ich bei suchen und ersetzen nicht weiß wie ich die zellen verknüpfen kann?????
also dass das makro in sheet1 nach "C3 aus Sheet2" sucht und mit "B3 aus Sheet2" ersetzt!!
*
Das nächste wäre nur als zusatz hab mich noch nicht damit befasst weil ich beim ersetzten nicht weiterkomme!!
Wenn erfolgreich ersetzt wurde sollte in der dazugehörigen (E-Zelle) ein Ja stehen
und wenn nicht ein nein!!
Ich hoffe ihr könnt mir helfen und das ich das problem genau beschrieben habe!!
Danke schon mal im Vorraus an alle!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 01.12.2009 um 18:33:09 Uhr
Für diese IT-typische Formulierung, gepostet am 1.12.2009
Vor allem, weil ich bei dieser Einleitung immer schon den Folgesatz erahne...
Zitat von @ffmboy:
Also zum Export der datei hab ich mir das makro hier angepasst funktioniert eigentlich super:
... dafür mache ich bald einen neuen Counter auf....Also zum Export der datei hab ich mir das makro hier angepasst funktioniert eigentlich super:
Vor allem, weil ich bei dieser Einleitung immer schon den Folgesatz erahne...
Content-ID: 130053
Url: https://administrator.de/forum/suchen-ersetzen-excel-makro-130053.html
Ausgedruckt am: 23.12.2024 um 19:12 Uhr
45 Kommentare
Neuester Kommentar
Auch Hi,
so etwas funktioniert i.d.R. nur über solche Dinge wie suchen/ersetzen, wenndann, sverweis etc. Dafür benötigt man auch kein Makro.
Wenn Du aber nur Vornamen hast, wird Excel alleine schon Probleme haben, sauber die Namen zu finden, denn Wolfgang wird es vermutlich mehr als einmal geben.
Wenn Die Zeilen (Namen) schon alle schön untereinander stehen, kopier doch die Spalte mit den neuen Namen einfach drüber. Damit sind auf jeden Falle alle ersetzt. :o)
Ansonsten benötigst Du auf jeden Fall eine Art Primärschlüssel, und damit ist Access der klar bessere Favorit!
VG
JDI
so etwas funktioniert i.d.R. nur über solche Dinge wie suchen/ersetzen, wenndann, sverweis etc. Dafür benötigt man auch kein Makro.
Wenn Du aber nur Vornamen hast, wird Excel alleine schon Probleme haben, sauber die Namen zu finden, denn Wolfgang wird es vermutlich mehr als einmal geben.
Wenn Die Zeilen (Namen) schon alle schön untereinander stehen, kopier doch die Spalte mit den neuen Namen einfach drüber. Damit sind auf jeden Falle alle ersetzt. :o)
Ansonsten benötigst Du auf jeden Fall eine Art Primärschlüssel, und damit ist Access der klar bessere Favorit!
VG
JDI
dann wäre der sverweis meine 1. Wahl (ohne Makro).
Du machst in Sheet 1 rechts neben der auszutauschenden Spalte eine neue spalte. Dor legst Du den Sverweis an.
Dann bis ans Ende runterkopieren. Alle Einträge die nicht gefunden werden werden mit #NV gekennzeichnet. Die Filterst Du raus. Dann mit einer wenn Formel beide Spalten in einer neuen Spalte zusammenbringen. Die beiden alten Spalten (alte Namen und die mit dem S.-Verweis) löschen. fertig.
Wenn Du noch das mit Ersetzt ja / Nein benötigst, kannst Du dafür die #NV nehmen.
VG
JDI
Du machst in Sheet 1 rechts neben der auszutauschenden Spalte eine neue spalte. Dor legst Du den Sverweis an.
Dann bis ans Ende runterkopieren. Alle Einträge die nicht gefunden werden werden mit #NV gekennzeichnet. Die Filterst Du raus. Dann mit einer wenn Formel beide Spalten in einer neuen Spalte zusammenbringen. Die beiden alten Spalten (alte Namen und die mit dem S.-Verweis) löschen. fertig.
Wenn Du noch das mit Ersetzt ja / Nein benötigst, kannst Du dafür die #NV nehmen.
VG
JDI
Hallo ffmboy!
Wenn's doch ein Makro sein soll, dann diesen Quelltext im VB-Editor in ein Modul kopieren:
Die Namen der Tabellenblätter entsprechend anpassen
Gruß Dieter
Wenn's doch ein Makro sein soll, dann diesen Quelltext im VB-Editor in ein Modul kopieren:
Option Explicit
Option Compare Text
Const Sheet1 = "Tabelle1"
Const Sheet2 = "Tabelle2"
Sub SearchAndReplace()
Dim Wks1 As Worksheet, Wks2 As Worksheet, c As Range, d As Range
Set Wks1 = Sheets(Sheet1): Set Wks2 = Sheets(Sheet2)
For Each c In Wks2.Range("C3:C" & Wks2.Cells(Wks2.Rows.Count, "C").End(xlUp).Row)
If Not IsEmpty(c) Then
Set d = Wks1.Columns("B").Find(c, LookIn:=xlValues, LookAt:=xlWhole)
If d Is Nothing Then
c.Offset(0, 1) = "Nein"
Else
d.Value = c.Offset(0, -1): c.Offset(0, 1) = "Ja"
End If
End If
Next
End Sub
Die Namen der Tabellenblätter entsprechend anpassen
Gruß Dieter
Hallo ffmboy!
Also, ich nehme mal an, dass die Konstanten Sheet1 und Sheet2 richtig angepasst wurden.
ActiveSheet wird nicht benötigt, da mit den Set-Anweisungen für Wks1 und Wks2 die Tabellenblätter explizit zugewiesen werden.
Die Zeile 12 bedeutet: Durchlaufe in Sheet 2 alle Zellen im Bereich von C3 bis zur letzten Zelle mit Inhalt in Spalte C
Die Zeile 14 bedeutet: Durchsuche in Sheet 1 die Spalte B nach dem Zellinhalt, der in Sheet 2 in der aktuellen Zeile und Spalte C drinsteht.
Die Zeile 16 bedeutet: Zellinhalt in Spalte B in Sheet 1 nicht gefunden, dann schreibe in Sheet 2 aktuelle Zeile Spalte D "Nein"
Die Zeile 18 bedeutet: Zellinhalt in Spalte B in Sheet 1 gefunden, dann ersetze den Zellinhalt mit dem Inhalt der in Sheet 2 in Spalte B steht und schreibe in Sheet 2 Spalte D "Ja"
Also, wenn Deine Vorgaben im Beitrag stimmen, dann sollte es eigentlich funktionieren, zumindest funktioniert es bei mir.
Gruß Dieter
Also, ich nehme mal an, dass die Konstanten Sheet1 und Sheet2 richtig angepasst wurden.
ActiveSheet wird nicht benötigt, da mit den Set-Anweisungen für Wks1 und Wks2 die Tabellenblätter explizit zugewiesen werden.
Die Zeile 12 bedeutet: Durchlaufe in Sheet 2 alle Zellen im Bereich von C3 bis zur letzten Zelle mit Inhalt in Spalte C
Die Zeile 14 bedeutet: Durchsuche in Sheet 1 die Spalte B nach dem Zellinhalt, der in Sheet 2 in der aktuellen Zeile und Spalte C drinsteht.
Die Zeile 16 bedeutet: Zellinhalt in Spalte B in Sheet 1 nicht gefunden, dann schreibe in Sheet 2 aktuelle Zeile Spalte D "Nein"
Die Zeile 18 bedeutet: Zellinhalt in Spalte B in Sheet 1 gefunden, dann ersetze den Zellinhalt mit dem Inhalt der in Sheet 2 in Spalte B steht und schreibe in Sheet 2 Spalte D "Ja"
Also, wenn Deine Vorgaben im Beitrag stimmen, dann sollte es eigentlich funktionieren, zumindest funktioniert es bei mir.
Gruß Dieter
Zitat von @ffmboy:
das makro schreibt aber in sheet1 spalte d (nein rein) und zwar überall ein nein!!
Also, Sheet 2 muss das Tabellenblatt mit den Spalten "Neu" und "Alt" und "Ersetzt" sein. So wie in Deinem Beitrag vorgegeben. Wenn dem so ist, dann kann unmöglich in Sheet 1 in Spalte D was reingeschrieben werden. Das Makro ist explizit nach Deinen Vorgaben geschrieben.das makro schreibt aber in sheet1 spalte d (nein rein) und zwar überall ein nein!!
Gruß Dieter
Hallo nochmal!
Vielleicht solltest Du die Tabellennamen erstmal so anpassen, das es kein Kuddelmuddel gibt. Das ganze soll doch eine einmalige Sache sein oder sehe ich das Falsch. Eventuell wäre es sinnvoll ein neues Tabellenblatt zu erstellen, in dem z.B. pro Zeile in Spalte A und B die jeweiligen Tabellennamen der Sheetpärchen eingetragen werden. Diese Liste könnte dann durch das Makro Zeile für Zeile abgearbeitet werden. Nur so ein Gedanke
Gruß Dieter
Vielleicht solltest Du die Tabellennamen erstmal so anpassen, das es kein Kuddelmuddel gibt. Das ganze soll doch eine einmalige Sache sein oder sehe ich das Falsch. Eventuell wäre es sinnvoll ein neues Tabellenblatt zu erstellen, in dem z.B. pro Zeile in Spalte A und B die jeweiligen Tabellennamen der Sheetpärchen eingetragen werden. Diese Liste könnte dann durch das Makro Zeile für Zeile abgearbeitet werden. Nur so ein Gedanke
Gruß Dieter
Zitat von @ffmboy:
ist es möglich das makro so anzupassen dass es nicht unbedingt sheet1 und sheet2 sein müssen??
Hast Du meine vorletzte Antwort gelesen?ist es möglich das makro so anzupassen dass es nicht unbedingt sheet1 und sheet2 sein müssen??
wenn ich auf die tabelle (welche im beispiel sheet1 ist) rechte maus code anzeigen:
zeigt er mir an das es Tabelle7 ist. in der excel
oberfläche habe ich die tabelle auf die 2 stelle vorübergehend verschoben!!
wenn ich auf die tabelle (welche im beispiel sheet2 ist) rechte maus code anzeigen:
zeigt er mir an das es Tabelle3 ist. in der excel
oberfläche habe ich die tabelle auf die 4 stelle vorübergehend verschoben!!
Wozu soll das gut sein?zeigt er mir an das es Tabelle7 ist. in der excel
oberfläche habe ich die tabelle auf die 2 stelle vorübergehend verschoben!!
wenn ich auf die tabelle (welche im beispiel sheet2 ist) rechte maus code anzeigen:
zeigt er mir an das es Tabelle3 ist. in der excel
oberfläche habe ich die tabelle auf die 4 stelle vorübergehend verschoben!!
kannst du mir vielelicht sagen welche parameter/ constante/variablen ich in deinem code wie anpassen muss um das
makro nach meinen belieben zu ändern!!
Was genau willst Du verändern?makro nach meinen belieben zu ändern!!
Für den Fall, dass sich imer nur 2 Tabellennamen ändern, wäre es wohl am einfachsten, die Sheetnamen per InputBox abzufragen.
Gruß Dieter
Zitat von @ffmboy:
Kann man das suchen und ersetzen so ändern dass es die zellen
danach durchsucht und ersetzt auch wenn dabei noch was anderes steht:
Ja, das geht, sofern der Name im Sheet nur einmal vorkommt.Kann man das suchen und ersetzen so ändern dass es die zellen
danach durchsucht und ersetzt auch wenn dabei noch was anderes steht:
2Frage:
Wenn ich bsp. im sheet1 einen filter einsetzen würde, würde
das suchen und erseztzen nur das gefilterte durchsuchen und bearbeiten
oder den kopletten sheet1???
Mit Filter funktioniert das leider nicht.Wenn ich bsp. im sheet1 einen filter einsetzen würde, würde
das suchen und erseztzen nur das gefilterte durchsuchen und bearbeiten
oder den kopletten sheet1???
Gruß Dieter
Hallo ffmboy!
Sorry, aber irgendwie kann ich Dir nicht mehr ganz folgen
Gruß Dieter
Sorry, aber irgendwie kann ich Dir nicht mehr ganz folgen
Gruß Dieter
Hallo ffmboy!
Also, was die Such/Ersetzen-Funktion bei Filterung angeht, muss ich mich zunächst korrigieren.
Bei meinem 1. Test hatte ich keine Überschriftenzeile und da gab's Probleme. Bei einem Test mit Überschriftzeilen hat es dann doch funktioniert.
Aber trotzdem habe ich den Überblick verloren und weiß nicht, was ich jetzt Sheet 1 und Sheet 2 zuordnen soll.
Welches Sheet soll jetzt gefiltert werden, das mit "Neu, Alt, Ersetzen" oder das andere?
Der Einfacheit halber sollten wir das Sheet mit "Neu, Alt, Ersetzen" Sheet "Suchen" und das andere "Ersetzen" nennen.
Das andere mit der Teil-Suchen/Ersetzen-Funktion folgt noch.
Gruß Dieter
Also, was die Such/Ersetzen-Funktion bei Filterung angeht, muss ich mich zunächst korrigieren.
Bei meinem 1. Test hatte ich keine Überschriftenzeile und da gab's Probleme. Bei einem Test mit Überschriftzeilen hat es dann doch funktioniert.
Aber trotzdem habe ich den Überblick verloren und weiß nicht, was ich jetzt Sheet 1 und Sheet 2 zuordnen soll.
Welches Sheet soll jetzt gefiltert werden, das mit "Neu, Alt, Ersetzen" oder das andere?
Der Einfacheit halber sollten wir das Sheet mit "Neu, Alt, Ersetzen" Sheet "Suchen" und das andere "Ersetzen" nennen.
Das andere mit der Teil-Suchen/Ersetzen-Funktion folgt noch.
Gruß Dieter
Hallo ffmboy!
Hier der Code mit Teil-Ersetzen (Zeile 14 und Zeile 18 geändert):
Gruß Dieter
Hier der Code mit Teil-Ersetzen (Zeile 14 und Zeile 18 geändert):
Option Explicit
Option Compare Text
Const Sheet1 = "Tabelle1"
Const Sheet2 = "Tabelle2"
Sub SearchAndReplace()
Dim Wks1 As Worksheet, Wks2 As Worksheet, c As Range, d As Range
Set Wks1 = Sheets(Sheet1): Set Wks2 = Sheets(Sheet2)
For Each c In Wks2.Range("C3:C" & Wks2.Cells(Wks2.Rows.Count, "C").End(xlUp).Row)
If Not IsEmpty(c) Then
Set d = Wks1.Columns("B").Find(c, LookIn:=xlValues, LookAt:=xlPart)
If d Is Nothing Then
c.Offset(0, 1) = "Nein"
Else
d.Value = Replace(d, c, c.Offset(0, -1)): c.Offset(0, 1) = "Ja"
End If
End If
Next
End Sub
Gruß Dieter
Hallo Viktor!
Das ist korrekt
Jetzt habe ich endlich auch verstanden, was Du genau machst und das es funktioniert, freut mich
Gruß Dieter
Das ist korrekt
Jetzt habe ich endlich auch verstanden, was Du genau machst und das es funktioniert, freut mich
Gruß Dieter
Hallo Viktor!
Also, in meiner Excel-Version gibt es kein Symbol für XML-Export.
Und keine Ahnung, wo Du vernünftige Beschreibungen zu einzelnen Funktionen findest. Bei Bedarf blättere ich den Object-Katalog durch und suche was ich brauche bzw. gebe entsprechende Begriffe in die Suchmaske ein.
Der nachfolgende Code ermöglicht Dir per Auswahl den Export eines markierten Bereichs in das CSV- oder XML-Format.
Dieser Code erlaubt aber nur eine Marierung in der Form z.B. Range(A5:H12), also keine Spalten/Zeilen-Markierung oder mehrere Blöcke.
Der Ablauf ist in etwa so:
Prüfe ob ein zusammenhängender Bereich markiert, der mehr als eine Zelle enthält.
Erstelle eine neue Temporäre-Arbeitsmappe und kopiere den markierten Bereich in die Zelle A1 von Sheet 1.
Gib einen Dialog "Speichern unter" (*.csv, *.xml) aus, speichere im entsprechenden Format und schließe die Temporäre-Arbeitsmappe.
Eine Sache, die ich mir jedoch nicht erklären kann, ist die, dass die CSV-Datei mit Kommata anstatt Semilikon erstellt wird?
Den Rest kannst Du ja nach Deinen Wünschen anpassen:
Gruß Dieter
Also, in meiner Excel-Version gibt es kein Symbol für XML-Export.
Und keine Ahnung, wo Du vernünftige Beschreibungen zu einzelnen Funktionen findest. Bei Bedarf blättere ich den Object-Katalog durch und suche was ich brauche bzw. gebe entsprechende Begriffe in die Suchmaske ein.
Der nachfolgende Code ermöglicht Dir per Auswahl den Export eines markierten Bereichs in das CSV- oder XML-Format.
Dieser Code erlaubt aber nur eine Marierung in der Form z.B. Range(A5:H12), also keine Spalten/Zeilen-Markierung oder mehrere Blöcke.
Der Ablauf ist in etwa so:
Prüfe ob ein zusammenhängender Bereich markiert, der mehr als eine Zelle enthält.
Erstelle eine neue Temporäre-Arbeitsmappe und kopiere den markierten Bereich in die Zelle A1 von Sheet 1.
Gib einen Dialog "Speichern unter" (*.csv, *.xml) aus, speichere im entsprechenden Format und schließe die Temporäre-Arbeitsmappe.
Eine Sache, die ich mir jedoch nicht erklären kann, ist die, dass die CSV-Datei mit Kommata anstatt Semilikon erstellt wird?
Den Rest kannst Du ja nach Deinen Wünschen anpassen:
Option Explicit
Option Compare Text
Const Msg1 = "Es wurde kein gültiger Bereich markiert!"
Sub ExportFunction()
Dim Wks As Worksheet, Wkb As Workbook, Target As String, WkbPath As Variant
Target = Selection.Address
If InStr(Target, ":") = 0 Or UBound(Split(Target, "$")) <> 4 Then
MsgBox Msg1, vbExclamation, "Fehler": Exit Sub
End If
Set Wks = ActiveWorkbook.ActiveSheet: Set Wkb = Workbooks.Add
Wks.Range(Target).Copy Destination:=Wkb.ActiveSheet.Range("A1")
WkbPath = Application.GetSaveAsFilename(InitialFileName:="Export", _
fileFilter:="CSV (*.csv),*.csv,XML (*.xml), *.xml")
Application.DisplayAlerts = False
If WkbPath = False Then
Wkb.Saved = True
ElseIf WkbPath Like "*.csv" Then
Wkb.SaveAs WkbPath, xlCSV
ElseIf WkbPath Like "*.xml" Then
Wkb.SaveAs WkbPath, xlXMLSpreadsheet
Else
Wkb.Saved = True
End If
Wkb.Close
Application.DisplayAlerts = True
End Sub
Gruß Dieter
Hallo Viktor!
Oha, dass scheint ja ein endloser Thread zu werden
Also, wenn ich Dich richtig verstehe, dann funktioniert Deine Export-Funktion, aber Deine Import-Funktion mit QueryTable nicht so richtig? Wenn ja, dann poste mal den aktuellen Code dazu, aber bitte mit Code-Tags. Biber war ja so nett und hat Deinen letzten Code in Code-Tags gesetzt
Zunächst würde ich Dir, wie von bastla im anderen Thread bereits erwähnt, auch empfehlen für Dateioperationen das neuere FileSystemObject zu verwenden.
Am besten, Du importierst die Bibliothek in Deine Excel-Datei wie folgt:
Dann siehst Du die umfangreichen FileSystemObject-Funktionen in den den Klassen <FileSystemObject> und <TextStream>
Code-Beispiel:
CSV-Export mit Nicht-Ascii-Zeichen Chr(1) als Trennzeichen:
Gruß Dieter
[edit] Code komplett geändert am 03.12 [/edit]
Mit diesen Codes sollten die Import/Export-Funktionen jetzt funktionieren. Als Trennzeichen, wird jetzt ein Nicht-Ascii-Zeichen verwendet, dass in den Zellinhalten normalerweise nicht vorkommen sollte.
Der Export-Bereich wird nun per InputBox abgefragt und als Dateiformat wird *.CSV genommen.
Oha, dass scheint ja ein endloser Thread zu werden
Also, wenn ich Dich richtig verstehe, dann funktioniert Deine Export-Funktion, aber Deine Import-Funktion mit QueryTable nicht so richtig? Wenn ja, dann poste mal den aktuellen Code dazu, aber bitte mit Code-Tags. Biber war ja so nett und hat Deinen letzten Code in Code-Tags gesetzt
Zunächst würde ich Dir, wie von bastla im anderen Thread bereits erwähnt, auch empfehlen für Dateioperationen das neuere FileSystemObject zu verwenden.
Am besten, Du importierst die Bibliothek in Deine Excel-Datei wie folgt:
<VB-Editor><Ansicht Objectkatalog><Klassen><Rechtsklick Verweise><Microsoft Scripting Runtime><Häkchen><OK> |
Code-Beispiel:
Dim Fso As New FileSystemObject, File As TextStream
Set File = Fso.OpenTextFile(...)
Const Default = "C7:C55416"
Const Msg1 = "Bitte den kompletten Dateipfad angeben:"
Const Msg2 = "Bitte den Exportbereich im Format 'C7:H17' angeben:"
Const Msg3 = "Die Eingaben waren unvollständig!"
Const Msg4 = "Der Exportvorgang ist abgeschlossen!"
Private Sub Export_Click()
Dim Fso As Object, File As Object, TextArray As Variant
Dim Bereich As Range, Zeile As Range, Zelle As Range
Dim Dateipfad As String, Mappepfad As String, RngExport As String
Dim SpalteBeg As Integer, SpalteEnd As Integer
Mappepfad = ThisWorkbook.FullName
Mappepfad = Replace(Mappepfad, ".xls", ".csv")
Dateipfad = InputBox(Msg1, "CSV-Export", Mappepfad)
RngExport = InputBox(Msg2, "CSV-Export", Default)
If Dateipfad = "" Or RngExport = "" Then
MsgBox Msg3, vbExclamation, "CSV-Export": Exit Sub
End If
Set Bereich = Range(RngExport)
SpalteBeg = Bereich.Column
SpalteEnd = SpalteBeg + Bereich.Columns.Count - 1
ReDim TextArray(SpalteBeg To SpalteEnd) As String
Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.CreateTextFile(Dateipfad)
For Each Zeile In Bereich.Rows
For Each Zelle In Zeile.Cells
TextArray(Zelle.Column) = Zelle.Text
Next
File.WriteLine Join(TextArray, Chr(1))
Next
File.Close: Set Fso = Nothing
MsgBox Msg4, vbInformation, "CSV-Export"
End Sub
[edit] Code komplett geändert am 03.12 [/edit]
Mit diesen Codes sollten die Import/Export-Funktionen jetzt funktionieren. Als Trennzeichen, wird jetzt ein Nicht-Ascii-Zeichen verwendet, dass in den Zellinhalten normalerweise nicht vorkommen sollte.
Der Export-Bereich wird nun per InputBox abgefragt und als Dateiformat wird *.CSV genommen.
Hallo Viktor!
Passend zum Export-Code den dazugehörigen Import-Code.
CSV-Import mit Nicht-Ascii-Zeichen Chr(1) als Trennzeichen:
Gruß Dieter
[edit] Code komplett geändert am 03.12 [/edit]
Der Import-Bereich wird nun per InputBox abgefragt und als Dateiformat wird *.CSV genommen.
Hinsichtlich von QueryTables sei noch zu erwähnen, dass QueryTable (Add) bei jedem Import eine Abfrage speichert. Wenn Du in Deine Excel-Datei z.B. 1000 mal immer die gleiche Datei mit gleichem Inhalt importierst, wird die Excel-Datei wundersamer Weise mit jeder Abfrage größer und größer. Im QueryTable-Code habe ich bereits einen Löschbefehl mit eingebunden, der aber nur die aktuelle Abfrage löscht. Ob Abfragen gespeichert sind, kannst Du sehen, wenn Du in Deinem Import-Sheet in Zelle C7 einen Rechtsklick machst und dort das rote Ausrufezeichen mit dem Text "Daten aktualisieren" steht.
Wenn dem so ist, dann kannst Du mit diesem Code alle Abfragen im aktiven Arbeitsblatt löschen:
Ausserdem wäre es sinnvoll, falls die Möglichkeit dazu besteht, eine komplett neue Excel-Datei zu erstellen. Eventuell ist Deine Excel-Datei durch die Code-Veränderungen und unzähligen QueryTables-Abfragen sehr stark fragmentiert (wundersame Dateigröße?).
Passend zum Export-Code den dazugehörigen Import-Code.
CSV-Import mit Nicht-Ascii-Zeichen Chr(1) als Trennzeichen:
Const Default = "C7"
Const Msg1 = "Bitte die erste Zelle im Format 'C7' angeben:"
Const Msg2 = "Die Eingaben waren unvollständig!"
Private Sub Import_Click()
Dim Dateipfad As Variant, RngImport As String
Dateipfad = Application.GetOpenFilename("CSV (*.csv),*.csv")
RngImport = InputBox(Msg1, "CSV-Import", Default)
If Dateipfad = False Or RngImport = "" Then
MsgBox Msg2, vbExclamation, "CSV-Import": Exit Sub
End If
Application.ScreenUpdating = False
ActiveSheet.Cells.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Dateipfad, Destination:=Range(RngImport))
.AdjustColumnWidth = True 'Spaltenbreite automatisch anpassen True/False
.TextFilePlatform = 1252
.TextFileTextQualifier = xlTextQualifierNone
.TextFileParseType = xlDelimited
.TextFileOtherDelimiter = Chr(1)
.Refresh BackgroundQuery:=False
.Delete
End With
Application.ScreenUpdating = True
End Sub
[edit] Code komplett geändert am 03.12 [/edit]
Der Import-Bereich wird nun per InputBox abgefragt und als Dateiformat wird *.CSV genommen.
Hinsichtlich von QueryTables sei noch zu erwähnen, dass QueryTable (Add) bei jedem Import eine Abfrage speichert. Wenn Du in Deine Excel-Datei z.B. 1000 mal immer die gleiche Datei mit gleichem Inhalt importierst, wird die Excel-Datei wundersamer Weise mit jeder Abfrage größer und größer. Im QueryTable-Code habe ich bereits einen Löschbefehl mit eingebunden, der aber nur die aktuelle Abfrage löscht. Ob Abfragen gespeichert sind, kannst Du sehen, wenn Du in Deinem Import-Sheet in Zelle C7 einen Rechtsklick machst und dort das rote Ausrufezeichen mit dem Text "Daten aktualisieren" steht.
Wenn dem so ist, dann kannst Du mit diesem Code alle Abfragen im aktiven Arbeitsblatt löschen:
Private Sub QueryTablesDelete()
Dim QT As QueryTable
For Each QT In ActiveSheet.QueryTables: QT.Delete: Next
End Sub
Ausserdem wäre es sinnvoll, falls die Möglichkeit dazu besteht, eine komplett neue Excel-Datei zu erstellen. Eventuell ist Deine Excel-Datei durch die Code-Veränderungen und unzähligen QueryTables-Abfragen sehr stark fragmentiert (wundersame Dateigröße?).
Hallo Viktor!
Dein Beispiel mit den chaotischen DoppelQuote-Strings hättest Du auch etwas früher posten können
Bleibt jetzt noch die Frage zu klären, ob Du jetzt immer nur eine Spalte oder mehrere Spalten importierst/exportierst?
Wenn es mehrere Spalten sind, dann musst Du ein Trennzeichen wählen, dass nicht in den Zellen vorkommt oder eine feste Spaltenbreite vorgeben (max Anzahl Zeichen) . Soll grundsätzlich nur in Spalte C kopiert werden und sind in anderen Spalten ein Inhalt der erhalten bleiben soll/muss???
Gruß Dieter
Dein Beispiel mit den chaotischen DoppelQuote-Strings hättest Du auch etwas früher posten können
Bleibt jetzt noch die Frage zu klären, ob Du jetzt immer nur eine Spalte oder mehrere Spalten importierst/exportierst?
Wenn es mehrere Spalten sind, dann musst Du ein Trennzeichen wählen, dass nicht in den Zellen vorkommt oder eine feste Spaltenbreite vorgeben (max Anzahl Zeichen) . Soll grundsätzlich nur in Spalte C kopiert werden und sind in anderen Spalten ein Inhalt der erhalten bleiben soll/muss???
Gruß Dieter
Hallo Viktor!
Sie oben, die Codes wurden komplett geändert und sollten Deinen Wünschen jetzt entsprechen.
Und das nächste mal bitte präzise formulieren und einen nicht mit etwaiigen Codes total verwirren
Gruß Dieter
Sie oben, die Codes wurden komplett geändert und sollten Deinen Wünschen jetzt entsprechen.
Und das nächste mal bitte präzise formulieren und einen nicht mit etwaiigen Codes total verwirren
Gruß Dieter
Hallo Viktor!
Ich glaub mich tritt ein Pferd
Das geht leider nicht, weil QueryTable nur 1 Zeichen akzeptiert.
Öffne mal eine leere Excel-Datei und gehe auf <Einfügen><Symbol> da wird eine Zeichentabelle angezeigt. In dem Feld unten rechts wählst Du <ASCII(Hex)>, dann blätterst Du mal gegen Ende der Tabelle durch und sieh nach ob da vielleicht ein Zeichen dabei ist, dass nicht in Deinen Strings vorkommen könnte.
Wenn Du eins gefunden hast, dann ersetze im Export-Code Zeile 38 Chr(1) gegen Chr(&HZeichencode) z.B. 00B6 = Chr(&HB6) aus und im Import-Code in Zeile 26 machst Du das gleiche in grün.
Gruß Dieter
PS. Der Code ist so geschrieben, dass auch mehrere Spalten exportiert/importiert werden, damit auch andere etwas damit anfangen können und solltest Du nichts finden, dann ändere ich das ganze so, dass nur eine Spalte exportiert/imporiert wird, wenns tatsächlich immer nur eine Spalte sein soll.
Ich glaub mich tritt ein Pferd
Das geht leider nicht, weil QueryTable nur 1 Zeichen akzeptiert.
Öffne mal eine leere Excel-Datei und gehe auf <Einfügen><Symbol> da wird eine Zeichentabelle angezeigt. In dem Feld unten rechts wählst Du <ASCII(Hex)>, dann blätterst Du mal gegen Ende der Tabelle durch und sieh nach ob da vielleicht ein Zeichen dabei ist, dass nicht in Deinen Strings vorkommen könnte.
Wenn Du eins gefunden hast, dann ersetze im Export-Code Zeile 38 Chr(1) gegen Chr(&HZeichencode) z.B. 00B6 = Chr(&HB6) aus und im Import-Code in Zeile 26 machst Du das gleiche in grün.
Gruß Dieter
PS. Der Code ist so geschrieben, dass auch mehrere Spalten exportiert/importiert werden, damit auch andere etwas damit anfangen können und solltest Du nichts finden, dann ändere ich das ganze so, dass nur eine Spalte exportiert/imporiert wird, wenns tatsächlich immer nur eine Spalte sein soll.
Hallo Viktor!
Gottseidank
Der Standardwert aller Delimiter ist False. Du musst diese also Code nicht nochmal auf False setzen.
Gruß Dieter
Gottseidank
Der Standardwert aller Delimiter ist False. Du musst diese also Code nicht nochmal auf False setzen.
Gruß Dieter
Hallo Viktor!
Na, Du bist mir vielleicht ein Scherzkeks
Natürlich alle Zeilen Aber ich kann mir beim besten Willen nicht vorstellen, dass Deine Text-Strings ein CHR(1)-Zeichen beinhalten, weil es eben nun mal kein ASCII-Zeichen ist.
Wenn ich die Zeit dazu habe, werde ich noch was anderes und einfacheres coden, was dann aber nur 1 Spalte exportiert und importiert.
Gruß Dieter
Na, Du bist mir vielleicht ein Scherzkeks
Natürlich alle Zeilen Aber ich kann mir beim besten Willen nicht vorstellen, dass Deine Text-Strings ein CHR(1)-Zeichen beinhalten, weil es eben nun mal kein ASCII-Zeichen ist.
Wenn ich die Zeit dazu habe, werde ich noch was anderes und einfacheres coden, was dann aber nur 1 Spalte exportiert und importiert.
Gruß Dieter
Hallo Viktor!
Hier eine einfachere Export/Import-Funktion im Format *.Txt In der Hoffnung, dass es nicht nur bei mir funktioniert?
Export:
Import:
Die Letzte Zeile mit Inhalt in Spalte C wird automatisch ermittelt.
Gruß Dieter
Hier eine einfachere Export/Import-Funktion im Format *.Txt In der Hoffnung, dass es nicht nur bei mir funktioniert?
Export:
Option Explicit
Const Zeile1 = 7
Const Spalte = "C"
Const Msg1 = "Bitte den kompletten Dateipfad angeben:"
Const Msg2 = "Es wurde keine Datei angegeben!"
Const Msg3 = "Der Exportvorgang ist abgeschlossen!"
Private Sub Export_Click()
Dim Fso As Object, File As Object, Zelle As Range, Text As String
Dim Dateipfad As String, Mappepfad As String, EndLine As Long
Mappepfad = ThisWorkbook.FullName
Mappepfad = Replace(Mappepfad, ".xls", ".txt")
Dateipfad = InputBox(Msg1, "Text-Export", Mappepfad)
If Dateipfad = "" Then MsgBox Msg2, vbExclamation, "Text-Export": Exit Sub
Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.CreateTextFile(Dateipfad)
EndLine = Cells(Cells.Rows.Count, Spalte).End(xlUp).Row
For Each Zelle In Range(Cells(Zeile1, Spalte), Cells(EndLine, Spalte))
File.WriteLine Zelle.Text
Next
File.Close: Set Fso = Nothing
MsgBox Msg3, vbInformation, "Text-Export"
End Sub
Option Explicit
Const Zeile1 = 7
Const Spalte = "C"
Const Msg = "Es wurde keine Datei angegeben!"
Private Sub Import_Click()
Dim Fso As Object, File As Object, Dateipfad As Variant, Zeile As Long
Dateipfad = Application.GetOpenFilename("Text (*.txt),*.txt")
If Dateipfad = False Then
MsgBox Msg, vbExclamation, "Text-Import": Exit Sub
End If
Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.OpenTextFile(Dateipfad)
Zeile = Zeile1
ActiveSheet.Columns(Spalte).Cells.ClearContents
Application.ScreenUpdating = False
Do Until File.AtEndOfStream
Cells(Zeile, Spalte) = File.ReadLine: Zeile = Zeile + 1
Loop
Application.ScreenUpdating = True
File.Close: Set Fso = Nothing
End Sub
Gruß Dieter
Hallo Viktor!
Gruß Dieter
Zitat von @ffmboy:
Ich danke dir für deine komplette Mühe !!
hast mir sehr sehr viel geholfen!!
Mindestens Platin Medallie
Na, dann bin ich auch zufrieden und vielen Dank für die Medallie. Und gleich in PlatinIch danke dir für deine komplette Mühe !!
hast mir sehr sehr viel geholfen!!
Mindestens Platin Medallie
Gruß Dieter