views:

48

answers:

3

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?

Thank you very much for your help!

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
+1  A: 

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)
Alex K.
+3  A: 

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 which in this case leads to a string being passed to that 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

DR
+1  A: 

Using parenthesis visual basic assumes you're calling a function.

ProcessRange r

does the trick

deltreme