2.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
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!!!

7 Antworten

0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
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
0 Punkte
Beantwortet von
@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?!
0 Punkte
Beantwortet von
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
0 Punkte
Beantwortet von
Hat keiner mehr eine Idee, bitte?
0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
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
0 Punkte
Beantwortet von
@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!
0 Punkte
Beantwortet von
@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!
...