Вопрос или проблема
Я пытаюсь создать двумерный статический массив, используя метод, описанный здесь. Раньше это работало отлично, но после ввода новых значений я получаю ошибку несоответствия типа при попытке чтения из массива. Я как бы предполагаю, что это просто опечатка или что-то подобное, но я никак не могу её найти.
Видит ли кто-нибудь здесь, в чем моя ошибка?
Option Explicit
Option Base 1
Sub test2()
Dim arr As Variant
arr = Evaluate( _
"{2, 4, 5, 2, 4, 5, 2, 3, 5, 2, 3, 5, 2, 3, 2, 3, 2, 3;" & _
"4, 1, 2, 4, 1, 2, 4, 5, 2, 4, 5, 2, 3, 5, 3, 5, 3, 5;" & _
"1, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 4, 5, 2, 5, 2, 3, 5;" & _
"3, 5, 1, 3, 5, 1, 3, 4, 1, 3, 4, 1, 2, 4, 2, 4, 2, 4;" & _
"5, 2, 3, 5, 2, 3, 5, 1, 3, 5, 1, 3, 4, 1, 4, 1, 4, 1}" _
)
Debug.Print arr(1, 1)
End Sub
Я немного больше поискал ответ после того, как разместил свой вопрос здесь.
В ходе этого поиска я обнаружил, что максимальная длина выражения, которое может обработать функция Application.Evaluate, составляет 255 символов. Добавив больше значений в строку, я превысил этот предел, что привело к тому, что массив не инициализировался.
Надо было внимательнее прочитать документацию =/
(Я решил свою проблему, удалив пробелы после запятых, но для жесткого кодирования еще больших массивов придется реализовывать другой подход)
Ответ или решение
Теория
Ошибка несоответствия типов может возникнуть в разных сценариях, особенно при работе с массивами в VBA. В данном случае ошибка связана с использованием функции Evaluate
для создания двумерного массива. Evaluate
позволяет оценивать строки, содержащие формулы, в качестве кода. Однако его использование ограничено определёнными условиями, одно из которых — максимальная допустимая длина строки оцениваемого выражения, равная 255 символам.
Пример
В представленном коде массив формируется с использованием операции Evaluate
на строковой конкатенации:
arr = Evaluate( _
"{2, 4, 5, 2, 4, 5, 2, 3, 5, 2, 3, 5, 2, 3, 2, 3, 2, 3;" & _
"4, 1, 2, 4, 1, 2, 4, 5, 2, 4, 5, 2, 3, 5, 3, 5, 3, 5;" & _
"1, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 4, 5, 2, 5, 2, 3, 5;" & _
"3, 5, 1, 3, 5, 1, 3, 4, 1, 3, 4, 1, 2, 4, 2, 4, 2, 4;" & _
"5, 2, 3, 5, 2, 3, 5, 1, 3, 5, 1, 3, 4, 1, 4, 1, 4, 1}" _
)
В процессе добавления новых элементов к строке была превысена максимальная длина строки в 255 символов, и как следствие, функция Evaluate
не смогла корректно обработать переданные данные, и массив не был инициализирован.
Применение
Чтобы избежать этой ошибки в будущем, следует либо следить за длиной передаваемой строки, как это было сделано путём удаления пробелов, либо использовать другой метод для создания массива, если планируется работа с большими объёмами данных. Например, можно инициировать массив другим способом, не используя Evaluate
, или использовать цикл для динамического заполнения массива:
Dim arr(5, 18) As Integer
Dim i As Integer, j As Integer
' Заполняем массив значениями
For i = 1 To 5
For j = 1 To 18
arr(i, j) = ' Ваше значение
Next j
Next i
Такой метод позволяет управлять процессом заполнения массива более гибко, избегая ограничений на длину строк, присущих Evaluate
.