Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

ini Datei lesen
#11
Hallo,

in der Beispieldatei war ein Klassenmodul enthalten, dass diese Funktion enthält:


Code:
Wert = iniClass.GetPrivateProfileString("Tabelle1", rngRange.Address)


Frage einen Kollegen, der sich mit diesem Ansatz auskennt.

mfg
Antworten Top
#12
Hallo allerseits,

ich habe mir zwar die Beispieldateien nicht angesehen. Doch bin ich ein wenig entsetzt darüber, wie sehr ini-Dateien hier belächelt werden und die Vorgehensweise von Florian in Misskredit gestellt wird. Das muss doch nicht sein! Wir wissen doch überhaupt nicht ob es nicht die cleverste Lösung überhaupt ist?!



Zwar bin ich kein API-Spezialist, doch kann man eine Ini ganz einfach so auslesen (mein Code bezieht sich auf das Beispiel des Eingangsposts):
Und ja, der Code funktioniert auch noch im Jahre 2018 Wink.
Code:
Option Explicit
      
Private Declare Function GetPrivateProfileString Lib _
        "kernel32" Alias "GetPrivateProfileStringA" _
        (ByVal lpApplicationName As String, ByVal _
        lpKeyName As Any, ByVal lpDefault As String, _
        ByVal lpReturnedString As String, ByVal nSize _
        As Long, ByVal lpFileName As String) As Long


Public Function GetIniValue(ByVal strIniPath As String, _
                            ByVal strSection As String, _
                            ByVal strKey As String, _
                            Optional ByVal strDefault As String = vbNullString)
   Dim strBuffer As String, lngResult As Long
   strBuffer = Space$(256)
   lngResult = GetPrivateProfileString(strSection, strKey, strDefault, strBuffer, Len(strBuffer), strIniPath)
   GetIniValue = Left$(strBuffer, lngResult)
End Function


Sub FuelleRangesFromIni()
    Dim sTabelle As String, sVal As String
    Dim vRange As Variant, vRanges As Variant
    Dim strBuffer As String, lngResult As Long
    
    Const sIniPath As String = "c:\tmp\die.ini"         'Hier Pfad anpassen!
  
    'erste Section = Tabellenblattname
    strBuffer = Space$(256)
    lngResult = GetPrivateProfileString(vbNullString, "", "", strBuffer, Len(strBuffer), sIniPath)
    sTabelle = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
    
    
    'alle Keys = Ranges
    lngResult = GetPrivateProfileString(sTabelle, vbNullString, "", strBuffer, Len(strBuffer), sIniPath)
    vRanges = Split(Mid(strBuffer, 1, lngResult - 1), vbNullChar)
    
    'Schleife über alle Ranges
    With Sheets(sTabelle)
        For Each vRange In vRanges
            Range(vRange).Value = GetIniValue(sIniPath, sTabelle, vRange, "")
        Next
    End With
End Sub

Eien Ini-Datei besteht ja aus sections (das was in den eckigen Klammern steht) und Key-Value Paaren. In der Regel sind die Sections und Keys dem Programmierer bekannt. Ist das bei dir, Flo auch so? Dann würde sich der Code nämlich vereinfachen.

Grüße, Ulrich
Antworten Top
#13
Hallo,

ich habe mir jetzt doch mal deine Beispieldateien angesehen und den Thread etwas aufmerksamer gelesen.
Mir ist klar geworden, dass ihr irgendwie versucht, über die INI-Datei Datenabgleiche zu machen. Ich bin mir nicht sicher, ob ich das sinnvoll finde, daher gehe ich aus diesem Thema raus.

Nur so viel noch:
Dass die Daten in der Tochter-Datei falsch eingelesen werden, liegt am Code der Userform.
Eine Korrektur in dieser Richtung:
Code:
Public Sub LeseIniDatei()
Dim Wert, meAr, rngRange As Range
Dim nCounter As Long
Dim lngRow As Long

lngRow = Cells(Rows.Count, 1).End(xlUp).Row + 1

Range("A2", Cells(lngRow, 2)).Clear
lngRow = 2

Wert = iniClass.GetPrivateProfileString("Tabelle1")
    
If Wert <> "Keine Daten" And Wert <> "Leer" Then
    meAr = Split(Wert, vbNullChar)

    UserForm1.Label2.Caption = ("" & UBound(meAr) - LBound(meAr) + 1 & "")
        
    With Sheets("Tabelle1")
        For nCounter = LBound(meAr) To UBound(meAr)
    '        Cells(lngRow, 1) = meAr(nCounter)
            Wert = iniClass.GetPrivateProfileString("Tabelle1", CStr(meAr(nCounter)))
            
    '        If IsDate(Wert) Then
    '            Cells(lngRow, 2) = CDate(Wert)
    '        ElseIf IsNumeric(Wert) Then
    '            Cells(lngRow, 2) = Wert * 1
    '        Else
    '            Cells(lngRow, 2) = Wert
    '        End If
            
            If IsDate(Wert) Then
                .Range(CStr(meAr(nCounter))) = CDate(Wert)
            ElseIf IsNumeric(Wert) Then
                .Range(CStr(meAr(nCounter))) = Wert * 1
            Else
                .Range(CStr(meAr(nCounter))) = Wert
            End If
                
            lngRow = lngRow + 1
        Next nCounter
    End With
    
    iniClass.WritePrivateProfileString "Tabelle1"
Else
    UserForm1.Label2.Caption = ("0")
End If
End Sub
könnte helfen (ist nur ein kleiner unsauberer Hack von mir, der nicht weitergedacht ist und bestimmt einige Korrekturen benötigt).

Grüße, Ulrich

[edit: vielleicht wäre es besser, wenn derjenige, der angefangen hat, den Code zu programmieren, ihn auch zu ende bringt. Es ist oftmals besser einen festen Ansprechpartner für einen Code zu haben, als wenn viele daran "rumdoktoren".]
[-] Folgende(r) 1 Nutzer sagt Danke an losgehts für diesen Beitrag:
  • Florian20
Antworten Top
#14
Hallo an alle,

Ich habe mir eure Antworten durchgelesen und werde es testen so wie Ihr es hier beschrieben habt.
Danke liebes Forum
Live is a Game Play it
Antworten Top
#15
Hallo nochmal,

Danke schön Ulrich deine letzte Antwort hat funktioniert es läuft perfekt :18:
Live is a Game Play it
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste