VBA in Ini-Datei schreiben
Hi alle,
weiss jemand wie ich mit VBA in eine INI-Datei nur die Sektion per GetPrivateProfilString schreiben kann?
Also es sollte dann nichts weiter erstmal in der INI stehen, wie z. B.:
[Test]
Ich hatte mal eine Seite wie es mit GetPrivateProfilString geht, aber finde sie nicht mehr.
Wer kann mir helfen?
Thx!!!
Antwort schreiben
Antwort 1 von Massaraksch vom 10.10.2021, 04:30 Options
Mit Get gehts wohl kaum, eher mit Write... Und so funktionierts bei mich:
Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Boolean
Sub IniTest()
Dim x As Boolean
'Abschnitt mit Beispieleintrag erzeugen
x = WritePrivateProfileString("Test", "blabla", "xxx", "C:\Settings.txt")
'Beispieleintrag wieder entfernen, Abschnitt bleibt
x = WritePrivateProfileString("Test", "blabla", vbNullString, "C:\Settings.txt")
End Sub
Massaraksch
Antwort 2 von Gast2345 vom 10.10.2021, 12:19 Options
@Massaraksch:
Vielen Dank auch, werde ich später gleich mal probieren. Melde mich morgen dann noch einmal, ob es geklappt hat. So wie ich das intepretiere bleibt da aber
[Test]
blabla =
übrig?! Ich möchte aber nur [Test] haben?!
Antwort 3 von Gast2345 vom 10.10.2021, 12:30 Options
So hab jetzt nochmal was probiert.
Private Sub CommandButton1_Click()
Dim x As String
Dim strPfad As String
x = "Test"
strPfad = "C:\test\test.ini"
System.PrivateProfileString(strPfad, "Test", "") = x
End Sub
Dann steht in der Ini:
[Test]
Test=
=Test
Aber wie gesagt, es soll ja nut [Test] stehen.
Sorry hatte im ersten Postiing GetPrivateProfilString geschrieben meinte aber PrivateProfileString.
Thx
Antwort 4 von Gast2345 vom 11.10.2021, 00:38 Options
Hat keiner mehr eine Idee, bitte?
Antwort 5 von Massaraksch vom 11.10.2021, 01:20 Options
Zuerst eine Frage: Was gefällt dir an meinem funktionierendem Beispiel nicht?
Kurze Erläuterung noch zu dem Ganzen:
Man kann wohl keinen leeren Abschnitt mit einem einzelnen Aufruf erzeugen ((jedenfalls fand ich keine Möglichkeit). Deshalb füge ich zuerst den gewünschten Abschnitt "Test" mit einem (Phantasie-)Eintrag "Blabla" ein und entferne den überflüssen Eintrag mit dem nächsten Befehl gleich wieder. So bleibt nur der leere Abschnitt "Test" übrig.
(hab ich ja oben im Code dokumentiert)
Mit der VBA-Funktion "System.PrivateProfileString" kann ein INI-Eintrag jedoch dummerweise nicht gelöscht werden. Daher greife ich auf die allgemeine WinAPI-Funktion "WritePrivateProfileString" zurück.
(mit dem speziellen Parameter "vbNullString" wird der Eintrag "blabla" gelöscht).
Die API-Funktion muß zuerst im VBA-Modul deklariert werden, bevor man sie benutzen kann (obige Zeilen mit "Private Declare ...). Die Deklaration übrigens nicht im Makro, sondern auf Modulebene, also über dem ersten Sub...End Sub.
"x" ist im Beispiel nur der Rückgabewert der ausgeführen Funktion und ergibt "Wahr" bei Erfolg des Befehls. Könnte man bei Bedarf zur Auswertung nutzen.
So, weiterführende Erläuterungen sind kostenpflichtig... kleiner Scherz ;o)
Massaraksch
Antwort 6 von Gast2345 vom 11.10.2021, 14:22 Options
@Massaraksch:
Deine Lösung funktioniert, keine Frage zu 100%. Super! Du darfst mich nicht falsch verstehen, lt. einem Kumpel und ich meine, ich hätte es mal auf einer Webseite gesehen, soll auch über System.PrivateProfileString(strPfad, "Test", "") = x in der Richtung funktionieren und angeblich kann ich mir dadurch den API-Aufruf ersparen.
Nur probiere ich schon zig Kombinationen und ich komme einfach nicht auf die Lösung
und bin langsam am verzweifeln. Falls Du oder auch jemand anders auf die Lösung kommt, wäre ich Euch sehr dankbar über eine Rückmeldung, weil ich komme einfach nicht drauf.
Vielen Dank nochmals vorab!
Antwort 7 von Gast2345 vom 12.10.2021, 20:27 Options
@Massaraksch:
Wollte die nur mitteilen, auch mein Kumpel schaffte es vor meinen Augen nicht mehr.
Deshalb haben wir uns nun auf Deine Lösung verständigt. Nochmals vielen Dank auch für Deine Unterstützung!