Опорная область в многомерном массиве - PullRequest
2 голосов
/ 18 января 2012

У меня есть эти многомерный массив в Excel

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)

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 января 2012

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

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 обеспечит получение всех данных из каждого измерения массива.

1 голос
/ 22 января 2012

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)

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

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

Вот некоторые мои более ранние ответы на соответствующие вопросы:

VBA вставка трехмерного массива в лист

Как я могу «ReDim Preserve» a2D Array в Excel 2007 VBA, чтобы я мог добавлять в массив строки, а не столбцы?

1 голос
/ 18 января 2012

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

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

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

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

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

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

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

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

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

См. Мой ответ на Макросы загрузки макросов Excel для получения дополнительной информациина неровных массивах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...