Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Datei Bearbeiten

Betrifft: Datei Bearbeiten von: Pete
Geschrieben am: 31.07.2014 22:17:33

Hey Leute,

ich stehe vor einem kleinen Problem. Und zwar möchte ich über ein Makro eine Datei öffnen (Text Inhalt) und in bestimmten Zeilen an bestimmten Stellen Inhalt ändern. Ich habe den allgemeinen Ansatz um eine Datei zu öffnen und Inhalt anzuhängen, aber wie kann ich die Zeile und die Stelle beeinflussen?

Hier mein Ansatz:

Sub editFile()
    Dim strPath As String
    Dim intFile As Integer
    
    strPath = "D:\excel\datei.py"
    intFile = FreeFile
    
    Open strPath For Append As #intFile
    Write #intFile, "Hello World"


    Close #intFile
End Sub

  

Betrifft: AW: Datei Bearbeiten von: Oberschlumpf
Geschrieben am: 01.08.2014 06:37:13

Hi Pete

Dein Ansatz öffnet nur eine Datei, um zusätzliche Einträge anzuhängen; ändern kannst du mit dem Code in der Datei nix.

Du musst die bestehende Datei erst mal öffnen und sie zeilenweise einlesen.
Direkt im nächsten Schritt öffnest du eine "Dummy"-Datei, die alle alten + neuen Zeilen aufnimmt.
Dann musst du direkt nach dem Einlesen einer Zeile prüfen, ob diese Zeile den Inhalt enthält, den du ändern willst.
Wenn ändern = nein, dann die alte Zeile in die dummy-datei schreiben.
Wenn ändern = ja, dann Textstelle in Zeile ändern, dann neue Zeile in dummy-datei schreiben.
Wenn alles fertig, dann alte Originaldatei löschen, dummy-Datei in Namen der Originaldatei umbenennen.
Das könnte so aussehen (ungetestet)

Sub AltNeu()

    Dim lstrZeile As String
    
    Open "D:\excel\datei.py" For Input As #1
    Open "D:\excel\dummy.txt" For Output As #1
        Do While Not EOF(1)
            Line Input #1, lstrZeile
                If InStr(lstrZeile, "Suchtext") > 0 Then
                        lstrZeile = Replace(lstrZeile, "Suchtext", "NeuerText")
                        Print #2, lstrZeile
                    Else
                        Print #2, lstrZeile
                End If
        Loop
    Close
    
    Kill "D:\excel\datei.py"
    Name "D:\excel\dummy.txt" As "D:\excel\datei.py"
    
End Sub

Hilfts?
Wenn nich, dann zeig bitte ne Bsp-Datei + erklär genau, welcher Textteil wird gesucht, in was soll er geändert werden?

Ciao
Thorsten


  

Betrifft: Fehler... von: Oberschlumpf
Geschrieben am: 01.08.2014 06:40:46

Hi Pete

is noch zu früh für mich :-)

ändere diese Zeile

Open "D:\excel\dummy.txt" For Output As #1

um in diese Zeile
Open "D:\excel\dummy.txt" For Output As #2
Ciao
Thorsten


  

Betrifft: AW: Fehler... von: Pete
Geschrieben am: 01.08.2014 13:04:36

Hey Thorsten,

dein Beispiel klappt schon mal bestens, vielen Dank. Diesen Ansatz hatte ich auch schon im Web gefunden, aber nicht so ganz verstanden, jetzt bin ich schlauer :). Nur bei meinem Beispiel wird das etwas schwierig, denn so kann ich ja nur zu suchenden Text ersetzen, sprich wenn ich den gleichen String mehrmals habe, dann funktioniert das nicht. Oder habe ich da was falsch verstanden?

Hier mal meine Beispieldatei:

db = {
'test': 'ip',
'user': 'username',
'password": 'longpasswort',
'database": 'databasename'
}

Jetzt möchte ich genau den Text 'ip' ersetzen, mit z.B. einer IP wie '192.168.0.1'. Benutze ich dein Skript, muss ich nach 'ip' suchen und es ersetzenn. Will ich aber nochmals ersetzen ist ja kein 'ip' mehr da, sondern '192.168.0.1'. Theoretisch könnte ich den neuen Eintrag in eine Variable zwischenspeichern und beim erneuten ersetzen explizit immer nach dem zuletzt gemachten Eintrag suchen ... Aber gibt es da nicht eine einfachere Lösung???

Vielen Dank für Feedback! :)


  

Betrifft: AW: Fehler... von: Oberschlumpf
Geschrieben am: 01.08.2014 13:26:11

Hi Pete,

In deinem Beispiel kommt 'test': doch nur einmal vor, oder?

Dann such doch die Zeile, in der 'test': vorkommt, und ersetz die GANZE Zeile (inkl. alte Ip-adr) durch 'test':, gefolgt von neuer IP.

BspCode:

If Instr(lstrInhalt,"'test':") > 0 Then
    lstrInhalt = "'test':" & neueIP
End If
Mit Bsp-Datei mein ich NICHT Bsp-Text in der Antwort...nur zur Info!

Hilfts denn?

Ciao
Thorsten


  

Betrifft: AW: Fehler... von: Pete
Geschrieben am: 01.08.2014 13:32:19

Hi Thorsten,

nein 'test' würde mehrmals vorkommen, das war nur ein Ausschnitt, aber das kann ich damit lösen, dass ich 'test1', 'test2' vergebe. Nur kann ich auch explizit in bestimmte Zeilen Springen und diese ersetzen? In meiner Beispieldatei gibt es auch folgendes:

statustates = [
'inactive',
'inactive',
'inactive',
]

Und dabei kann ich den Inhalt nicht ändern. Wie kann ich also gezielt das zweite 'inactive' durch 'active' ersetzen?


  

Betrifft: AW: Fehler... von: Oberschlumpf
Geschrieben am: 01.08.2014 14:14:28

so Pete

es reicht!

entweder du ZEIGST mir eine Bsp-DATEI PER UPLOAD, oder ich helfe nicht weiter!
Und ich meine NICHT ne txt-Datei mit 3 oder 4 Zeilen, sondern es müssen ALLE Zeilen vorhanden sein, die erforderlich sind, dein Problem zu verstehen.

Und wenn du Originaldaten nicht zeigen darfst, dann ersetz sie durch Bsp-Daten - Hauptsache, die Struktur bleibt erhalten.

Und wenn du nicht weißt, wie man eine txt-Datei hier per Upload zur Verfügung stellt, dann lern es!

Ciao
Thorsten


  

Betrifft: AW: Fehler... von: Pete
Geschrieben am: 02.08.2014 10:55:33

Sorry, dass das so wichtig ist, wusste ich nicht. Hier ist die Datei.

https://www.herber.de/bbs/user/91839.txt

Und wie gesagt ich möchte individuelle Zeilen bearbeiten, funktioniert ja auch schon, nur eben bei den Stati bräuchte ich "Zeilenbezug" ohne Text Orientierung.

Danke! :)


  

Betrifft: AW: Fehler... von: Oberschlumpf
Geschrieben am: 02.08.2014 15:13:06

Hi Pete

ja, dass es so wichtig ist, wusstest du nich - DESWEGEN hatte ich dich ja auch mehrmals darauf hingewiesen - und trotzdem kamen von dir immer nur "Kleckertextbeispiele"

Was du aber wissen musst, ist:
Ich, jeder andere Antworter kennt deine pu-Dateien nicht.
Woher sollen wir dann im Detail wissen, wie deine Dateien aussehen?
Und deswegen zeig bitte immer Bsp-Dateien - das macht alles einfacher.

So, nun zu deiner Frage.
Ja, du hast recht, jetzt (wo auch ich den Dateiinhalt kenne) erkenne ich auch, dass es so einfach nicht geht, Zeilen zu ändern, da die Inhalte sich wiederholen können.

Möglich ist es trotzdem.

hier meine Idee
https://www.herber.de/bbs/user/91843.xls

Ich hab deine pu-Datei einfach nach Excel "geholt".

1. Öffne die Datei, aktiviere die Makros, klick in die Zelle A1
2. es öffnet sich ein Userform mit einer Listbox, einen Textfeld + 2 Commandbutton
3. Klick auf den Button "PU-Datei einlesen"
Es öffnet sich ein Dateiöffnen-Dialog. (es werden nur pu-Dateien angezeigt)
Such deine Datei + öffne sie.
4. Die Datei wird vollständig in die Listbox eingelesen
5. Such die Zeile, die du ändern willst und klick sie an
6. Der Inhalt der angeklickten Zeile in der Listbox wird in das Textfeld eingetragen
7. Nimm im Textfeld die gewünschten Änderungen vor
8. Klick auf den anderen Button
Die Datei wird per Code nun wieder geöffnet, alle Zeilen werden eingelesen.
Wenn die zu änderne Zeile gefunden, wird sie durch den Inhalt des Textfeldes ersetzt.
Alle Zeilen werden während des Korrigiervorgangs in eine Dummy-txt-Datei geschrieben.
Wenn fertig, wird pu-Datei gelöscht, dummy-txt-datei in Name von pu-Datei umbenannt und im Verzeichnis der pu-Datei gespeichert.

Dein Ziel ist erreicht.

Hilfts denn auch?

Ciao
Thorsten


  

Betrifft: und noch ein Fehler von: Oberschlumpf
Geschrieben am: 02.08.2014 16:28:31

Hi Pete

hab gerad ne kleine "Unschönheit" im Code entdeckt.

Bisher ist es so, wenn du auf den linken Button klickst, um ne Datei einzulesen, wird diese in die Listbox übertragen.
Machst du das noch mal, wird die nächste geöffnete Datei, bzw der Inhalt an die Liste angehängt.
Der Inhalt der Listbox wird nicht vorher gelöscht.

Um das zu ändern:
Füge bitte in der Sub sbPuRead direkt oberhalb der Zeile

Open pstrPuFile For Input As #1

diese Zeile ein
ufPu.lstPU.Clear
Nun wird vor jedem Öffnen/Anzeigen einer pu-Datei die Listbox gelöscht.

Hilfts?

Ciao
Thorsten



 

Beiträge aus den Excel-Beispielen zum Thema "Datei Bearbeiten"