2012-01-18 2 views
2

Я эти многомерный массив в ExcelReference область в многомерном массиве

Dim world(192,15,40) as Variant

Dim country(192,15) as Variant

Я не могу найти способ, чтобы вставить всю страну в мире. что-то вроде:

world()()(2)=country

или

country(:,:,20)=currentSheet.Range("A1:F50")

или просто ссылаться на регион, чтобы вставить его обратно на стол

Range.value=world(20:50,1:50,2)

Возможно ли это?

Спасибо.

ответ

1

VBA Variant довольно гибкий, и вы можете использовать его, чтобы делать то, что хотите, но не делать точно то, что вы просите. Ключ их состоит в том, чтобы вырезать трехмерный массив и вместо этого использовать массив, содержащий другие массивы.

я мог бы быть перестановкой смысл ваших индексов здесь, но рассмотреть что-то вроде этого:

Dim china 
china = [china!Q42:X99] 

Dim india 
india = [india!Q42:X99] 

... 

Dim world(1 to 242) 
world(1) = china 
world(2) = india 

... 

[report!Q42:X99] = world(42) 

В этом примере используется 1-D массив Variant с собой, каждый элемент которого представляет собой массив 2-D от Variant s, который поступает из разных диапазонов Excel.Если вы думаете о трехмерном массиве как кубе, подумайте об этой структуре как (1-D) книге (2-D) страниц.

Как правило, использование данных с использованием только массивов (вложенных или иных) может быть сопряжено с опасностью. Однако в коде VBA, поддерживающей электронную таблицу Excel, это часто может быть самым естественным способом сделать что-то. В VBA можно определить Type s и Class es, но много раз это избыток, потому что как источник ваших данных, так и конечные результаты вашего расчета - всего лишь двумерные диапазоны на листе где-то.

Вот некоторые важные ранние ответы мои на смежные вопросы:

VBA pasting 3 dimensional array into sheet

How can I "ReDim Preserve" a 2D Array in Excel 2007 VBA so that I can add rows, not columns, to the array?

1

Я не уверен, чего вы пытаетесь достичь, поэтому не может просто исправить ваш синтаксис. Надеюсь, что следующее дает достаточно опыта для исправления кода.

Если вы пишете:

Dim X as Variant 
X = .Range("A1").Value 

, то X будет одно значение.

Если написать:

Dim X as Variant 
X = .Range("A1:F50").Value 

тогда Х будет двумерный массив размером, как (от 1 до 50, от 1 до 6). Это первое измерение для строк, а второе - для столбцов. Это противоположность обычной практике, но соответствует .Cells(Row,Column).

Вы также можете написать:

Dim X(1 to 192) as Variant 
X(2) = .Range("A1:F50").Value 

Смотрите мой ответ на Excel macro loading arrays для получения дополнительной информации о зазубренных массивах.

1

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

For i = LBound(country, 1) to UBound(country, 1) 
    For j = LBound(country, 2) to UBound(country, 2) 
     world(i, j, 2) = country(i, j) 
    Next j 
Next i 

Использование LBOUND и UBOUND обеспечит вам получить все данные из каждого измерения массива.

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