Excel VBA: именованные диапазоны вообще не являются диапазонами? Несоответствие типа аргумента ByRef

Рассмотрим этот 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, r2 As Range объявляет r2 только как диапазон, ´r1` — Variant. Вам нужно написать Dim r1 As Range, r2 As RangeHow_to_Use_Dim_with_Multiple_Variables

Storax 17.08.2024 19:23

Ого.... Я занимаюсь этим уже некоторое время. Как это только сейчас стало проблемой???? В любом случае тым

Jason D. 17.08.2024 19:26
excelmacromastery.com/excel-vba-array/… Также применимо к варианту. Кроме того, всегда лучше объявлять переменную с правильным типом данных.
Storax 17.08.2024 19:42
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пропустили определение типа для r1:

   Dim r1 As Range, r2 As Range

Таким образом

   Dim r1, r2 As Range

он объявлен как вариант (по умолчанию):

   Dim r1 As Variant, r2 As Range

Для удобства установите «Требовать объявление переменной» в «Инструменты/Параметры/Редактор» и объявите каждую переменную требуемого типа. Тип Вариант требуется только в некоторых случаях.

Отличный ответ, тывм.

Jason D. 17.08.2024 19:42
Ответ принят как подходящий

В 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. Рассмотрите возможность объявления переменных в отдельных строках для лучшей читаемости. Помните, что переменные не инициализируются автоматически, поэтому инициализируйте их при необходимости.

Отличный ответ, тывм.

Jason D. 17.08.2024 19:43

Другие вопросы по теме