User Tools

Site Tools


vba:functions:printf:addons

[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 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()

vsMsgBox.bas
'/**
' * 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

vsMsgBoxSplit()

Und auf vsMsgBox() basierend und mit 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()

vsMsgBoxSplit.bas
'/**
' * 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 [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.

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
<Integer()> (
    [1] => <Integer> 1
    [2] => <Integer> 2
    [3] => <Integer> 3
)
<Variant()> (
    [1] => <Decimal> 6.3
    [2] => <Decimal> 26.3
    [3] => <Decimal> 126.3
)

Code zu array_walkf()

array_walkf.bas
'/**
' * 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
vba/functions/printf/addons.txt · Last modified: 09.12.2013 09:39:54 (external edit)