Как передать диапазон в сабвуфер в Word VBA? - PullRequest
8 голосов
/ 07 апреля 2010

Я знаю, это звучит просто, но, похоже, это не так.

Если я пишу это в Word VBA, в нем всегда говорится «несовместимые типы» - почему? И как мне заставить это работать?

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

Ответы [ 3 ]

8 голосов
/ 07 апреля 2010

Нельзя вызывать Sub с круглыми скобками, кроме случаев, когда вы используете оператор Call.

Следовательно, вы должны использовать либо:

Call ProcessRange(r)

Или:

ProcessRange r

Причина в том, что в VBA (и VBS, VB6 тоже) скобки могут иметь много разных значений.

В вашем случае объект диапазона будет оценен перед передачей результата в ProcessRange. В этом случае это приводит к передаче string в подпрограмму, потому что свойство по умолчанию Range равно Text.

См. Эту статью для обзора: http://blogs.msdn.com/ericlippert/archive/2003/09/15/52996.aspx

4 голосов
/ 07 апреля 2010

Диапазон процессов равен sub, поэтому не вызывайте его в скобках. (Ошибка возникает из-за того, что (r) вызывает оценку r, которая возвращает значение свойства по умолчанию, которое не относится к типу range, поэтому не соответствует тому, что ожидает ProcessRange.

Используйте либо;

ProcessRange r

или

call ProcessRange(r)
3 голосов
/ 07 апреля 2010

Использование скобок Visual Basic предполагает, что вы вызываете функцию.

ProcessRange r

делает трюк

...