Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2014, 11:41   #1
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию Ошибка преобразования массива в строку

Имеется таблица "Лист1" в первой колонке три значения "AAA", "BBB" и "CCC".
Надо скопировать их в массив arr(), показать значения элементов этого массива, и поместить их в другие ячейки "B4", "B5", "B6".
Код:
Sheets("Лист1").Select	' переход на лист "Лист1"

Dim arr() As Variant	' Определяю динамический массив arr()
lastRow = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row	' конечная занятая строка в первой колонке = 3
ReDim arr(1 To lastRow)	' переопределяю размер массива

arr = Range("A1:A" & lastRow).Value	' массив заполняется значениями из ячеек
теперь, если хочу посмотреть значения элементов массива:
Код:
For i = 1 To lastRow
	Debug.Print arr(i)	' тут получаю ошибку
Next i
то получаю ошибку "Run-time error '9'. Subscript out of range."
Код:
MsgBox arr(1)
приводит к такой же ошибке

а попытка преобразования его элементов в строку через Join()
Код:
Debug.Print Join(arr, ", ")
приводит к ошибке "Run-time error '5'. Invalid procedure call or argument."

Однако, если вставить значения элементов массива в ячейки Range("B4:B6"),
Код:
Range(Cells(4, 2), Cells(6, 2)).Value = arr
то все работает, массив arr() жив и содержит свои законные три элемента.

Что за чертовщина и как в VBA можно вывести элементы массива, как строки?

И как вообще правильно копировать данные из диапазона ячеек в одномерный массив и обратно?
Может, вся проблема в неправильном копировании в массив?

Спасибо!
Debauchee вне форума Ответить с цитированием
Старый 20.08.2014, 11:59   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

ReDim arr(1 To lastRow) ' переопределяю размер массива - лишнее. И ошибочное.
А все ошибки потому, что это двумерный массив!
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.08.2014, 12:01   #3
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
ReDim arr(1 To lastRow) ' переопределяю размер массива - лишнее. И ошибочное.
А все ошибки потому, что это двумерный массив!
А как же тогда определить размерность массива? Или вообще не нужно?

И откуда он двумерный, если используется только один ряд значений? Ничего не понимаю...

Последний раз редактировалось Debauchee; 20.08.2014 в 12:06.
Debauchee вне форума Ответить с цитированием
Старый 20.08.2014, 12:10   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вообще не нужно.
А если будете использовать 10 рядов - будете десятимерный массив городить?

И вообще там не ряд, а столбец. Где у каждого элемента 2 координаты!
И зачем Вам одномерный массив? Используйте как есть двумерный, будьте проще
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.08.2014, 12:18   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub N1()
  Dim arr
  arr = [a1:a3].Value
  [b4].Resize(3, 1) = arr
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 20.08.2014, 12:19   #6
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию

Мрачно...
Где же тут проще? Если я хочу "упаковать" элементы массива в строку с разделителями, а join() не поможет, то без цикла не обойтись?

А есть ли в VBA какая-нибудь функция, наподобие var_dump() или print_r() в РНР, которая позволит посмотреть дамп массива?

Последний раз редактировалось Debauchee; 20.08.2014 в 12:24.
Debauchee вне форума Ответить с цитированием
Старый 20.08.2014, 12:24   #7
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию

Спасибо, IgorGO!
Красивое решение!

Dim arr - это объявление не массива, а просто переменной (as Variant), т.е. получается, что и массива тоже?
Debauchee вне форума Ответить с цитированием
Старый 20.08.2014, 12:26   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

в редакторе VBA жмём View - Locals Window
в коде, в том месте где надо остановиться и посмотреть содержимое массива, добавляем строку STOP

и смотрим, что у нас там во всех переменных (в т.ч. в массиве)
EducatedFool вне форума Ответить с цитированием
Старый 20.08.2014, 12:35   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

И что же решил Игорь?
И зачем нужно строка? Если нужна - ну и соберите её циклом по массиву - ничего сложного, чуток букв написать...
А вообще преобразовать из двумерного в одномерный можно транспонированием.
Код:
Sub N2()
    Dim arr
    arr = [a1:a3].Value
    [b4] = Join(Application.Transpose(arr), ", ")
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 20.08.2014 в 12:39.
Hugo121 вне форума Ответить с цитированием
Старый 20.08.2014, 12:45   #10
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию

Спасибо, EducatedFool!
Почти удобный способ
Debauchee вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразования числа в строку Alexandr17 Общие вопросы Delphi 12 26.07.2014 11:56
Проблема с кодом в Pascal: ошибка преобразования типа byte к string THE LOGOS Помощь студентам 16 14.01.2014 21:38
Конструктор,метод вывода на экран Display, метод для преобразования в строку toString в Delphi Чумак Татьяна Помощь студентам 6 03.04.2012 11:58
Алгоритм преобразования элементов массива Alexander4321 Помощь студентам 1 28.11.2010 15:55
Ошибка преобразования кодировки ipdd Помощь студентам 3 30.09.2010 11:07