Рассмотрим этот MWE:
Option Explicit
Sub test()
Dim r1, r2 As Range
Set r1 = Worksheets("MySheet").Range("MyNamedRange")
Set r2 = NewRange(r1)
End Sub
Function NewRange(rng As Range) As Range
Set NewRange = Offset(rng, 1, 1)
End Function
Когда я запускаю test()
, он говорит: «Несоответствие типа аргумента ByRef» и выделяет r1
, который находится в строке.
Set r2 = NewRange(r1)
Что я делаю неправильно?
Ого.... Я занимаюсь этим уже некоторое время. Как это только сейчас стало проблемой???? В любом случае тым
Вы пропустили определение типа для r1:
Dim r1 As Range, r2 As Range
Таким образом
Dim r1, r2 As Range
он объявлен как вариант (по умолчанию):
Dim r1 As Variant, r2 As Range
Для удобства установите «Требовать объявление переменной» в «Инструменты/Параметры/Редактор» и объявите каждую переменную требуемого типа. Тип Вариант требуется только в некоторых случаях.
Отличный ответ, тывм.
В VBA вы можете объявить несколько переменных в одном операторе, разделяя каждую переменную запятой. Однако есть некоторые важные детали и потенциальные подводные камни, о которых следует знать.
Объявление переменных в одном операторе Чтобы объявить несколько переменных в одной строке, вы просто перечислите их через запятую и укажите их типы данных:
Dim var1 As Integer, var2 As String, var3 As Double
In this example:
var1 is declared as an Integer.
var2 is declared as a String.
var3 is declared as a Double.
Если вы явно не укажете тип каждой переменной, только последняя переменная будет иметь указанный тип, а остальные по умолчанию будут иметь значение Variant, что может привести к непредвиденному поведению.
Dim var1, var2, var3 As Integer ' Only var3 is Integer; var1 and var2 are Variant
Правильный способ:
Dim var1 As Integer, var2 As Integer, var3 As Integer ' All three are Integer
Тип данных по умолчанию (вариант): Если вы объявляете переменные без указания типа, по умолчанию они имеют значение Variant, которое может хранить данные любого типа, но менее эффективно с точки зрения производительности и использования памяти.
Dim var1, var2, var3 ' All are Variant
Рекомендация: всегда указывайте тип данных, чтобы избежать непреднамеренного использования Variant.
Читабельность: Хотя объявление нескольких переменных в одной строке может сэкономить место, оно также может ухудшить читаемость вашего кода, особенно если переменные имеют разные типы. Зачастую проще объявить каждую переменную в отдельной строке, особенно в сложных скриптах.
Dim var1 As Integer
Dim var2 As String
Dim var3 As Double
Инициализация: Когда вы объявляете несколько переменных, ни одна из них не инициализируется (не присваивается значение) автоматически. Они будут содержать значения по умолчанию (например, 0 для числовых типов, пустая строка для строк, ничего для типов объектов). Если вам нужно их инициализировать, вы должны сделать это явно:
Dim var1 As Integer = 10, var2 As String = "Hello", var3 As Double = 5.5
Краткое содержание Явно объявите тип каждой переменной, чтобы избежать неожиданных типов Variant. Рассмотрите возможность объявления переменных в отдельных строках для лучшей читаемости. Помните, что переменные не инициализируются автоматически, поэтому инициализируйте их при необходимости.
Отличный ответ, тывм.
Это потому, что вы не указали
r1
как диапазон.Dim r1, r2 As Range
объявляетr2
только как диапазон, ´r1` —Variant
. Вам нужно написатьDim r1 As Range, r2 As Range
How_to_Use_Dim_with_Multiple_Variables