Clever-Excel-Forum

Normale Version: Variablen füllen mit Schleife
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5
Funktioniert leider nicht wie es soll. Am Anfang funktioniert es noch (aber nicht Dein letzter Code). Aber je komplexer das dynamische Menü werden soll umso mehr verschluckt sich der Code, d.h. dass etwas an der Zusammenstellung des XML-Codes nicht mehr passt (ich kann aber nicht nachvollziehen was da schief läuft). Muss ich doch beim bisherigen Code bleiben. Aber vielleicht kommt ja noch ein weiterer Vorschlag. Danke für den Denkanstoß!
Jetzt nach dem Ausschlafen hat es doch noch funktioniert. Wer weiss woran er sich gestern verschluckt hat.

         strConfKey = Split("Caption MacroName ButtonId imageMSO isSeparator separatorID screentip supertip keytip tag")
         strStrings = Split("strLabel strMacro strButtonID strImageMSO strIsSeparator strSepName strScreentip strSupertip strKeytip strTag")

         strReadKeys = strConfKey
            For strConfKeyCount = 0 To Ubound(strConfKey)
                strReadKeys(strConfKeyCount) = MenueinhaltEinlesen(strMenuPoint & lngMenuPos, strConfKey(strConfKeyCount), strConfigPath)
            Next strConfKeyCount


VBA/HTML - CodeConverter für Office-Foren, AddIn für Excel/Word 2002-2013 - komplett in VBA geschrieben von Lukas Mosimann. Projektbetreuung durch mumpel

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


Jetzt wäre es noch schön wenn man die Inhalte den Variablen (die stehen in strStrings, gleich in der passenden Reihenfolge des Einlesens) zuweisen könnte.
Code:
Sub M_snb()
    MsgBox ErstelleMenueInhalt(Split(ThisDocument.FullName, ".")(0) & ".ini", "snb_001", 12, 20)
End Sub

Public Function ErstelleMenueInhalt(strConfigPath As String, strMenuPoint As String, x As Long, y As Long) As String
  sp = Split("separatorID ButtonId Caption MacroName  imageMSO isSeparator screentip supertip key tag")
  sn = Split("<menuseparator id_<button id_label_onAction_imageMSO_isSeparator_screentip_supertip_key_tag", "_")
 
  For j = x To y
    sq = sn
    For jj = 0 To UBound(sp)
      c00 = MenueinhaltEinlesen(strMenuPoint & jj, sp(jj), strConfigPath)
      If c00 <> "" Then sq(jj) = sq(jj) & IIf(jj < 2, j, "") & "=""" & c00 & IIf(jj < 1, "/>", "")
    Next
   
    ErstelleMenueInhalt = ErstelleMenueInhalt & "<" & Join(Filter(sn, "="), """ ") & """/>"
  Next
End Function

Schau mal weiter: http://www.snb-vba.eu/VBA_Arrays_en.html

Etwas merkwürdig: strFrom und strTo als 'Long' bezeichnen.
(06.12.2016, 14:36)snb schrieb: [ -> ](...) Etwas merkwürdig: strFrom und strTo als 'Long' bezeichnen (...)
Ich habe gelernt Zahlen als Long zu übergeben anstatt als Integer. Bei "MenueinhaltEinlesen" habe ich jetzt alles als Variant deklariert, damit er mir das annimmt und ich trotzdem alle Variablen deklarieren kann.

Ich bekomme ein "Index außerhalb des gültigen Bereichs" bei "sq(jj) = sq(jj) & IIf(jj < 2, j, "") & "=""" & c00 & IIf(jj < 1, "/>", "")".
Dann kannst du sagen welche Werten jj, und sq(jj) haben:  F8  , Fenster Lokal und mouseover über Variablen.


Im 'ungarischen' Notation verwendet man 'str' als prefix zu einem 'string' Variable. Dann ist es merkwürdig zu sehen das du die strFrom als 'Long' bezeichnest.
Das könnte man 'inkonsistent' nennen, oder eben 'widersprüchlich'.
(06.12.2016, 18:01)snb schrieb: [ -> ]Dann kannst du sagen welche Werten jj, und sq(jj) haben (...)

Das 2. "sq(jj)" hat den Fehler, alle anderen sind gefüllt.

(06.12.2016, 18:01)snb schrieb: [ -> ](...) oder eben 'widersprüchlich' (...)
Stimmt natürlich. Hatte ich "übersehen". ;)
Fehler gefunden. Zwischen "MacroName" und "imageMSO" in "sp" ist ein Leerzeichen zuviel.

Die Zusammenstellung passt aber noch nicht. Da muss ich noch nacharbeiten
Die Zusammenstellung passt so nicht.

<menuseparator id1="mnu1Separator"/><button id1="mnu1Button label ="Eintrag 1 on‌Action ="onAction_Button imageMSO ="FilesToolAddFiles isSeparator ="0 screentipsupertipkeytag ="Tag1

"isSeparator" darf nicht mit in den XML-Code rein, das ist nur ein Prüfeintrag (1 = menuSeparator setzen, 0 = menuSeparator nicht setzen). Der menuSeparator darf nur mit im den XML-Code rein wenn "isSeparator" auf 1 steht. "screentip" und "supertip" stehen zu nah beieinander, und dürfen nur aufgenommen werden wenn sie gefüllt sind (also <>"" sind). Es fehlen die abschließenden Anführungszeichen bei den Attributen. Zudem müssen die Attribute durch den Zähler ergänzt werden.

Richtig muss so sein wenn "isSeparator" auf 1 steht. Die Zahlen bei der Button-ID und Separator-ID sind die jeweiligen Zähler (j +1). "screentip", "supertip" und "keytip" dürfen nicht rein, da leer.
<menuSeparator id="mnu1Separator1"/><button id="mnu1Button1" label ="Eintrag 1" on‌Action ="onAction_Button" imageMSO ="FilesToolAddFiles" tag="Tag11" />
Sollte sein:

    ErstelleMenueInhalt = ErstelleMenueInhalt & Join(Filter(sq, "="), """ ") & """/>"

Zur Illustration wie die 'strings' aufgebaut werden:

Code:
Sub M_snb()
  sp = Split("separatorID ButtonId Caption MacroName  imageMSO isSeparator screentip supertip key tag")
  sn = Split("<menuseparator id_<button id_label_onAction_imageMSO_isSeparator_screentip_supertip_key_tag", "_")

   For j = 1 To 2
     sq = sn
     For jj = 0 To UBound(sq)
          c00 = "aaa_" & jj
          If jj <> 5 And jj <> 7 Then sq(jj) = sq(jj) & IIf(jj < 2, j, "") & "=""" & c00 & IIf(jj < 1, """/>", """")
        Next
        c01 = c01 & vbLf & Join(Filter(sq, "=")) & "/>"
   Next

   MsgBox c01
End Sub

Du siehst: wenn etwas leer ist (hier z.B. 5 und 7), wird nichts im String gesetzt.
Noch nicht richtig.

menuSeparator darf nur enthalten sein wenn "isSeparator" auf 1.
isSeparator ist nicht Bestandteil des XML-Codes, sondern nur ein Indikator für das Setzen des menuSeparators.

Die IDs "menuSeparator" und "button id" sind nicht korrekt. Es wird immernoch der Zähler an "id" angehängt anstatt an den Inhalt.

menuSpearator::
Falsch: <menuSeparator id1="0"/>
Richtig: <menuSeparator id="mnu1Separator1"/> (Soll sich zusammensetzen aus dem Inhalt von "separatorID" und dem Zähler lngMenuPos)

button id::
Falsch: <button id1="mnu1Button"
Richtig: <button id="mnu1Button1" (Soll sich zusammensetzen aus dem Inhalt von ButtonID und dem Zähler lngMenuPos)
Seiten: 1 2 3 4 5