Variablen füllen mit Schleife
#1
Hallo!

      For lngMenuPos = strFrom To strTo
     
         strCaption = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "Caption", strConfigPath)
         strMacro = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "MacroName", strConfigPath)
         strButtonID = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "ButtonID", strConfigPath)
         strImageMSO = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "imageMSO", strConfigPath)
         strIsSeparator = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "isSeparator", strConfigPath)
         strSepName = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "separatorID", strConfigPath)
         strScreentip = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "screentip", strConfigPath)
         strSupertip = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "supertip", strConfigPath)
         strKeytip = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "key", strConfigPath)
         strTag = MenueinhaltEinlesen(strMenuPoint + CStr(lngMenuPos), "tag", strConfigPath)
         
     Next lngMenuPos


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


Mit diesem Code fülle ich Variablen. Nur sieht das (in meinen Augen) nicht elegant aus. Das kann man doch sicher per Schleife lösen (Schleifen sind nicht mein Fall!)? Z.B. die Variablen und die zugehörigen Parameter in jeweils ein Array packen und dann darauf die Schleife aufbauen? Aber ohne dass mehr Zeilen, oder genausoviele Zeilen wie bisher, herauskommen!?

Gruß, René
Top
#2
Hallo René,

das ist ja schon eine Schleife, die sich nicht noch weiter verkürzen lässt, da 10 verschiedene Variablen befüllt werden.
Nur könnte man hier doch gleich den letzten Wert strTo nehmen?

Gruß Uwe
Top
#3
(05.12.2016, 16:17)Kuwer schrieb: (...) Nur könnte man hier doch gleich den letzten Wert strTo nehmen? (...)
Das kann man nicht. strTo ist der letzte Eintrag in einer Konfigurationsdatei der ausgelesen werden soll .

PHP-Code:
[Menü1Eintrag1]
isSeparator=0
separatorID
=mnu1Separator
Caption
=Eintrag 1
MacroName
=onAction_Button
ButtonID
=mnu1Button
imageMSO
=FilesToolAddFiles
tag
=Tag1
screentip
=
supertip=
keytip=

[
Menü1Eintrag2]
isSeparator=0
separatorID
=mnu1Separator
Caption
=Eintrag 2
MacroName
=onAction_Button
ButtonID
=mnu1Button
imageMSO
=FileInternetFax
tag
=Tag2
screentip
=
supertip=
keytip

Darum geht es: http://www.rholtz-office.de/ribbonx/dyna...nue#Teil_5 (Funktion "ErstelleMenueInhalt"). Hatte gehofft den Code noch etwas kürzer und damit übersichtlicher zu bekommen. (Diesen Teil gibt es übrigens erst seit heute).
Top
#4
statt Variablen strCaption... strTag reicht ein Array (z.B. sn)

statt feste Werten Caption... tag  wäre ein Array sinnvoll, z.B. sp

Dann reicht

Code:
sub M_snb()
  sp=split("Caption MacroName ButtonId inageMSO isSeparator separatorID screentip supertip key tag")
  For j=0 to ubound(sp)
    sn(j)= MenueinhaltEinlesen(strMenuPoint & j, sp(j), strConfigPath)
  next
End Sub
Top
#5
Fehlermeldung: Argument ByRef unverträglich (das zweite Argument sp(j) markiert)
Top
#6
Dann solltest du die Code von MenueinhaltEinlesen zeigen müssen. (du hattest nicht erwähnt was das ist (ein sub, array, Function ,oder....)

Und was sind 'strMenuPoint' und 'strConfigPath' ?
Top
#7
In #3 hatte ich einen Link gesetzt, dort steht was ich verkürzen möchte. Das zweite Attribut (sp(j)) erwartet einen String.

strConfigPath = Der Pfad zur Konfigurationsdatei
strMenuPoint = Das sind die Einzelnen Punkte (siehe #3). Übergeben werden z.B. "Menü1Eintrag" (übergeben durch das Ribbon-Callback) ergänzt durch den Zähler (CStr(lngMenuPos)).
Top
#8
Hier mal "komplett". Die "Declare Function" habe ich mal anders benannt und die Attribute "eingedeutscht" (im Internet heisst es immer nur Declare Function GetPrivateProfileString), damit auch Anfänger wissen wo sie was angeben und wie deklarieren müssen.

Option Private Module
Option Explicit

Private Declare Function ReadXMLLayout Lib "kernel32.dll" Alias "GetPrivateProfileStringA" ( _
        ByVal MenueName As String, ByVal MenueAttribut As String, ByVal NullString As String, _
        ByVal LeerZeichen As String, ByVal Groesse As Long, ByVal INIPfad As String) As Long


Private Const MAX_COUNT = 255

 Public Function MenueinhaltEinlesen(strMenueName As String, strMenueAttribut As String, strINIPfad As String) As String

     Dim lngInhalt  As Long
     Dim strReturn  As String

     strReturn = Space$(MAX_COUNT)

     lngInhalt = ReadXMLLayout(strMenueName, strMenueAttribut, vbNullString, strReturn, MAX_COUNT, strINIPfad)

     MenueinhaltEinlesen = Left$(strReturn, lngInhalt)

 End Function

Sub M_snb()

'########   Beginn Deklarationen ###### 
   Dim strConfPath      As String
   Dim strStartZeile    As String
   Dim strInhalt        As String
   Dim strEndZeile      As String
   Dim sn
   Dim sp
'########   Ende Deklarationen ###### 


'########   Konfigurationsdatei ###### 
  strConfPath = ThisDocument.Path & "\" & Left(ThisDocument.Name, InStr(1, ThisDocument.Name, ".") - 1) & ".ini"
  
  sp = Split("Caption MacroName ButtonId imageMSO isSeparator separatorID screentip supertip key tag")
  
  For j = 0 To Ubound(sp)
     sn(j) = MenueinhaltEinlesen(strMenuPoint & j, sp(j), strConfigPath)
  Next
  
End Sub


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

Top
#9
Teste mal::


Code:
Sub M_snb()
    strConfigPath = Split(ThisDocument.FullName, ".")(0) & ".ini"
    strMenuPoint="snb"

   sp = Split("Caption MacroName ButtonId imageMSO isSeparator separatorID screentip supertip key tag")
   sn = sp
   For j = 0 To UBound(sp)
      sn(j) = MenueinhaltEinlesen(strMenuPoint & j, sp(j), strConfigPath)
      msgbox sn(j)
   Next
End Sub

Function MenueinhaltEinlesen(c01, c02, c03)
     MsgBox c01 & vbTab & c02 & vbTab & c03
    MenueinhaltEinlesen= c01 & vbTab & c02 & vbTab & c03
End Function

NB. es gab kein strMenuPoint
und strConfigPath <>strConfPath

NB2. In Word braucht man kein API für privateprofilestring:


z.B.

Code:
c00 = "HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\OMI Account Manager"

    msgbox  System.PrivateProfileString("", c00, "Default Mail Account")
    msgbox  System.PrivateProfileString("", c00 & "\Accounts\" & System.PrivateProfileString("", c00, "Default Mail Account"), "Account name")
Top
#10
Wenn ich die Klammereinträge undeklariert lasse funktioniert es. Sobald ich die Deklarationen setze funktioniert es nicht. Das Weglassen der Deklarationen empfinde ich als unsauber. Dann funktioniert ees so (mit Deinem Code) leider nicht. Schade.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste