web-dev-qa-db-fra.com

MsgBox "" vs MsgBox () dans VBScript

J'essaie d'écrire un script VBScript et j'utilise des fonctions telles que Randomize et MsgBox. Je suis curieux de savoir quelle est la différence entre utiliser () et ne pas les utiliser. Par exemple:

Randomize - Cette ligne fonctionne.

Randomize() - Cette ligne fonctionne également.

MsgBox "Hello world!" - Cela fonctionne.

MsgBox ("Hello world!") - Cela fonctionne aussi.

Le script sera exécuté sur plusieurs machines avec différentes versions de Windows (au moins Windows XP). Je me demande si j'aurais des problèmes de compatibilité/syntaxe en utilisant ces fonctions.

28
user1862387

Un morceau de code appelable (routine) peut être un Sub (appelé pour un effet secondaire/ce qu’il fait) ou une Fonction (appelée pour sa valeur de retour) ou un mélange des deux. En tant que docs pour MsgBox

Affiche un message dans une boîte de dialogue, attend que l'utilisateur clique sur un bouton et renvoie une valeur indiquant le bouton sur lequel l'utilisateur a cliqué.

MsgBox (Invite [ boutons] [ titre] [ fichier d'aide, contexte])

indiquer, cette routine est du troisième type.

Les règles syntaxiques de VBScript sont simples:

Utilise la liste de paramètres () pour appeler une (routine en tant que) Fonction

Si vous souhaitez afficher un message à l'utilisateur et devez connaître la réponse de l'utilisateur:

Dim MyVar
MyVar = MsgBox ("Hello World!", 65, "MsgBox Example")
   ' MyVar contains either 1 or 2, depending on which button is clicked.

N'utilisez pas la liste de paramètres () lors de l'appel d'une (routine en tant que) Sub

Si vous souhaitez afficher un message à l'utilisateur et que la réponse ne vous intéresse pas:

MsgBox "Hello World!", 65, "MsgBox Example"

Cette belle simplicité est gâchée par:

Le défaut de conception de using () pour les listes de paramètres et pour forcer la sémantique appel par valeur

>> Sub S(n) : n = n + 1 : End Sub
>> n = 1
>> S n
>> WScript.Echo n
>> S (n)
>> WScript.Echo n
>>
2
2

S (n) ne signifie pas "appel S avec n", mais "appel S avec une copie de la valeur de n". Les programmeurs qui voient

>> s = "value"
>> MsgBox(s)

Les "travaux" sont une surprise quand ils essaient:

>> MsgBox(s, 65, "MsgBox Example")
>>
Error Number:       1044
Error Description:  Cannot use parentheses when calling a Sub

Clémence du compilateur en ce qui concerne empty () dans un sous-appel. Le "pur" Sub Randomize (appelé pour l'effet secondaire de l'établissement de la graine aléatoire) peut être appelé par

Randomize()

bien que le () ne puisse signifier "donnez-moi votre valeur de retour) ni" passe quelque chose par valeur ". Un peu plus de rigueur ici obligerait les programmeurs à être conscients de la différence

Randomize n

et

Randomize (n)

L'instruction Call qui permet de paramétrer list () dans les sous-appels:

s = "valeur" Appelez MsgBox (s, 65, "Exemple de MsgBox")

qui encouragent davantage les programmeurs à utiliser () sans réfléchir.

(Basé sur Que voulez-vous dire "ne peut pas utiliser de parenthèses?" )

27
Ekkehard.Horner

À ma connaissance, voici les règles pour appeler des sous-routines et des fonctions dans VBScript:

  • Lorsque vous appelez un sous-programme ou une fonction dans laquelle vous ignorez la valeur de retour, n'utilisez pas de parenthèse
  • Lorsque vous appelez une fonction pour laquelle vous affectez ou utilisez la valeur renvoyée, placez les arguments entre parenthèses.
  • Lors de l'appel d'un sous-programme à l'aide du mot-clé Call, mettez les arguments entre parenthèses.

Puisque vous n'utiliserez probablement pas le mot-clé Call, vous devez uniquement connaître la règle si vous appelez une fonction et souhaitez affecter ou utiliser la valeur de retour, vous devez placer les arguments entre parenthèses. Sinon, , n’utilisez pas de parenthèses.

Voici quelques exemples:

  • WScript.Echo 1, "two", 3.3 - appeler un sous-programme

  • WScript.Echo(1, "two", 3.3) - erreur de syntaxe

  • Call WScript.Echo(1, "two", 3.3) - le mot clé Call nécessite une parenthèse

  • MsgBox "Error" - appelant une fonction "comme" un sous-programme

  • result = MsgBox("Continue?", 4) - appeler une fonction où la valeur de retour est utilisée

  • WScript.Echo (1 + 2)*3, ("two"), (((3.3))) - appeler un sous-programme dans lequel les arguments sont calculés à l'aide d'expressions impliquant des parenthèses (notez que si vous entourez une variable par une parenthèse dans une liste d'arguments, le comportement d'appel par référence est remplacé par un appel par valeur)

  • WScript.Echo(1) - apparemment, il s'agit d'un appel de sous-programme utilisant des parenthèses, mais en réalité, l'argument est simplement l'expression (1) et c'est ce qui a tendance à confondre les utilisateurs habitués à d'autres langages de programmation où vous devez spécifier les parenthèses lors de l'appel des sous-routines

  • Je ne suis pas sûr de savoir comment interpréter votre exemple, Randomize(). Randomize est un sous-programme qui accepte un seul argument optionnel. Même si le sous-programme ne contient aucun argument, il est acceptable de l'appeler avec une paire de parenthèses vide. Il semble que l’analyseur VBScript ait une règle spéciale pour une liste d’arguments vide. Cependant, mon conseil est d’éviter cette construction spéciale et d’appeler tout sous-programme sans utiliser de parenthèse.

Je suis à peu près sûr que ces règles syntaxiques s'appliquent à différentes versions de systèmes d'exploitation.

10
Martin Liversage

Vous utilisez simplement un seul paramètre dans la fonction, donc cela fonctionne bien dans les deux cas suivants:

MsgBox "Hello world!"
MsgBox ("Hello world!")

Mais lorsque vous utiliserez plus d'un paramètre, la méthode In VBScript mettra une erreur entre parenthèses et sans parenthèse fonctionnera normalement, comme suit:

MsgBox "Hello world!", vbExclamation

Le code ci-dessus fonctionnera sans heurts mais

MsgBox ("Hello world!", vbExclamation)

va jeter une erreur. Essaye ça!! :-)

3
Shivam Gupta

Vous devez distinguer des sous-routines et des fonctions dans vba ... En général (pour autant que je sache), les sous-routines ne renvoient rien et les parenthèses environnantes sont facultatives. Pour les fonctions, vous devez écrire les parenthèses.

Comme pour votre exemple, MsgBox n'est pas une fonction mais une sous-routine et les parenthèses sont donc facultatives dans ce cas. Une exception avec les fonctions est que, lorsque vous n'affectez pas la valeur renvoyée ou lorsque la fonction ne consomme pas de paramètre, vous pouvez également supprimer les parenthèses.

Cette réponse entre un peu plus dans les détails, mais vous devriez fondamentalement être du côté de la sauvegarde, lorsque vous fournissez des parenthèses pour des fonctions et les laissez de côté pour des sous-routines.

1
Tom