Робота з масивами в VBA при роботі з Excel, особливо при роботі з даними з робочого листа, може стати складною через непередбачувану зміну розмірів масивів. Один із поширених випадків цього стосується передачі діапазону з робочого листа в масив – масив може змінити розмір непередбачувано, що призводить до помилок та неефективності вашого коду.
1 |
Розмір масива змінюється при передачі діапазону з робочого листа. Я прочитав різні запитання, що стосуються масивів, їх розмірів та динамічних проти статичних масивів. Я також розумію, що існує така річ, як затриманий масив, який є масивом масивів, якщо я правильно розумію. Мені відомо, що статичні масиви не можуть бути змінені в розмірах і встановлюються при їх розмірності. Dim myStArray (1 до 3, 1 до 3) як Integer Динамічний масив може бути змінений в розмірах, і може бути збережений лише останній розмір, якщо це потрібно, але, здається, ви можете це зробити лише з типом variant. Dim myDyArray () як варіант ReDim MyDyArray (3,3) Коли я дивлюся на MyDyArray у вікні locals, я бачу MyDyArray + і, якщо я розгорну плюс, я отримую 3 підмасиви з усіма елементами, які є порожніми. коли я призначаю діапазон робочого листа масиву, який менший, ніж перезавантажений розмір масиву, масив зменшується, щоб відповідати розміру діапазону, навіть якщо він не був ReDim'ed. MyDyArray = ThisWorkbook.Worksheet (1) .Range ("A3:C3") Після такого рядка, коли я дивлюся в locals, там є лише 1 підмасив, а інші 2 порожніх масиви зникають. Крім того, коли я потім намагаюся отримати доступ до MyDyArray (2,1), я отримаю помилку, і в вікні перегляду скажуть, що це підскрипт поза межами. Моє розуміння полягає в тому, що найшвидший і ефективний спосіб передачі діапазону окремих значень клітин у масив - це передати весь діапазон, як описано вище. Моє питання полягає в тому, як я можу передати інформацію з робочого листа в масив, не маючи динамічний масив, який буде змінювати розмір на мене? Мені просто доведеться перейти через масив клітиною за клітину, щоб передати інформацію? Dim MyDyArray () як варіант ReDim MyDyArray (3,3) З цим .Workbook.Worksheet (1) Для рядка = 1 до 3 Для колонки = 1 до 3 Якщо рядок <= .Range ("A3:C3").Rows.Count, тоді MyDyArray (row, col) = .Cells (row, col) .value Інакше MyDyArray (row, col) = 0 Кінець якщо Кінець якщо Кінець з Dim MyDyArray () як варіант ReDim MyDyArray (3,3) Для рядка = 1 до 3 Для колонки = 1 до 3 MyDyArray (row, col) = 0 Кінець для Кінець для MyDyArray = ThisWorkbook.Worksheet (1) .Range ("A3:C3") |
При передачі діапазону з робочого листа в масив у VBA, масив може змінювати розмір непередбачувано, що призводить до помилок у коді. Щоб уникнути цієї проблеми, можна використовувати різні методи, такі як динамічні масиви та ініціалізація масиву перед передачею діапазону.
Статичні масиви, як правило, не можуть бути змінені в розмірах після їхньої ініціалізації. Однак динамічні масиви можуть бути змінені в розмірах за допомогою інструкції ReDim. У таких масивах може бути збережено лише останній розмір, якщо це необхідно.
Однак, коли ви намагаєтеся передати діапазон з робочого листа у динамічний масив, може виникнути проблема зі зміною розміру масиву. Навіть якщо масив був ініціалізований та перезавантажений, він може змінити свій розмір, щоб відповідати розміру діапазону.
Щоб уникнути непередбаченої зміни розміру масиву при передачі діапазону з робочого листа, можна застосувати підхід з ініціалізацією масиву перед передачею діапазону. Це гарантує, що розмір масиву залишиться незмінним і не буде залежати від розміру діапазону.
Нижче наведено приклад коду, який ілюструє ініціалізацію масиву перед передачею діапазону з робочого листа:
1 2 3 4 5 6 7 8 9 10 |
Dim MyDyArray() As Variant ReDim MyDyArray(3, 3) ' Ініціалізація масиву нулями For row = 1 To 3 For col = 1 To 3 MyDyArray(row, col) = 0 Next col Next row ' Передача діапазону з робочого листа в масив MyDyArray = ThisWorkbook.Worksheet(1).Range("A3:C3") |
Ініціалізуючи масив нулями перед передачею діапазону з робочого листа, ви гарантуєте, що розмір масиву залишиться незмінним і не буде змінюватися непередбачувано.