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, 07:25
(Dieser Beitrag wurde zuletzt bearbeitet: 18.04.2018, 07: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, 08:14
(Dieser Beitrag wurde zuletzt bearbeitet: 18.04.2018, 08: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
Live is a Game Play it
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:
Live is a Game Play it
|