VB-Funktionen die dank PrintF erweitert werden können
Für die Ausgabe einiger Resultate verwendete ich die Funktion print_r
Ein typisches Beispiel ist ide MsgBox. Meistens hat man Meldungen die zusammengesetzt sind. Da eignet sich PrintF gut dazu, dies zu vereinfachen
Ich habe für mich die Funktion msgbox() mit vsprintf() erweitert, damit ich einfacher formatiert und zusammengesetzte Meldungen ausgeben kann.
Dim params(1) As Variant params(0) = "Yaslaw" params(1) = 987.65 Call vsMsgBox(params, "Hallo %s. Du hast %f Punkte.\nGut gemacht %1$s", vbOKOnly, "Punkte von %s")
'/** ' * Erweiterung der msgbox() mittels vsprintf() ' * Auf Prompt und Title wird ein vsprintf() mit den übergebenen Paramtern ausgeführt ' * @example: ' * Dim params(1) As Variant ' * params(0) = "Yaslaw" ' * params(1) = 987.65 ' * Call vsMsgBox(params, "Hallo %s. Du hast %f Punkte.\nGut gemacht %1$s", vbOKOnly, "Punkte von %s") ' * @ressource vsPrintF http://wiki.yaslaw.info/dokuwiki/doku.php/vbaprintf#vsprintf ' * @param Array<Variant> Die Parameter für vsPrintf() ' * @param see msgbox() ' * @return see msgbox() ' */ Public Function vsMsgBox( _ ByRef iParams() As Variant, _ ByVal iPrompt As String, _ Optional ByVal iButtons As VbMsgBoxStyle = vbOKOnly, _ Optional ByVal iTitle As String, _ Optional ByVal iHelpFile As String, _ Optional ByVal iHelpContext As Long _ ) As VbMsgBoxResult vsMsgBox = msgBox( _ Prompt:=vsPrintF(iPrompt, iParams), _ buttons:=iButtons, _ title:=vsPrintF(iTitle, iParams), _ HelpFile:=iHelpFile, _ Context:=iHelpContext) End Function
Und auf vsMsgBox() basierend und mit split2var() kombiniert
'Mit dem Standart Delimiter " " Call vsMsgBoxSplit("Robert 123.45",, "Hallo %s. Du hast %f Punkte.\nGut gemacht %1$s", vbOKOnly, "Punkte von %s") 'mit eigenem Delimiter Call vsMsgBoxSplit("Yaslaw;987.65", ";", "Hallo %s. Du hast %f Punkte.\nGut gemacht %1$s", vbOKOnly, "Punkte von %s")
'/** ' * Erweiterung der msgbox() mittels vsprintf() uns split() ' * Auf Prompt und Title wird ein vsprintf() mit den übergebenen Paramtern ausgeführt ' * @example: Call vsMsgBoxSplit("Yaslaw;987.65", ";", "Hallo %s. Du hast %f Punkte.\nGut gemacht %1$s", vbOKOnly, "Punkte von %s") ' * @ressource vsPrintF http://wiki.yaslaw.info/dokuwiki/doku.php/vbaprintf#vsprintf ' * @ressource vsMsgBox() http://wiki.yaslaw.info/dokuwiki/doku.php/vbaprintf#vsmsgbox ' * @ressource split2var() http://wiki.yaslaw.info/dokuwiki/doku.php/vbvbaarrayfunctions#split2var ' * @ressource array2var() http://wiki.yaslaw.info/dokuwiki/doku.php/vbvbaarrayfunctions#array2var ' * @param String String mit den Werten der sich mittels split() in einen Array wandelt ' * @param String Delimiter für den split(). Default: " " ' * @param see msgbox() ' * @return see msgbox() ' */ Public Function vsMsgBoxSplit( _ ByVal iExpression As String, _ Optional ByVal iDelimiter As String = " ", _ Optional ByVal iPrompt As String = vbNullString, _ Optional ByVal iButtons As VbMsgBoxStyle = vbOKOnly, _ Optional ByVal iTitle As String, _ Optional ByVal iHelpFile As String, _ Optional ByVal iHelpContext As Long _ ) As VbMsgBoxResult vsMsgBoxSplit = vsMsgBox( _ split2Var(iExpression, iDelimiter), _ iPrompt, _ iButtons, _ iTitle, _ iHelpFile, _ iHelpContext _ ) End Function
Analog zu [VBA] array_walk() eine Funktion die mittels printF funktioniert. Die Werte werden mittels sPrintF() in die Formel (Pattern) geschrieben. Dieser dann mit eval ausgeführt. Das kanne in Funktionsaufruf oder eine Formel etc sein.
Verschiedene Potenzen auf 5 anwenden und 1.3 dazuzählen
Public Sub testArrayWalkF() Dim values As Variant Dim basis As Integer: basis = 5 Dim pot(1 To 3) As Integer: pot(1) = 1: pot(2) = 2: pot(3) = 3 print_r pot 'Aufruf: 'Formel: basis hoch Array-Wert + 1.3 values = array_walkf("%2$d ^ %1$d + %3$f", pot, basis, 1.3) print_r values End Sub
<Integer()> ( [1] => <Integer> 1 [2] => <Integer> 2 [3] => <Integer> 3 ) <Variant()> ( [1] => <Decimal> 6.3 [2] => <Decimal> 26.3 [3] => <Decimal> 126.3 )
'/** ' * Wendet eine sPrintF auf jedes Element eines Arrays an ' * ' * @example Jedes Element eines Arrays trimmen ' * Dim values As Variant ' * values = array_walkf("trim('%s')", split("ab, cd, de", ",")) ' * @example Ein Date-Array in ein String-Array mit dem Datumsformat mm.dd.yyyy umformatieren ' * Dim dates(1 To 2) As Date ' * Dim dateString() As Variant ' * dates(1) = "14.7.2013" ' * dates(2) = "3.7.2013" ' * dateString = array_walkf("format(%s, '%s')", dates, "mm.dd.yyyy") ' * @example Formeln anstelle von Funktionen: Verschiedene Potenzen auf 5 anwenden und 1.3 dazuzählen ' * Dim a As Integer: a = 5 ' * Dim pot(1 To 3) As Integer: pot(1) = 1: pot(2) = 2: pot(3) = 2 ' * values = array_walkf("%2$d ^ %1$d + %3$f", pot, a, 1.3) ' * ' * @param String Name der Funktion, die auf jedes Element angewendet werden soll ' * @param Array<> Array mit den zu bearbeitenden Werten ' * @param ParamArray Die folgenden Werte werden so fix an die Funktion mitgegeben ' * @return Array<> Resultat ' */ Public Function array_walkf(ByVal iPattern As String, ByRef iArray As Variant, ParamArray iParams() As Variant) As Variant Dim i Dim value Dim Params() As Variant Dim retArray() As Variant ReDim retArray(LBound(iArray) To UBound(iArray)) 'Die zusätzlichen Paramter für den eval() vorbereiten. 'Am Anfang wird noch ein leerer Eintrag hinzugefügt. Dort kommt dann der Wert ais dem Array hinein ReDim Preserve Params(UBound(iParams) + 1) For i = LBound(iParams) To UBound(iParams) Params(i + 1) = iParams(i) Next i 'Funktion mittels eval() auf jedes Element anwenden For i = LBound(iArray) To UBound(iArray) Params(0) = iArray(i) retArray(i) = Eval(vsPrintF(iPattern, Params)) Next i array_walkf = retArray End Function