2013-08-01 3 views
2

У меня есть повторяющийся список из 145 категорий с 15 столбцами данных для каждой категории. Я собираю этот список, уменьшая количество категорий до 24 и добавляя соответствующие данные.Как скопировать выбранный диапазон в заданный массив?

Например, Если у меня были категории A B C D E F G и я консолидировал, я бы добавил все значения в A и, скажем F, чтобы получить новую категорию.

Другая проблема заключается в том, что все эти 145 категорий повторяются в течение 60 периодов времени. Поэтому мне приходится консолидировать данные отдельно для каждого периода времени.

Для этого я пытаюсь использовать массивы.

Sub CategoriesToSectors() 
Dim k As Integer 
Dim j As Integer 
Dim p As Integer 
Dim Destination As Range 
' p is just a filler/dummy variable until I later decide which categories go into which sector 


Dim CategoryData(144, 14) As Long 
Dim SectorData(23, 14) As Long 

k = 0 
' k should go Upto 60 
' I first copy the data from a range in the first worksheet into the array CategoryData 
' Then I move 145 rows down for the next time-period's data and repeat this whole process 
While k < 60 
Sheets("ReformattedData").Select 
Range("B1:P145").Select 
ActiveCell.CurrentRegion.Offset(k * 145, 0).Select 
CategoryData = Selection.Value 

For j = 0 To 14 
SectorData(0, j) = CategoryData(1, j) + CategoryData(6, j) + CategoryData(8, j) +   CategoryData(13, j) 
For p = 1 To 23 
SectorData(p, j) = CategoryData(15, j) + CategoryData(19, j) + CategoryData(31, j) + CategoryData(44, j) 
Next p 
Next j 
' paste consolidated sectordata array one below another in SectorData worksheet 
Sheets("SectorData").Select 
Range("B2").Select 
Set Destination = ActiveCell.Offset(k * 25, 0) 
Destination.Resize(UBound(SectorData, 1), UBound(SectorData, 2)).Value = SectorData 


Wend 


End Sub 

Как вы можете видеть, что я делаю это первая попытка скопировать первый блок диапазона в массив CategoryData. Затем я объединяю данные в массив сектора - я только что использовал повторяющиеся значения для его проверки - цикл for с p не должен существовать. В конечном итоге я буду использовать 24 разных оператора для создания массива SectorData.

Затем я вставляю консолидированные данные на другой лист. Вернемся к первому листу и переместим мой выбор вниз для следующего блока диапазона (145 ячеек ниже первой ячейки), затем я выбираю эти данные и повторяю.

Это не работает - ошибка ввода данных в первый массив - CategoryData.

Справка будет принята с благодарностью.

Спасибо

+1

На какой линии имеет место ошибка, и что это сообщение об ошибке? –

+0

Ошибка возникает здесь: CategoryData = Selection.Value Что-то по строкам не может назначить массив. – user2643068

ответ

5

Для того, чтобы скопировать диапазон в массив VBA вы должны использовать вариант:

Dim CategoryData() As Variant 
'or just CategoryData As Variant (no brackets) 
'then the following will work 
CategoryData = Selection.Value 

После того, как вы передали данные, которые вы можете изучить UBound для CategoryData.

Здесь полезно обсудить at cpearson.

Вы можете установить диапазон в массив (SectorData в вашем примере), не будучи вариантом, если размеры одинаковы.

+0

Две вещи: во-первых, я попытался использовать вариант, и я все равно получаю ту же ошибку. Во-вторых, размер массива точно соответствует набору данных. Хотя я могу использовать цикл for для назначения значений массиву, это занимает слишком много времени, и было бы намного проще скопировать весь диапазон в массив. – user2643068

+0

Создайте небольшую отдельную процедуру для проверки. Попробуйте выполнить свой код. Установите точку останова, нажав F9. Скорее всего, потому, что это назначение можно выполнить только один раз, и вы имеете его в цикле. IMO вам придется разделить его на две процедуры, причем вторая процедура может каждый раз переопределять (повторно объявлять) CategoryData. –

0

Попробуйте это:

Sub RangeToArray() 
    Dim NewArray As Variant 
    Dim SourceRange As Range 
    Set SourceRange = Selection.CurrentRegion 
    NewArray = SourceRange.Value 
    Stop 'to check the result in Immediate Window 
End Sub 
Смежные вопросы