Страницы: 1
RSS
выгрузка массива в диапазон Excel, VBA
 
Всем привет.
Возникла проблема с выгрузкой массива на диапазон через Range.resize. Вроде сделал всё по учебнику, но не работает. Приходится делать через цикл, но ведь так можно делать далеко не во всех задачах.
Кто может подсказать в чём я неправ ?
рабочий лист1 в файле
Код
Sub wvlkmfb()
Dim d1 As Object, i As Integer, j As Integer
Dim ilastrow As Integer, a, c

Set d1 = CreateObject("scripting.dictionary")
ilastrow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To ilastrow
    d1.Add Cells(i, 2).Value, Cells(i, 3).Value
Next

a = Range("g5").CurrentRegion
ReDim c(UBound(a))

For i = 1 To UBound(a, 1)
    If d1.Exists(a(i, 1)) Then c(i - 1) = d1.Item(a(i, 1))
Next

'Range("h5").Resize(UBound(c), 1).Value = c

For i = 5 To 8
    Range("h" & i).Value = c(i - 5)
Next


End Sub

 
Код
Range("h5").Resize(UBound(c), 1).Value = Application.Transpose(c)
 
А еще правильнее сразу создавать массив нужной размерности:
Код
Sub wvlkmfb()
Dim d1 As Object, i As Integer, j As Integer
Dim ilastrow As Integer, a, c
 
Set d1 = CreateObject("scripting.dictionary")
ilastrow = Cells(Rows.Count, 1).End(xlUp).Row
 
For i = 1 To ilastrow
    d1.Add Cells(i, 2).Value, Cells(i, 3).Value
Next
 
a = Range("g5").CurrentRegion
ReDim c(1 to UBound(a,1), 1 to 1) 'сразу создаем вертикальный массив
 
For i = 1 To UBound(a, 1)
    If d1.Exists(a(i, 1)) Then c(i,1) = d1.Item(a(i, 1))
Next
Range("h5").Resize(UBound(c), 1).Value = c
 
'For i = 5 To 8
'    Range("h" & i).Value = c(i - 5)
'Next
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 25.10.2022 08:21:01
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
RAN, Дмитрий(The_Prist) Щербаков,
Спасибо!
 
Хм... я просто вот так делаю:
 
tutochkin, Интересно, это Уокенбах ?
 
Цитата
написал:
я просто вот так делаю
я ничего не путаю - тут происходит постоянная выгрузка данных на лист и считывание обратно? А какое отношение это имеет к текущей теме? Здесь идет постоянное оперирование двумерными массивами и я не совсем понимаю какую задачу этот код вообще решает. Можете рассказать(мне чисто из любопытства)? Спасибо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, согласен и насчёт "сразу создавать двумерный" и насчёт "инструкции" :)

Инструкция к теме не относится вообще, а её логика — странная и непоследовательная: массив берём из диапазона без .Value, передаём в переменную диапазона одну ячейку, потом растягиваем её (причём только по строкам динамически, а столбцы константой), выгружаем уже с .Value.
Мне кажется, такая инструкция больше путает, чем объясняет…

Yum, объясню кратко. Одномерный массив можно выгрузить только строкой - то есть в столбцы в рамках одной строки. Для выгрузки в столбец нужен двумерный массив.  Application.Transpose лучше не использовать, а написать свою функцию пересбора - будет быстрее и не будет ограничений (у штатной они есть и вы можете получить некорректный результат даже не узнав об этом, т.к. ошибки не будет)
Изменено: Jack Famous - 26.10.2022 09:10:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
tutochkin написал:
я просто вот так делаю:
у меня это выглядело бы (с тем же конечным результатом) так:
Код
Sub ObjectVar()
  Dim data
  data = [a1].CurrentRegion
  [e1].Resize(UBound(data), 1) = data
  [g1].Resize(1, UBound(data, 2)) = data
  [g3].Resize(3, UBound(data, 2)) = data
End Sub
Изменено: Ігор Гончаренко - 26.10.2022 09:14:39
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, а - теперь понял, почему растягивали не всегда по массиву. Так и короче, и нагляднее  :D
Изменено: Jack Famous - 26.10.2022 09:15:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Yum написал:
tutochkin , Интересно, это Уокенбах ?
Нет. Хотя не исключаю у него аналогичного.
Цитата
Дмитрий(The_Prist) Щербаков написал:
какое отношение это имеет к текущей теме?
Читаю проблему - "Возникла проблема с выгрузкой массива на диапазон через Range.resize.". Показываю как это делаю я. ЧЯДНТ?
Цитата
Ігор Гончаренко написал:
у меня это выглядело бы (с тем же конечным результатом) так:
Спасибо. Буду знать. Но результат будет иной в общем случае т.к. data может отличаться...
Цитата
Инструкция к теме не относится вообще, а её логика — странная и непоследовательная
Очень жаль что Вы это написали
Изменено: tutochkin - 26.10.2022 14:22:56
 
Цитата
tutochkin написал:
Показываю как это делаю я
ну ок. Только если обратить внимание на код в сообщении - то становится совершенно неясно, как продемонстрированный Вами метод применить к решению проблемы, озвученной ТС. Он делает так же, но не работает как положено, потому что массив ДРУГОЙ размерности. Вот это интересовало, если честно...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх