====== [VBA] PrintF AddOns ====== VB-Funktionen die dank [[..:PrintF]] erweitert werden können >Für die Ausgabe einiger Resultate verwendete ich die Funktion [[..:print_r]] ===== MsgBox ===== Ein typisches Beispiel ist ide MsgBox. Meistens hat man Meldungen die zusammengesetzt sind. Da eignet sich PrintF gut dazu, dies zu vereinfachen ==== vsMsgBox() ==== Ich habe für mich die Funktion msgbox() mit [[..:printf#vsprintf()]] erweitert, damit ich einfacher formatiert und zusammengesetzte Meldungen ausgeben kann. === Beispiel zu vsMsgBox()=== 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") ===Code zu vsMsgBox()=== '/** ' * 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 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 ==== vsMsgBoxSplit() ==== Und auf [[..:printf:addons#vsMsgBox()]] basierend und mit [[:vba:functions:array:#split2var()]] kombiniert === Beispiele zu vsMsgBoxSplit() === '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") === Code zu vsMsgBoxSplit() === '/** ' * 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 ===== Array ===== ==== array_walkf() ==== Analog zu [[..: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. === Beispiel zu array_walkf() === 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 ( [1] => 1 [2] => 2 [3] => 3 ) ( [1] => 6.3 [2] => 26.3 [3] => 126.3 ) === Code zu array_walkf() === '/** ' * 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 {{tag>VBA}}