2014-10-28 2 views
0

Я пытаюсь заполнить 3d-массив и (на этом этапе) просто вернуть его в msgbox, данные, которые я хочу в массиве, находятся в столбцах 9, 15 и 16 и будут похожи ...Excel VBA Array (3d) Новичок

2342341234, 01.01.1969, 18:00

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

Option Explicit 
Global NumberOfRows As Integer 
Global FirstRowOfData As Integer 
Global LastRowOfData As Integer 
Global i As Integer 'row loop 
Global HospNo() As Integer 
Global TRCDate() As Date 
Global TRCTime() As Date 
Global MonthArray(HospNo, TRCDate, TRCTime) 


Sub CreateMonthArray() 

    FirstRowOfData = 1 

    With ActiveSheet 
     LastRowOfData = Range(.Range("A1"), .Range("A65535").End(xlUp)).Count 
    End With 

    Dim MonthArray(HospNo, TRCDate, TRCTime) 

    For i = FirstRowOfData To NumberOfRows 

     Let MonthArray(HospNo) = (ActiveSheet.Cells(i + 1, 9).value) 
     Let MonthArray(TRCDate) = (ActiveSheet.Cells(i + 1, 15).value) 
     Let MonthArray(TRCTime) = (ActiveSheet.Cells(i + 1, 16).value) 

    MsgBox MonthArray(HospNo(i), TRCDate(i), TRCTime(i)) 

    Next i 

End Sub 

Большое спасибо.

+0

Какая строка дает вам эту ошибку? Читайте об объявлении массивов в справке VBA. Также у вас есть дубликаты объявлений для MonthArray в вашем коде. –

ответ

0

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

Я подозреваю, что ваша ошибка возникает в операциях Global или Dim MonthArray. В VBA массивы не имеют аргументов «named». Если это проблема, вы можете попробовать что-то вроде:

Global MonthArray(0 to 2) as Variant 

, а затем, в вашем коде:

MonthArray(0) = (ActiveSheet.Cells(i + 1, 9).value) 
MonthArray(1) = (ActiveSheet.Cells(i + 1, 15).value) 
MonthArray(2) = (ActiveSheet.Cells(i + 1, 16).value) 

Если вы хотите использовать именованные аргументы (которые могут быть реальной удобно для отладки, вы вероятно, следует определить объект класса

в VBA, я обычно использую Public и не глобален,.. и вы должны устранить дублированную декларацию MonthArray в теле кода Кроме того, оператор Пусть необязателен

.

Вы также должны убедиться, что переменная NumberOfRows установлена ​​где-то в значении. Он не настроен ни на что внутри этого модуля, но поскольку он является переменной Public, вы можете установить его в другом месте.

Наконец, ваш оператор MsgBox должен получить доступ к данным в MonthArray по номеру индекса. EG:

MsgBox MonthArray(0) & ", " & MonthArray(1) & "m " & MonthArray(2) 
0

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

Option Explicit 
Public NumberOfRows As Integer 
Public FirstRowOfData As Integer 
Public LastRowOfData As Integer 
Public i As Integer 'row loop 
'Public HospNo() As Integer 
'Public TRCDate() As Date 
'Public TRCTime() As Date 
Public MonthArray(0 To 2) As Variant 


Sub CreateMonthArray() 

    FirstRowOfData = 1 

    With ActiveSheet 
     LastRowOfData = Range(.Range("A1"), .Range("A65535").End(xlUp)).Count 
    End With 

    'Dim MonthArray(HospNo, TRCDate, TRCTime) 

    For i = FirstRowOfData To LastRowOfData 

     MonthArray(0) = (ActiveSheet.Cells(i + 1, 9).value) 
     MonthArray(1) = (ActiveSheet.Cells(i + 1, 15).value) 
     MonthArray(2) = (ActiveSheet.Cells(i + 1, 16).value) 

    MsgBox MonthArray(0) & ", " & MonthArray(1) & ", " & MonthArray(2) 

    Next i 

End Sub 
+0

Рад, что у вас это работает. Некоторые из того, что, я думаю, вы пытались сделать, могут быть включены классами. См. Обсуждение [Классы в VBA] (http://www.cpearson.com/Excel/Classes.aspx) Чипа Пирсона для ознакомления. –