Jump to content

INI in Excel importieren


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hi, ich möchte eine INI Datei in Excel importieren.

 

[Name1]

Variable1=Wert1

Variable2=Wert2

...

...

[Name2]

Variable1=Wert1

Variable2=Wert2

...

...

 

Bei einem Standart Import stehen natürlich [Name1], Variable1 und Variable2 in Spalte A und die Werte in Spalte B.

 

Jetzt hätte ich gerne einen Import, der mir [Name] in Spalte A, Variable1 in Spalte B, Variable2 in Spalte C, usw. setzt und die Werte in die ensprechenden Spalten einträgt.

Muss ich das per Makro realisieren oder geht das auch anders?

Ich hab mich bisher leider wenig mit Makros beschaäftigt und etwas Hilfe wäre echt super!

Link zu diesem Kommentar

Hi Viper,

 

ich würde dir von einem Makro mit API-Calls abraten ... bastel dir einen neuen Button und hinterlege dort den Code (in dem Beispiel Call fctGetIniString --> Wobei die Funktion eben [wie der Name schon vermuten lässt] den INI-String zurückliefert und du diesen dann weiter verarbeiten musst)...

 

Declare Function GetPrivateProfileString Lib "kernel32.dll" 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

Function fctGetIniString(sFileName As String, sSection As String, sKey As String) As String
Dim sBuffer As String 'To hold the returned value
Dim lSize As Long 'Max size of sBuffer
Dim lReturn As Long
lSize = 256

' Fill the sBuffer string with nulls
sBuffer = String(lSize, vbNullChar)
lReturn = GetPrivateProfileString(sSection, sKey, "", sBuffer, size - 1, sFileName)
If lReturn > 0 Then
GetIniString = Left(sBuffer, lReturn)
Else
GetIniString = ""
End If
End Function

 

Grüße

Link zu diesem Kommentar

Doch, mit API-Calls ist es einfacher, aber im reinen Code eben ... Makros sind bei API-Calls einfach anfällig (unerklärliche Abstürze oder unerwartetes Verhalten / Ergebnisse). Für einen kompletten Code zum Auslesen der INI und befüllen deines Excel-Sheets bräuchte ich ein paar mehr Angaben und ein bisschen mehr Zeit ;) ... am besten dann über PM.

 

Grüße

Link zu diesem Kommentar

Also wenn das makro mal absemmelt macht das nix. Muss nur alle Schlatjahr gemacht werden und verstrubbelt kann nix werden.

 

Hab mal mit deinem Beispiel getesten und immerhin schonmal werte lesen können :)

 

Wenn ich das richtig verstehe, muss ich definieren, welchen Wert in welcher Gruppe er lesen soll.

 

Jedoch muss ich es so machen, daß er beginnt, die erste Gruppe ließt und dann die Werte und Gruppe in die Tabelle packt.

 

Hier mal ein kleiner Teil der INI:

 

[Annihilator ANH-1A]

Weight=100

Tech=IS

Internal=Standard

Engine=Regular

BaseEngineRating=200

LegType=Man 2 segments

TorsoType=Vertical

StockEngineRating=200

JJCapable=0

LAMSCapable=0

ECMCapable=0

BAPCapable=0

IFFCapable=0

EOCapable=0

AGCapable=0

360Capable=0

Legendary=0

ObstructingSection=0

SpeedIncreasesBonus=1

BaseSpeedBonus=0

AccelerationBonus=-1

TurnRateBonus=0

TorsoTwistRadiusBonus=0

TorsoTwistSpeedBonus=0

BaseTonnageBonus=1

InternalHeatSinksBonus=0

 

[Argus AGS-4D]

Weight=60

Tech=IS

Internal=Endo Steel

Engine=XL

BaseEngineRating=255

StockEngineRating=300

LegType=Bird 3 segments

TorsoType=Horizontal

JJCapable=0

LAMSCapable=0

ECMCapable=0

BAPCapable=1

IFFCapable=1

EOCapable=0

AGCapable=0

360Capable=0

Legendary=0

ObstructingSection=0

SpeedIncreasesBonus=-1

BaseSpeedBonus=0

AccelerationBonus=0

TurnRateBonus=1

TorsoTwistRadiusBonus=0

TorsoTwistSpeedBonus=0

BaseTonnageBonus=0

InternalHeatSinksBonus=0

 

Die Ausgabe der Tabelle versuche ich so hin zu bekommen:

 

NAME___________|Weight|Tech|Internal__|...

Annihilator ANH-1A|___100|__IS|Standard_|...

Argus AGS-4D____|____60|_ IS|Endo Steel|...

 

 

Besonders tricky wird es, weil zum Teil die Werte nicht in der selben Reihenfolge stehen. Also muss ich die Gruppe lesen, als Name eintragen, den ersten Key auslesen und ermitteln in welche Spalte der Wert gehört.

*sfz* hätt ich doch nur nicht vor 10 Jahren mit dem proggen aufgehört. :(

Link zu diesem Kommentar

Hi Viper,

 

hab mal was geschrieben, das passt bei mir soweit. Den Header also was in Zeile 1 alles steht, füllst du am besten schon vorher aus (NAME___________|Weight|Tech|Internal__|...). Den Code, den ich geschrieben habe, kannst du von einem Makro aus aufrufen, da ist jetzt kein API-Call mehr drin. Den Code selbst fügst du einfach in dein Worksheet ein. (Code im zweiten Posting, da zu lang)

 

Solltest du noch Fragen haben, kannst du sie gern stellen :D

 

Grüße

Link zu diesem Kommentar
Private Function fctFillTableFromINI()
Dim dlgFileOpen As FileDialog
Dim strFileName As String
Dim strLineInput As String
Dim lngPosRow As Long
Dim lngPosCol As Long
Dim intFN As Integer

On Error GoTo Error_fctFillTableFromINI

   lngPosRow = 2
   lngPosCol = 97
'Dialog zum Datei öffnen anzeigen
   Set dlgFileOpen = Application.FileDialog(msoFileDialogOpen)
   With dlgFileOpen
       .AllowMultiSelect = False
       .ButtonName = "INI-Datei auswählen"
       .Filters.Add "INI-Dateien", "*.ini"
       If .Show = -1 Then
           If .SelectedItems.Count <= 0 Then
               MsgBox "Es wurde keine Datei ausgewählt!", vbInformation + vbOKOnly, "Keine Datei ausgewählt"
               Exit Function
           Else
               strFileName = .SelectedItems
           End If
       End If
   End With
'Dateieinlesen vorbereiten
   intFN = FreeFile
   Open strFileName For Input As intFN
'Datei zeilenweise einlesen und in das Sheet einfügen
   Do While Not EOF(intFN)
       Line Input #intFN, strLineInput
       If Left(strLineInput, 1) = "[" Then
           Range(CStr(Chr(lngPosCol) & lngPosRow)).Select
           ActiveCell.FormulaR1C1 = Mid(strLineInput, 2, Len(strLineInput) - 2)
       ElseIf strLineInput <> "" Then
           Range(CStr(Chr(lngPosCol) & lngPosRow)).Select
           If InStr(1, strLineInput, "Weight") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("Weight = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "Tech") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("Tech = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "Internal") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("Internal = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "BaseEngineRating") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("BaseEngineRating = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "LegType") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("LegType = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "TorsoType") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("TorsoType = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "StockEngineRating") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("StockEngineRating = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "JJCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("JJCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "LAMSCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("LAMSCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "ECMCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("ECMCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "BAPCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("BAPCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "IFFCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("IFFCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "EOCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("EOCapable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "AGCapable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("AGCapable = ") + 1, Len(strLineInput))

Link zu diesem Kommentar

Fortsetzung

           If InStr(1, strLineInput, "360 Capable") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("360 Capable = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "Legendary") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("Legendary = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "ObstructingSection") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("ObstructingSection = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "SpeedIncreasesBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("SpeedIncreasesBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "BaseSpeedBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("BaseSpeedBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "AccelerationBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("AccelerationBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "TurnRateBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("TurnRateBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "TorsoTwistRadiusBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("TorsoTwistRadiusBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "TorsoTwistSpeedBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("TorsoTwistSpeedBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "BaseTonnageBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("BaseTonnageBonus = ") + 1, Len(strLineInput))
           If InStr(1, strLineInput, "InternalHeatSinksBonus") > 0 Then ActiveCell.FormulaR1C1 = Mid(strLineInput, Len("InternalHeatSinksBonus = ") + 1, Len(strLineInput))
       End If

       lngPosCol = lngPosCol
       lngPosRow = lngPosRow
   Loop

'Datei schließen
   Close intFN

'Erfolgsmeldung
   MsgBox "Import abgeschlossen", vbInformation + vbOKOnly

'Fehlerbehandlung
Exit_fctFillTableFromINI:
   Exit Function

Error_fctFillTableFromINI:
   MsgBox "Es ist folgender Fehler (Nr: " & Err.Number & ") aufgetreten." & vbCrLf & vbCrLf & Err.Description
   Err.Clear
   Resume Exit_fctFillTableFromINI

End Function

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...