INI-Datei in eine Listbox einlesen

kalterjava

Erfahrenes Mitglied
Hallo zusammen,

ich hatte fälschlicherweise meine Frage im Office-Forum platziert. Dort wurde mir auch geholfen, jedoch bekomm ich es so nicht hin...

http://www.tutorials.de/forum/offic...ular-soll-mehr-als-25-eintraege-anzeigen.html

Es geht darum, dass mein Vorgänger eine ini-Datei geschrieben hat, auf die viele Worddokumente zugreifen. Die einzelnen Werte wurde in eine Dropdown-Liste eingelesen. Das hat wunderbar funktioniert, bis die Anzahl von 25 nun überschritten wurde, weil Word 2003 nicht mehr wie 25 Elemente in der Dropdownliste anzeigt.

Ich kenn mich mit VB und den ganzen Werkzeugen nicht aus und bräuchte deshalb eure Hilfe. Ich habe hier nur gefunden, wie man ein txt-File in ein Listenfeld einliest. Hier handelt es sich jedoch um eine ini.

So ist die ini-Datei aufgebaut:

PHP:
[module]
Sort=Yes
L1="BWL"
L2="MM"
L3="VWL"
usw

[gruppe]
L1="Gruppe A"
L2="Gruppe B"
L3="Gruppe C"
usw


Und das steht im Visual Basic Editor (nochmal angemerkt - nicht von mir:))

PHP:
'*** Beginn des anpassbaren Teils
Private Const iniDatei = "\Module.ini"
'*** Ende des anpassbaren Teils

Sub AutoNew()
  Dim strWorkgroupTemplates As String
  On Error Resume Next
  strWorkgroupTemplates = Options.DefaultFilePath(wdWorkgroupTemplatesPath)
  Datei = strWorkgroupTemplates & iniDatei
  
  If Dir(Datei) = "" Then
    MsgBox "Die Datei mit dem Namen " & iniDatei & " ist nicht vorhanden.", vbCritical
    Exit Sub
  End If
  Dim FF As FormField
  For Each FF In ActiveDocument.FormFields
    If FF.Type = wdFieldFormDropDown Then
      DropdownFormularfelderLaden FF.Name
    End If
  Next
End Sub

Private Sub DropdownFormularfelderLaden(ByVal FeldName As Variant)
  Dim strWorkgroupTemplates As String
  strWorkgroupTemplates = Options.DefaultFilePath(wdWorkgroupTemplatesPath)
  Datei = strWorkgroupTemplates & iniDatei
  
  Dim x() As String
  j = -1
  For i = 1 To 25
    tmp = System.PrivateProfileString(Datei, FeldName, "L" & CStr(i))
    If tmp = "" Then
      If i = 1 Then Exit Sub
    Else
      j = j + 1
      ReDim Preserve x(j)
      x(j) = tmp
    End If
  Next i
  If j > 0 And System.PrivateProfileString(Datei, FeldName, "Sort") = "Yes" _
     Then
    WordBasic.SortArray x()
  End If
  With ActiveDocument.FormFields(FeldName).DropDown.ListEntries
    .Clear
    For i = 0 To UBound(x)
      .Add x(i)
    Next i
  End With
End Sub

Public Sub fill_in_modul()
On Error Resume Next
    ActiveDocument.FormFields("module_text").Result = ActiveDocument.FormFields("module").Result
End Sub

Public Sub fill_in_gruppe()
On Error Resume Next
    ActiveDocument.FormFields("gruppe_text").Result = ActiveDocument.FormFields("gruppe").Result
End Sub


Wenn jmd. eine bessere Lösung hätte - bin für alles offen, da ich diesen Code ohnehin in jedem Dokument ersetzen muss, weil es mit der Dropdownliste nicht mehr geht.

Thanks im Voraus.

Grüße
kalterjava
 

Zvoni

Erfahrenes Mitglied
Deine Begrenzung auf 25 Listeneinträge sitzt hier

Visual Basic:
For i = 1 To 25
    tmp = System.PrivateProfileString(Datei, FeldName, "L" & CStr(i))
    If tmp = "" Then
      If i = 1 Then Exit Sub
    Else
      j = j + 1
      ReDim Preserve x(j)
      x(j) = tmp
    End If
Next i

Es ist das "For i=1 To 25"
Einfach aus der "25" einen entsprechend höheren Wert setzen.
Eleganter wäre es natürlich, wenn man in der INI einen Schlüssel hätte, in welchem die Anzahl Einträge enthalten ist
 

Zvoni

Erfahrenes Mitglied
Nachtrag:

In deinem Word-Dokument natürlich NICHT die ComboBox aus "Ansicht - Symbolleisten - Formular" verwenden (Das ist wirklich auf nur 25 Einträge beschränkt!).

Sondern die ComboBox aus "Ansicht - Symbolleisten - Steuerelemente-Toolbox" verwenden.

Nicht zu vergessen, dass dann der Code angepasst werden muss, da die Combobox ja dann nicht mehr ein Mitglied der FormFields-Auflistung ist.
 
Zuletzt bearbeitet:

kalterjava

Erfahrenes Mitglied
Hallo Zvoni,

vielen Dank für deine Hilfe.

Die Begrenzung mit 25 habe ich auch gesehen, jedoch ändert sich ja, wie du es mir schon gesagt hast nichts, wenn ich auf 28 erhöhe.

D.h. ich muss einfach eine andere Combobox nehmen und dann geht das?

Wie und wo muss ich dann den Code überall ändern? Ich weiß leider nicht, wie diese "richtige" Combobox mit mehr Einträgen heißt, sonst würde ich googeln.

Besten Dank schon mal.

Grüße vom
kalterjava
 

Zvoni

Erfahrenes Mitglied
Um die ComboBox zu bekommen: In Word "Ansicht - Symbolleisten - Steuerelement-Toolbox". Hier bekommst du eine neue Symbolleiste mit den "echten" MS-Steuerelementen, unter anderem auch die ComboBox. Einfach auf dein Word-Dokument ziehen.

Der Code müsste dann hier geändert werden:
Code bisher:
Visual Basic:
Dim FF As FormField
  For Each FF In ActiveDocument.FormFields
    If FF.Type = wdFieldFormDropDown Then
      DropdownFormularfelderLaden FF.Name
    End If
  Next
Dieser Code kann mehr oder weniger komplett durch folgenden ersetzt werden:
Visual Basic:
Dim FF As Control
  For Each FF In ActiveDocument.Controls
    If TypeOf FF Is ComboBox Then
      DropdownFormularfelderLaden FF.Name
    End If
  Next

Weiter Code ersetzen:
Code bisher:
Visual Basic:
With ActiveDocument.FormFields(FeldName).DropDown.ListEntries
    .Clear
    For i = 0 To UBound(x)
      .Add x(i)
    Next i
  End With
wird ersetzt durch:
Visual Basic:
With ActiveDocument.Controls(FeldName)
    .Clear
    For i = 0 To UBound(x)
      .AddItem x(i)
    Next i
  End With

Wenn der Code mit den bisherigen Einstellungen funktioniert (For i=1 to 25), sollte es kein Problem sein, die 25 durch etwas anderes zu ersetzen.

Wichtig: Die ComboBox-en müssen dann natürlich ihrem entsprechenden Zweck benannt werden ("module", "grupppe" usw.)

ACHTUNG: DAS IST ALLES UNGETESTET!! Ich habe das mal so eben aus dem hohlen Bauch heraus zusammengebaut.

Sollte es ums verrecken nicht funktionieren, kannst du mir ja mal das Word-Dokument mit der INI-Datei schicken (Falls du das überhaupt darfst!)
 

kalterjava

Erfahrenes Mitglied
Hallo Zvoni,

besten Dank für deine Hilfe.:)

Ich versuch es einfach mal mit deinem Code und melde mich auf jeden Fall, ob es geklappt hat oder ob ich noch einmal deine Hilfe benötige.

Schöne Grüße
kalterjava
 

kalterjava

Erfahrenes Mitglied
Ne, sry - der Code funktioniert nicht, aber ich habe ja jetzt einen Ansatzpunkt und kann mir mal die Infos zu Active Document.Controls ansehen.
Ich melde mich in ca. 3 Wochen wieder, obs geklappt hat oder nicht.

Schönen Dank.
 

kalterjava

Erfahrenes Mitglied
Hallo Zvoni,

also ich habe es nochmals versucht - leider ohne Erfolg. Allerdings habe ich es jetzt aufgrund des ursprünglichen Beispiels hinbekommen, weshalb der Thread mit Dank geschlossen wird.
 

Zvoni

Erfahrenes Mitglied
Hmmm, also bei mir gehts ohne Probleme. Guck dir mal mein Beispiel-Word-Dokument an.
 

Anhänge

  • Combobox.doc
    28,5 KB · Aufrufe: 444