2016-12-21 3 views
0

Спасибо за помощь!ReDim многомерные массивы в User Defined Тип EXCEL vba

Мой вопрос следующий. У меня есть раздел кода, который намеревается получить данные из таблицы и сохранить их в пользовательском типе. Поскольку таблица может изменить размер, идея состоит в том, чтобы динамически придавать размер элементам типа. Тип имеет два одномерных массива и один двумерный массив. У меня возникают проблемы с двухмерным массивом. Может ли Excel VBA поддерживать эту функцию?

Private Type testing_thermo_data 
'one dimesional arrays 
temperature() As Double 
pressure() As Double 
'two dimensional array 
composition() As Double 
End Type 

sub read_from_sheet_to_type() 

Dim data as testing_thermo_data 
Dim a,b,i as integer 
'a and b are determined with some other function (it works), so to simplify I will set them to a number 
a=20 
b=10 
'Now I will reDim the elements of the UDT to the proper size 
'One dimension array with a=10 elements 
ReDim data.temperature (a) as double 
'One dimension array with a=10 elements 
ReDim data.pressure (a) as double 
'Two dimensional array. Matriz of a=10 by b=20 
ReDim data.composition (1 To a, 1 To b) as double 

For i = 0 To (a- 1) 
data.temperature(i) = Application.ActiveSheet.Cells(i + 3, 1).Value 
data.pressure(i) = Application.ActiveSheet.Cells(i + 3, 2).Value 
    For j = 0 To (b-1) 
    'This is the line where my code crashes 
    data.composition(i, j) = Application.ActiveSheet.Cells(i, j + 3).Value 
    Next j 
Next i 
end sub 

$ После запуска кода я получаю следующую ошибку, как показано на рисунке. Ошибка выполнения «1004»: приложения или объект определенные ошибки enter image description here

+1

data.composition не имеет предмета (0,0), оно начинается с (1,1). –

+0

Привет, Скотт Кранер, спасибо за ответ. Я попробовал то, что вы упомянули, и все же код делает то же самое. Пока не работает –

+0

То же самое с ячейками() нет ячейки в строке 0, она начинается с 1 –

ответ

0

Я понял это. Проблема заключалась в том, что c ell, где я читал данные, был отформатирован как общий, а не номер. Вот почему он не читал данные с листа excel. Я проверил это, присвоив постоянному значению «500» элементу data.composition (i, j), и он сработал. Вот что я сделал, чтобы проверить эту гипотезу.

for i=1 To a 
For j = 1 To b 
'This is the line where my code crashes 
data.composition(i, j) = 500 
Next j 
Next i 

Как только проблема была обнаружена, я исправил код. Вот как выглядит последний код. Он работает отлично. Спасибо за вашу помощь!

Option Base 1 
Private Type testing_thermo_data 
'one dimesional arrays 
temperature() As Double 
pressure() As Double 
'two dimensional array 
composition() As Double 
End Type 

sub read_from_sheet_to_type() 

Dim data as testing_thermo_data 
Dim a,b,i as integer 
'a and b are determined with some other function (it works), 
'to simplif I will set them to a number 
a=20 
b=10 
'Now I will reDim the elements of the UDT to the proper size 
'One dimension array with a=10 elements 
ReDim data.temperature (a) as double 
'One dimension array with a=10 elements 
ReDim data.pressure (a) as double 
'Two dimensional array. Matriz of a=10 by b=20 
ReDim data.composition (1 To a, 1 To b) as double 

For i = 1 To (a) 
data.temperature(i) = Application.ActiveSheet.Cells(i + 3, 1).Value 
data.pressure(i) = Application.ActiveSheet.Cells(i + 3, 2).Value 
    For j = 1 To (b) 
    'This is the line where my code crashes 
    data.composition(i, j) = Application.ActiveSheet.Cells(i, j + 3).Value 
    Next j 
Next i 
end sub