2016-10-20 1 views
0

Я относительно новичок в программировании VBA, поэтому прошу ответить на вопрос о noobie. У меня очень простой код, который в основном помещает около 200 000 записей в массив. Затем я хочу вставить эти записи в колонку А в Sheet1. Однако я продолжаю получать «Ошибка времени выполнения 13 Тип несоответствия». Ниже приведен код.Вставка массива в столбец Excel приводит к ошибке времени выполнения 13

Sub array_testing() 

Dim i As Long 
Dim MyArray() As String 

i = 2 

Sheets("Customer Data").Activate 

Do Until IsEmpty(Cells(i, 1)) 
ReDim Preserve MyArray(i) 
MyArray(i) = Cells(i, 1).Value 
i = i + 1 
Loop 

Sheets("Sheet1").Activate 
Sheets("Sheet1").Range("A1").Resize(UBound(MyArray, 1), 1).Value = Application.Transpose(MyArray) 

End Sub 
+0

Вы можете просто указать myArray() как вариант. и значение myArray = range ("a1: a200000"). Вам нужно будет указать диапазон («a1»). value = transpose (... это сделать вертикальный массив горизонтальным? –

+0

Я заполнил массив значениями из один столбец и хочу вставить их в другой столбец. Поэтому я полагаю, что данные массива должны быть вертикальными, и я хочу вставить их по вертикали. Теперь, когда вы упомянули об этом, я сомневаюсь, что. Transpose - это то, что мне нужно, но я понятия не имею, как сделайте это. –

+0

'range (" b1 "). value = myarray', тогда сохраните свой цикл как есть, если вы зацикливаете на 1-ю пустую ячейку, возможно, лучше всего найти последнюю строку, а затем используйте' range ("b1 : b "& lastrow) .value = (" a1: a "& lastrow) .value' –

ответ

0

Вы можете сделать это без петель, но все еще с массивами:

'activate sheet if required 
'copying to array 
Dim arrSource As Variant 
arrSource = Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Value 

'pasting from array 
'change sheet index to sheet name 
Sheets(1).Range("A1").Resize(UBound(arrSource, 1), 1).Value = arrSource 

Вы также могли бы рассмотреть возможность использования Range.Copy Destinaton метода.


Тот же результат с Range.Copy destination выглядит следующим образом:

Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Copy Sheets(1).Range("A1") 

Линия выше копий клеток и сразу же вставить их. В качестве альтернативы вы можете использовать отдельные Range.Copy и Range.PasteSpecial, если требуется.

+0

Спасибо вам, и Натан, и Явор. ow –

+0

Еще одна вещь, хотя Jawor. Не могли бы вы рассказать мне, как использовать метод Range.Copy для вставки содержимого массива? –

+0

@BoSanders, см. Ответ edit ... –

Смежные вопросы