2010-04-07 7 views
8

Je sais que cela semble simple, mais apparemment ce n'est pas le cas.Comment transmettre une plage à un sous-marin dans Word VBA?

Si j'écris ceci dans Word VBA, on dit toujours "types incompatibles" - pourquoi? Et comment puis-je le faire fonctionner?

Sub GetRange() 
    Dim r As Range 
    Set r = ActiveDocument.Paragraphs(5).Range 

    ProcessRange (r) 
End Sub 

Sub ProcessRange(r As Range) 
    Debug.Print "This generates an error (incompatible types)- why?" 
End Sub 

Répondre

4

Gamme Process est un sub alors ne pas invoquer avec parenthèses. (L'erreur se produit parce que (r) cause r à évaluer qui retourne sa valeur de propriété par défaut qui est pas de type range donc discordances ce que ProcessRange attend

Utilisez soit;.

ProcessRange r 

ou

call ProcessRange(r) 
8

Il n'est pas autorisé d'appeler un Sub avec des parenthèses, sauf si vous utilisez l'instruction Call.

Par conséquent, vous devez utiliser soit:

Call ProcessRange(r) 

Ou:

ProcessRange r 

La raison est que dans VBA (et VBS, VB6, aussi) la parenthèse peut avoir beaucoup de significations différentes.

Dans votre cas, l'objet plage sera évalué avant de transmettre le résultat à ProcessRange. Dans ce cas, un string est passé au sous-marin, car la propriété par défaut de Range est Text.

Voir cet article pour un aperçu: http://blogs.msdn.com/ericlippert/archive/2003/09/15/52996.aspx

3

utilisant les parenthèses de Visual Basic suppose que vous appelez une fonction.

ProcessRange r 

le tour est joué