Registriert seit: 06.12.2015
Version(en): 2016
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
Registriert seit: 02.08.2014
Version(en): 2016
18.04.2018, 08:25
(Dieser Beitrag wurde zuletzt bearbeitet: 18.04.2018, 08:25 von losgehts.)
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  . 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
Registriert seit: 02.08.2014
Version(en): 2016
18.04.2018, 09:14
(Dieser Beitrag wurde zuletzt bearbeitet: 18.04.2018, 09:14 von losgehts.)
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:1 Nutzer sagt Danke an losgehts für diesen Beitrag 28
• Florian20
Registriert seit: 16.03.2018
Version(en): 2007,2016
Hallo an alle,
Ich habe mir eure Antworten durchgelesen und werde es testen so wie Ihr es hier beschrieben habt. Danke liebes Forum
Registriert seit: 16.03.2018
Version(en): 2007,2016
Hallo nochmal,
Danke schön Ulrich deine letzte Antwort hat funktioniert es läuft perfekt :18:
|