Ошибка несоответствия типов при чтении из двумерного массива, созданного с помощью evaluate.

Вопрос или проблема

Я пытаюсь создать двумерный статический массив, используя метод, описанный здесь. Раньше это работало отлично, но после ввода новых значений я получаю ошибку несоответствия типа при попытке чтения из массива. Я как бы предполагаю, что это просто опечатка или что-то подобное, но я никак не могу её найти.

Видит ли кто-нибудь здесь, в чем моя ошибка?

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.

Оцените материал
Добавить комментарий

Капча загружается...