ffmboy
Goto Top

Suchen-Ersetzen EXCEL Makro?

Hi !!

Hab folgendes Problem!

Ich habe 2Sheets in einer Mappe: Sheet1 und Sheet2


826e0a8014ec7cff0a0dc57cfefde706-bild2


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!
Kommentar vom Moderator Biber am Dec 01, 2009 um 17:33:09 Uhr
Für diese IT-typische Formulierung, gepostet am 1.12.2009
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....

Vor allem, weil ich bei dieser Einleitung immer schon den Folgesatz erahne...

Content-Key: 130053

Url: https://administrator.de/contentid/130053

Printed on: April 19, 2024 at 00:04 o'clock

Member: justdoit
justdoit Nov 23, 2009 at 15:13:08 (UTC)
Goto Top
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
Member: ffmboy
ffmboy Nov 23, 2009 at 15:19:40 (UTC)
Goto Top
also das war jezt nur ein beispiel gewesen mit den namen!

1.) es ist so dass jeder name(zeichenfolge) nur einmal vorkommt!

2.) die reihenfolge stimmt nicht

3.) muss mit excel geschehen!

Danke für deine hilfe
Gruß
ffmboy
Member: justdoit
justdoit Nov 23, 2009 at 15:58:55 (UTC)
Goto Top
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
Mitglied: 76109
76109 Nov 23, 2009 at 17:34:37 (UTC)
Goto Top
Hallo ffmboy!

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 anpassenface-wink

Gruß Dieter
Member: ffmboy
ffmboy Nov 24, 2009 at 12:37:01 (UTC)
Goto Top
Kann mir mal einer kurz erklären was in der 12 und 14 zeile passiert???

12. For Each c In Wks2.Range("C3:C" & Wks2.Cells(Wks2.Rows.Count, "C").End(xlUp).Row)

14. Set d = Wks1.Columns("B").Find(c, LookIn:=xlValues, LookAt:=xlWhole)

der debugger stoppt da das makro!!

kann es daran leigen dass ich eine click() schaltfläche dafür benutze? ich muss auch in anderen macro codes immer ein "ActiveSheet" vor Range setzen wenn ich zellen markieren möchte!!


Bin zwar kein Programmier Typ aber irgendwie fehlt mir in dem Code die sache mit dem ersetzen im sheet1??????
Mitglied: 76109
76109 Nov 24, 2009 at 14:55:59 (UTC)
Goto Top
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
Member: ffmboy
ffmboy Nov 24, 2009 at 15:42:58 (UTC)
Goto Top
Also als erstes möchte ich dir danken für deine lösung hab es im ersten beitrag vergessen :

ich habe für zeile 4 und 5 folgendes geändert:

Const Sheet1 = "Mein_Sheet_1_Name"
Const Sheet2 = "Mein_Sheet_2_Name"

ansonsten habe ich alles gelassen

das makro schreibt aber in sheet1 spalte d (nein rein) und zwar überall ein nein!!
Member: ffmboy
ffmboy Nov 24, 2009 at 15:49:10 (UTC)
Goto Top
also ich muss dazu noch was sagen! also die beschreibung des problems war nur als beispiel!

Hab mehrere sheets in der mappe und es werden noch einige dazwischen kommen!
könnte man das beispiel verallgemeinern so dass ich dann nur die Namen der Sheets eintrage????
Member: ffmboy
ffmboy Nov 24, 2009 at 16:06:30 (UTC)
Goto Top
ok du hast recht bei mir funktioniert es auch an dem beispiel wie ich es vorhin erläutert habe versuche es morgen zu modifizieren so dass es bei meiner richtigen mappe es klappt!
das prinzip ist das selbe

nur das Sheet1 dort (sheet2 ist und "Anders_Heißt1")
und das Sheet2 vorläufig (Sheet4 ist und "Anders_heißt2")
Mitglied: 76109
76109 Nov 24, 2009 at 16:10:17 (UTC)
Goto Top
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.

Gruß Dieter
Mitglied: 76109
76109 Nov 24, 2009 at 16:35:29 (UTC)
Goto Top
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 Gedankeface-smile

Gruß Dieter
Member: ffmboy
ffmboy Nov 25, 2009 at 07:45:39 (UTC)
Goto Top
ist es möglich das makro so anzupassen dass es nicht unbedingt sheet1 und sheet2 sein müssen??

also das ich es so modifizieren kann dass es nicht unbedingt blatt1 und blatt2 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!!
'
*
kannst du mir vielelicht sagen welche parameter/ constante/variablen ich in deinem code wie anpassen muss um das makro nach meinen belieben zu ändern!!

ich hoffe ich hab mich verständlich ausgedruckt!
möchte einfach einen variablen code haben weil es sein kann das ich noch zwischen die Tabellen neue tabellen einfügen müsste!!

Aber an sich ist dein MACRO genau das was ich meinte!!

Gruß ffmboy
Mitglied: 76109
76109 Nov 25, 2009 at 08:03:39 (UTC)
Goto Top
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?
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?
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?

Für den Fall, dass sich imer nur 2 Tabellennamen ändern, wäre es wohl am einfachsten, die Sheetnamen per InputBox abzufragen.

Gruß Dieter
Member: ffmboy
ffmboy Nov 25, 2009 at 10:20:08 (UTC)
Goto Top
Member: ffmboy
ffmboy Nov 25, 2009 at 10:37:41 (UTC)
Goto Top
OHHHH man sorry ich hatte einen dummen fehler drinn gehabt!!!

Funktioniert alles super was du gemacht hast!!!

Jetzt verstehe ich auch warum du mich nicht verstanden hast!!!

Sorry und danke nochmals!!

Gruß ffmboy
Member: ffmboy
ffmboy Nov 25, 2009 at 10:55:18 (UTC)
Goto Top
hi hab noch 2 Fragen??

Kann man das suchen und ersetzen so ändern dass es die zellen danach durchsucht und ersetzt auch wenn dabei noch was anderes steht:
zb so:

Sheet1

Namen:
Dicker bernd
dünner wolfgand

Sheet2 :bleibt so erhalten

und nach dem makro:

Sheet1

namen:
Dicker uwe
dünner willy


also das er nur den inhalt überschreibt nach dem gesucht wurde alles andere bleibt stehen??

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???

Danke
MfG
ffmboy
Mitglied: 76109
76109 Nov 25, 2009 at 11:21:04 (UTC)
Goto Top
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.
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.

Gruß Dieter
Member: ffmboy
ffmboy Nov 25, 2009 at 12:33:17 (UTC)
Goto Top
ja der name würde nur einmal vorkommen.!

Könnte ich dann die gefilterten werte in einer andere tabelle verknüpfen.

Dort die daten ersetzen (so dass es in den ursprungszellen) auch die änderung wirkt!

Dann den Filter Ausschalten, und somit meine ursprünglichen dateiinhalt mit geänderten namen haben!!!
Mitglied: 76109
76109 Nov 25, 2009 at 15:00:35 (UTC)
Goto Top
Hallo ffmboy!

Sorry, aber irgendwie kann ich Dir nicht mehr ganz folgenface-wink

Gruß Dieter
Member: ffmboy
ffmboy Nov 25, 2009 at 15:48:08 (UTC)
Goto Top
Zitat von @76109:
> 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.

Was müsste ich denn ändern damit es geht???

> 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.

Gruß Dieter


Du hast ja geschrieben das gefilterte werte nicht durchsucht werden könnten!!

da hab ich mir gedacht das ich eine datei (in excel schon importiert ca. 60000 zeilen)
nach bestimmten namen filter! (bleiben so ca 2000 zellen übrig)

diese gefilterte werte würde ich gerne mit dem macro (Was du geschrieben hast) absuchen/und ersetzen lassen!!!

Da es aber mit gefilterten nicht geht : würde ich diese gerne in einer anderen tabelle verknüpfen dort das macro die werte ändern lassen und somit auch die werte in sheet1 ändern????
geht sowas überhaupt ?????


Ach vergiss es das mit dem verknüpfen und dort ändern bringt nix hab es gerade ausprobiert!!
Mitglied: 76109
76109 Nov 25, 2009 at 16:20:59 (UTC)
Goto Top
Hallo ffmboy!

Also, was die Such/Ersetzen-Funktion bei Filterung angeht, muss ich mich zunächst korrigierenface-wink.

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
Mitglied: 76109
76109 Nov 25, 2009 at 16:44:31 (UTC)
Goto Top
Hallo ffmboy!

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
Member: ffmboy
ffmboy Nov 26, 2009 at 09:36:03 (UTC)
Goto Top
das mit der zeile 14 hab ich mir schon gedacht das man da am ende was ändern muss hab nur zurzeit kein gutes Buch zurhand um da nachzuschauen.

Whole hat ja ganze zelle bedeutet und part heißt wohl das es ein teil sein soll!!

Die 18 hab ich jetzt auch verstanden !!

Danke dir Das funktioniert einwandfrei sogar für das gefilterte zeug!!!

Also bei mir war folgendes!!!

1:Datei importieren (datei hatte in sheet (ersetzen) dann ca 60000 zeilen

2:In sheet(ersetzen) habe ich einen filter eingebaut nach bestimmten muster die zellen gefiltert hat wo die namen stehen
(der filter war notwendig weil die namen in der datei(sheet ersetzen) auch wo anders stehen dort sollten sie aber nicht geändert werden)

3: eine tabelle (Sheet suchen) wird importiert wo die namen: Neu und alt nebeneinander schon stehen!

4: dass sollte das makro was du geschrieben hast die namen ersetzen (im sheet ersetzen)

5: Filter ausschalten

6: Datei unter anderem namen speichern und das wars!!!

also Super vielen dank nochmals!!

Gruß Viktor
Mitglied: 76109
76109 Nov 26, 2009 at 10:43:10 (UTC)
Goto Top
Hallo Viktor!

Zitat von @ffmboy:
Whole hat ja ganze zelle bedeutet und part heißt wohl das es ein teil sein soll!!
Das ist korrektface-wink

Jetzt habe ich endlich auch verstanden, was Du genau machst und das es funktioniert, freut michface-smile

Gruß Dieter
Member: ffmboy
ffmboy Nov 26, 2009 at 11:13:04 (UTC)
Goto Top
eine frage hab ich noch und zwar wo finde ich denn eine gute beschreibung wie ich einen berreich in einem sheet als txt exportieren kann

ich denke mal das es über GetSaveFilename oder so ähnlich geht !!

würde gerne das Thema in vba dazu kennen um irgendwie danach zu stöbern! um mir das makro aufzubauen!

Sollte einfach nur einen berreich in einem sheet speichern können, der pfad, der dateiname und die dateiendung sollte ich selber auswählen(bzw bestimmen) können!

was ich nicht verstehe warum bei mir in der Symbolleiste Liste die fläche XML-Daten Exportieren nicht funktioniert??????
wollte es über ein makro aufzeichnen????
Mitglied: 76109
76109 Nov 26, 2009 at 16:07:41 (UTC)
Goto Top
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:
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
Member: ffmboy
ffmboy Dec 01, 2009, updated at Oct 18, 2012 at 16:40:10 (UTC)
Goto Top
Danke Dieter !

hab das mit dem speichern der datei gelöst problem ist dass beim speichern die meißten semikolon wegbleiben!!
Jetzt hab ich gemerkt das die semikolon schon beim hereinladen des dateiinhaltes in excel vernachlässigt werden!!

unter folgendem link ist das gesamte thema:
Dort unten ist auch mein jetziger code würde gerne wissen wie man eine Text Datei ins excel importiert so dass alle zeichen semikolon, sternchen, etc.. also die komplette text datei zeile für zeile importiert wird und kein zecihen weggelassen wird??

datei import ins aktive sheet per Makro

danke
Gruß Viktor
Member: ffmboy
ffmboy Dec 01, 2009 at 09:23:19 (UTC)
Goto Top
Also zum Export der datei hab ich mir das makro hier angepasst funktioniert eigentlich super:


Private Sub Export_to_New_A2L_File_Click()
        
Dim Bereich As Object, Zeile As Object, Zelle As Object
Dim strTemp As String
Dim strDateiname As String
Dim strTrennzeichen As String
Dim strMappenpfad As String

strMappenpfad = ActiveWorkbook.FullName
strMappenpfad = Replace(strMappenpfad, ".xls", ".txt")  

strDateiname = InputBox("Wie soll die TXT-Datei heißen (inkl. Pfad)?", "CSV-Export", strMappenpfad)  
If strDateiname = "" Then Exit Sub  

strTrennzeichen = InputBox("Welches Trennzeichen soll verwendet werden?", "CSV-Export", ",")  
If strTrennzeichen = "" Then Exit Sub  

Set Bereich = ActiveSheet.Range("C7:C55416")  

Open strDateiname For Output As #1

For Each Zeile In Bereich.Rows
For Each Zelle In Zeile.Cells
If InStr(1, Zelle.Text, strTrennzeichen) > 0 Then

'Zellen, die ein Trennzeichen beinhalten in Anführungsstriche setzen  

strTemp = strTemp & """" & CStr(Zelle.Text) & """" & strTrennzeichen  
Else
strTemp = strTemp & CStr(Zelle.Text) & strTrennzeichen
End If
Next
If Right(strTemp, 1) = strTrennzeichen Then strTemp = Left(strTemp, Len(strTemp) - 1)
Print #1, strTemp
strTemp = ""  
Next

Close #1
Set Bereich = Nothing
MsgBox "Datei wurde exportiert nach" & vbCrLf & strDateiname  


exportiert die datei auch so wie sie im Sheet steht mit allen semikolon und so wieter das problem liegt jetzt beim import der datei wie ich ja einen beitrag höher beschrieben habe wenn ich es schaffa die datei so zu laden wie sie ist sollte dieses makro die datei auch so speichern (nur halt mit geänderten namen)


[Edit Biber] Codetags nachgetragen. Aber ich habe auch statt dessen das Löschen des Kommentars erwogen. face-wink
@ffmboy: beim nächsten Mal ohne Codetags... [/Edit]
Mitglied: 76109
76109 Dec 01, 2009 at 17:18:52 (UTC)
Goto Top
Hallo Viktor!

Oha, dass scheint ja ein endloser Thread zu werdenface-smile

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 gesetztface-wink

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>
Dann siehst Du die umfangreichen FileSystemObject-Funktionen in den den Klassen <FileSystemObject> und <TextStream>

Code-Beispiel:
Dim Fso As New FileSystemObject, File As TextStream
Set File = Fso.OpenTextFile(...)
CSV-Export mit Nicht-Ascii-Zeichen Chr(1) als Trennzeichen:
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
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.
Mitglied: 76109
76109 Dec 01, 2009 at 21:40:24 (UTC)
Goto Top
Hallo Viktor!

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
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:
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?).
Member: ffmboy
ffmboy Dec 02, 2009 at 09:31:26 (UTC)
Goto Top
Hi danke für die Mühe aber das Funktioniert auch net so wie ich das möchte!!


Also ich möchte eine Datei so könnte der inhalt aussehen:

"blablabla "
"/blublublublu """" "
" "
" /qöleikbqvöeqiuvbeql """" "
" "
" /wödkcf bwlczqwblciub "
" "
" "
" /*/ "
" /* wcdlhwcflqwieucbwc */ "
" /*/ "


usw...........
das Macro soll eonfach zeile für zeile in excel einfügen(Importieren) heißt:
"blablabla " steht in C7
"/blublublublu """" " steht in C8
" " steht in C9
" /qöleikbqvöeqiuvbeql """" " steht in C10
" " steht in C11
" /wödkcf bwlczqwblciub " steht in C12
" " steht in C13
" " steht in C14
" /*/ " steht in C15
" /* wcdlhwcflqwieucbwc */ " steht in C16
" /*/ " steht in C17

usw....

es ist mir wurscht ob es als text, string, und sonst was importiert wird hauptsache es steht zeichen für zeichen richtig in der jewaligen zelle!
Es sind auch nicht in jeder zeile der datei semikolon gesetzt diese text datei hat keine besondere struktur ist aber sau lang um die 65000 zeilen
Und natürlich sollte ich die zellen danach in excel bearbeiten können und dann wieder so exportieren wie sie in excel steht ohne hinzufügen von semikolon und sonst welchen zeichen bzw. leerzeichen!!!
Member: ffmboy
ffmboy Dec 02, 2009 at 09:59:35 (UTC)
Goto Top
Sub Makro9()

    ChDir "C:\Documents and Settings\My Documents\EXCEL\tests"  
    Workbooks.OpenText Filename:= _
        "C:\Documents and Settings\uidt1377\My Documents\EXCEL\tests\test.txt", _  
        Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone _
        , ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:= _
        False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
    Columns("A:A").EntireColumn.AutoFit  
End Sub

dieses macro hab ich aufgezeichnet ! Es fügt die datei genau so ein wie ich das möchte nur ist der pfad der datei in dem macro fest wie änder ich ihn um selber nach der datei zu suchen (bzw. die datei selber auswählen)?
Und das er mir den inhalt nicht in eine neue mappe schreibt sondern ins activesheet (oder durch angabe eines sheet-namen) ab der zelle C7 einfügt
Mitglied: 76109
76109 Dec 02, 2009 at 14:17:14 (UTC)
Goto Top
Hallo Viktor!

Dein Beispiel mit den chaotischen DoppelQuote-Strings hättest Du auch etwas früher posten könnenface-wink

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
Member: ffmboy
ffmboy Dec 03, 2009 at 12:44:30 (UTC)
Goto Top
Hi Dieter!

Also es soll ab spalte C nach unten eingefügt werden also dass es dann C60000 ende ist (nur beispiel) sind so ca 57000 zeilen in der text datei!!
In dem sheet wo es importiert werden soll gibts keinen weiteren inhalt!!

Ich weiß garnicht was für ein trennzeichen ich wählen soll??
Warum importiert das macro was ich aufgezeichnet habe ohne angabe von trennzeichen?
Könnte man diese delimiter usw... einstellungen für andere import funktionen benutzen??

boahh hab am anfang garnicht dran gedacht dass excel diese trennzeichen usw.. benötigt dachte wenn ich eine datei importiere er mir diese auch so importiert wie sie auch geschrieben steht zeile für zeile!!

Hab jetzt bei deinem code für import zb.. 6 aufeinanderfolgende kommas als trennzeichen eingesetzt das funktioniert doch er läßt die semikolon raus!!!
Mitglied: 76109
76109 Dec 03, 2009 at 12:51:26 (UTC)
Goto Top
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 verwirrenface-smile

Gruß Dieter
Member: ffmboy
ffmboy Dec 03, 2009 at 13:36:12 (UTC)
Goto Top
Hi Dieter!

Also ob du es mir glaubst oder nicht es funktioniert zu 99%

zb: in der zeile 60 in der text datei steht folgender text:

" ksjdcasdkuz" ladfvflkvkf" "ödfvjdavnöfo"

dann importiert mir das macro :
" ksjdcasdkuz" ladfvflkvkf" in C67 und "ödfvjdavnöfo" in D67

also nach einem tab wechselt er die spalten !

Wo kann ich denn in deinem code die angabe der trennzeichen ändern zb 6 kommas als beispiel!!!!
oder tabulator als trennzeichen auch ausschalten!!

Sorry ich weiß das nervt aber ich hab selber langsam keine nerven mehr dafür hätte nie gedacht das einfaches importieren so viel hickhack erfordert!!!face-smile
Mitglied: 76109
76109 Dec 03, 2009 at 14:15:19 (UTC)
Goto Top
Hallo Viktor!

Ich glaub mich tritt ein Pferdface-smile

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.
Member: ffmboy
ffmboy Dec 03, 2009 at 14:38:43 (UTC)
Goto Top
Hi Dieter!

Nach einigen grauen Haaren und kaputten Nerven hab ich es geschafft das ganze so zu verbinden dass es jetzt klappt!!
Hoffentlich muss nur noch den test machen was verändern wieder exportieren und die neue mit der alten textdatei mit beyound compare vergleichen sollte mir dann ja nur die paar zeilen anzeigen wo ich auch was geändert habe!!
Hier ist der Vollständige code hab von deinem nur ein paar zeilen übernommen:


Private Sub Search_and_Import_Whole_TXT_File_Click()

Dim datei1$

Application.ScreenUpdating = False
datei1 = Application.GetOpenFilename("TXT-Datei (*.txt),*.txt")  
If CStr(datei1) = CStr(False) Then
    MsgBox "Sie haben keine Datei ausgewählt!", 48, "No File selected"  
    Exit Sub
End If
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & datei1, _  
Destination:=Range("C7"))  
.TextFilePlatform = 1252
.TextFileTextQualifier = xlTextQualifierNone
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = Chr(1)
.Refresh BackgroundQuery:=False

End With

Sheets("TXT_File_Import").Columns("C:C").ColumnWidth = 160  

End Sub

hatte vorher die 2 zeilen nicht gehabt
 .TextFilePlatform = 1252
.TextFileTextQualifier = xlTextQualifierNone

und in dieser zeile = False stehen gehabt deswegen hat er mir ständig nach einem Großen F die spaltentrennung vollzogen
.TextFileOtherDelimiter = Chr(1)

Also nochmals Vielen Vielen Dank für deine Mühe und Hilfe

Gruß
Viktor
Mitglied: 76109
76109 Dec 03, 2009 at 14:53:08 (UTC)
Goto Top
Hallo Viktor!

Gottseidankface-smile

Der Standardwert aller Delimiter ist False. Du musst diese also Code nicht nochmal auf False setzen.

Gruß Dieter
Member: ffmboy
ffmboy Dec 03, 2009 at 15:02:57 (UTC)
Goto Top
Zitat von @76109:
Hallo Viktor!

Ich glaub mich tritt ein Pferdface-smile

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 mehrere Spalten
exportiert/importiert werden 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 Dieter!
Meinst du jetzt zeile für zeile bis zur dateiende importiert bzw. exportiert wird oder nur eine zeile und das wars??
Falls es zeile für zeile bis zum ende wäre das besser für mich! sowohl import als auch export möchte nämlich nicht von zeichen abhängig sein!
Ich hab zwar ein Zeichen gefunden ~ die heilige welle wird nirgends gebraucht!! Gott sei dank!!!
Gruß
Viktor
Member: ffmboy
ffmboy Dec 03, 2009 at 15:04:14 (UTC)
Goto Top
Hi
Hab dir oben in deinem letzten Beitrag ein Zitat reingeschrieben!!
Mitglied: 76109
76109 Dec 03, 2009 at 16:16:30 (UTC)
Goto Top
Hallo Viktor!

Na, Du bist mir vielleicht ein Scherzkeksface-smile

Natürlich alle Zeilenface-wink 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
Mitglied: 76109
76109 Dec 03, 2009 at 23:09:33 (UTC)
Goto Top
Hallo Viktor!

Hier eine einfachere Export/Import-Funktion im Format *.Txtface-wink 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
Import:
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
Die Letzte Zeile mit Inhalt in Spalte C wird automatisch ermittelt.

Gruß Dieter
Member: ffmboy
ffmboy Dec 10, 2009 at 10:26:52 (UTC)
Goto Top
Ich danke dir für deine komplette Mühe !!
hast mir sehr sehr viel geholfen!!
Mindestens Platin Medallie

Gruß Viktor
Mitglied: 76109
76109 Dec 10, 2009 at 12:26:51 (UTC)
Goto Top
Hallo Viktor!

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 Platinface-smile

Gruß Dieter