2017-08-07 20 views
2

多くの人がこのエラーについて質問してきましたが、それらの回答に基づいて、すべてのことを正しく行う必要があります。Excel VBA「型の不一致:配列型またはユーザー定義型が予期される」

私はVariableというクラスを作成して、変数に関する複数の情報を格納しました。これらの変数の配列を格納する別のクラスEquipmentがあります。ここに関連するコードはEquipmentである:

Public name As String 
Private variables() As Variable 

Public Sub setVariables(vars() As Variable) 
    variables = vars 
End Sub 

私もEquipmentのインスタンスを作成し、モジュールを持っています。ここではそのためのすべてのコードは次のとおりです。

Public Sub fillEquipment() 

    'figure out how many units of equipment there are 
    numUnits = 0 
    atRow = 1 
    Do Until Range("A" & atRow).value = "" 
     numUnits = numUnits + 1 
     atRow = atRow + 1 
    Loop 

    'create array for equipment units 
    Dim units() As Equipment 
    ReDim units(0 To numUnits) 

    'figure out how many variables there are 
    numVars = 0 
    For Each col In Range("A1:ZZ1") 
     If col.value <> "" Then 
      numVars = numVars + 1 
     End If 
    Next col 

    'create an array of equipment one row at a time 
    atRow = 1 
    Do Until Range("A" & atRow).value = "" 
     'create and name equipment 
     units(atRow) = New Equipment 
     units(atRow).name = Range("A" & atRow).value 

     'create an array of vars 
     Dim variables() As Variable 
     ReDim variables(0 To numVars) 
     For atCol = 1 To numVars 
      variables(atCol) = New Variable 
      variables(atCol).name = Cells(1, atCol).value 
      variables(atCol).value = Cells(atRow, atCol).value 
     Next atCol 

     'add variables to equipment 
     units(atRow).setVariables (variables) 
     atRow = atRow + 1 

    Loop 

    'print for testing 
    For atRow = 1 To numUnits 
     Cells(atRow, 1).value = Equipment(atRow).name 
     For atCol = 1 To numCols 
      Cells(atRow, atCol + 1).value = Equipment(atRow).getVariables(atCol) 
     Next atCol 
    Next atRow 

End Sub 

ここに私の問題だ:言葉units(atRow).setVariables (variables)variables上:「予想配列またはユーザー定義型の型の不一致」私はプログラムを実行すると、それは私のコンパイラエラーが発生します。

私は何が間違っているのか分かりません。 variablesはオブジェクトタイプVariableの配列として定義されており、これはまさにsetVariablesが求めているものです。

ありがとうございました!私は本当に助けに感謝します!

+0

この「プライベート変数()変数」は「プライベート変数()としてバリアント」である必要があります。コード全体で同じ変更を行う必要があります。自分で定義しない限り、 'Variable'型のようなものはありません。 – braX

+0

"変数"というクラスを作成しました。タイプとして定義するには十分ではありませんか? –

+0

ああ - それは表示されていません。私はあなたが今どこにそれを言及参照してください。ここでは、定義されていないコードもテストすることはできません。 – braX

答えて

1

あなたはextra parenthesesです。これはエラーなしでコンパイルします。

Sub make(numUnits As Long, numVars As Long) 
    Dim units() As Equipment 
    ReDim units(0 To numUnits) 
    Dim atRow As Long, atCol As Long ' <-- new Dim, because of Option Explicit 

    'create an array of equipment one row at a time 
    atRow = 1 
    Do Until Range("A" & atRow).value = "" 
     'create and name equipment 
     units(atRow) = New Equipment 
     units(atRow).name = CStr(Range("A" & CStr(atRow)).value) ' <-- use CStr() anytime you need a string 

     'create an array of vars 
     Dim variables() As Variable 
     ReDim variables(0 To numVars) 
     For atCol = 1 To numVars 
      variables(atCol) = New Variable 
      variables(atCol).name = Cells(1, atCol).value 
      variables(atCol).value = Cells(atRow, atCol).value 
     Next atCol 

     'add variables to equipment 
     units(atRow).setVariables variables 
     atRow = atRow + 1  ' ^^^^^^^^^ not (variables) - no parens 

    Loop 
End Sub 

重要な問題はかっこでした。ただし、変数にDimステートメントが追加されています。 @ BruceWayneは言ったように、は常にを使用してください。Option Explicitです。はい、それはすべてのモジュールとすべてのクラスモジュールにあります。それ以外の方法は、コンパイラからデバッグ支援を捨てることです。

私は実際にはすべてのモジュールの先頭にOption Base 0を使用しています。主に私がどのシステムで作業しているかを思い出させるためです:)

CStrを追加しました。奇妙なコーナーケースからあなたを守ります。このコードをさらに発展させるには、暗黙的なActiveSheetに頼るのではなく、明示的なワークシート変数の使用をお勧めします。例えば、this answerを参照してください。

+0

ありがとうございました! –