vba function - VB-Wie prüfe ich, ob optionale Argumente geliefert werden oder nicht?




parameter default (6)

Wenn IsMissing (arg) Dann ...

Wie prüfe ich, ob optionale Argumente angegeben sind oder nicht? - in VB6 / VBA

Function func (Optional ByRef arg As Variant = Nothing)

    If arg Is Nothing Then   <----- run-time error 424 "object required"
        MsgBox "NOT SENT"
    End If

End Function 

Verwenden Sie IsMissing :

If IsMissing(arg) Then
    MsgBox "Parameter arg not passed"
End If

Wenn ich mich jedoch richtig erinnere, funktioniert dies nicht, wenn ein Standard für das Argument angegeben wird, und in jedem Fall macht es das Verwenden des Standardarguments eher überflüssig.


Sie können die IsMissing () -Funktion verwenden. Dies funktioniert jedoch nur mit dem Variant-Datentyp.


Wenn Sie eine String- oder Zahlenvariable verwenden, können Sie den Wert der Variablen überprüfen. Beispielsweise:

Function func (Optional Str as String, Optional Num as Integer)

If Str = "" Then
    MsgBox "NOT SENT"
End If

If Num = 0 Then
    MsgBox "NOT SENT"
End If

End Function

Dadurch können Sie nichtvariable Variablen verwenden.


Bei einer Variante würde ich die NZ- Funktion verwenden:

Function func (Optional ByRef arg As Variant = Nothing)
    If nz ( arg, 0 ) = 0 Then
        MsgBox "NOT SENT"
    End If
End Function 

Es kann auch mit anderen Datentypen verwendet werden, denken Sie daran, dass Zero weder als Null noch als Nulllänge gilt, also gibt nz(0,"") immer noch 0 zurück.


Bevorzugte Methode: Straight Bash ohne getopt [s]

Ich habe die Frage ursprünglich beantwortet, als das OP fragte. Dieses Q / A bekommt viel Aufmerksamkeit, also sollte ich auch den nicht-magischen Weg anbieten, dies zu tun. Ich werde die Antwort von guneysus erweitern, um das fiese sed zu beheben und Tobias Kienzlers Vorschlag einzubeziehen .

Zwei der häufigsten Methoden zum Übergeben von Schlüsselwertpaarargumenten sind:

Straight Bash Space Getrennt

Verwendung ./myscript.sh -e conf -s /etc -l /usr/lib /etc/hosts

#!/bin/bash

POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -e|--extension)
    EXTENSION="$2"
    shift # past argument
    shift # past value
    ;;
    -s|--searchpath)
    SEARCHPATH="$2"
    shift # past argument
    shift # past value
    ;;
    -l|--lib)
    LIBPATH="$2"
    shift # past argument
    shift # past value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    shift # past argument
    ;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters

echo FILE EXTENSION  = "${EXTENSION}"
echo SEARCH PATH     = "${SEARCHPATH}"
echo LIBRARY PATH    = "${LIBPATH}"
echo DEFAULT         = "${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 "$1"
fi

Straight Bash entspricht getrennt

Verwendung ./myscript.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts

#!/bin/bash

for i in "[email protected]"
do
case $i in
    -e=*|--extension=*)
    EXTENSION="${i#*=}"
    shift # past argument=value
    ;;
    -s=*|--searchpath=*)
    SEARCHPATH="${i#*=}"
    shift # past argument=value
    ;;
    -l=*|--lib=*)
    LIBPATH="${i#*=}"
    shift # past argument=value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument with no value
    ;;
    *)
          # unknown option
    ;;
esac
done
echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "LIBRARY PATH    = ${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 $1
fi

Zum besseren Verständnis von ${i#*=} suchen Sie in diesem Handbuch nach "Substring Removal". Es ist funktional äquivalent zu `sed 's/[^=]*=//' <<< "$i"` was einen unnötigen Subprozess oder `echo "$i" | sed 's/[^=]*=//'` aufruft `echo "$i" | sed 's/[^=]*=//'` was zwei unnötige Subprozesse aufruft.

Getopt [s] benutzen

von: http://mywiki.wooledge.org/BashFAQ/035#getopts

Benutze niemals getopt (1). getopt kann keine leeren Argumente oder Argumente mit eingebetteten Leerzeichen verarbeiten. Bitte vergiss, dass es jemals existiert hat.

Die POSIX-Shell (und andere) bieten getopts die stattdessen sicher verwendet werden können. Hier ist ein getopts Beispiel:

#!/bin/sh

# A POSIX variable
OPTIND=1         # Reset in case getopts has been used previously in the shell.

# Initialize our own variables:
output_file=""
verbose=0

while getopts "h?vf:" opt; do
    case "$opt" in
    h|\?)
        show_help
        exit 0
        ;;
    v)  verbose=1
        ;;
    f)  output_file=$OPTARG
        ;;
    esac
done

shift $((OPTIND-1))

[ "$1" = "--" ] && shift

echo "verbose=$verbose, output_file='$output_file', Leftovers: [email protected]"

# End of file

Die Vorteile von getopts sind:

  1. Es ist tragbar und wird zB in Dash funktionieren.
  2. Es kann Dinge wie -vf filename in der erwarteten Unix-Art automatisch behandeln.

Der Nachteil von getopts ist, dass es nur kurze Optionen ( -h , nicht --help ) ohne Tricks behandeln kann.

Es gibt ein getopts-Tutorial, das erklärt, was die ganze Syntax und die Variablen bedeuten. In bash gibt es auch help getopts , die informativ sein können.





vba function vb6 arguments optional-arguments