Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I pass a Range to a Sub in Word VBA?

Tags:

range

ms-word

vba

I know this sounds simple, but seemingly it is not.

If I write this in Word VBA, it always says "incompatible types" - why? And how do I make it work?

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
like image 272
markwest Avatar asked Apr 07 '10 12:04

markwest


2 Answers

It is not allowed to call a Sub with parenthesis, except if you are using the Call statement.

Hence you have to use either:

Call ProcessRange(r)

Or:

ProcessRange r

The reason for that is that in VBA (and VBS, VB6, too) the parenthesis can have a whole lot of different meanings.

In your case the range object will be evaluated before passing the result to ProcessRange. In this case it leads to a string being passed to the sub, because the default property of Range is Text.

See this article for an overview: http://blogs.msdn.com/ericlippert/archive/2003/09/15/52996.aspx

like image 73
Daniel Rikowski Avatar answered Sep 23 '22 18:09

Daniel Rikowski


Process Range is a sub so don't invoke it with parentheses. (The error occurs because (r) causes r to be evaluated which returns its default property value which isn't of type range so mismatches what ProcessRange expects.

Use either;

ProcessRange r

or

call ProcessRange(r)
like image 37
Alex K. Avatar answered Sep 23 '22 18:09

Alex K.