为新手问题道歉,但我在搜索时找不到答案。
我对VBA中的矩阵操作相当新。我继续使用以下代码获得类型不匹配。
Sub matrixtest()
Dim matrix1() As Integer
Dim matrix2() As Integer
Dim matrix3() As Integer
Dim i, j, k As Integer
'populate matrix1
ReDim matrix1(3, 3)
For j = 1 To 3
For i = 1 To 3
matrix1(i, j) = Range("C5").Offset(i - 1, j - 1)
Next i
Next j
'populate matrix2
ReDim matrix2(3, 3)
For j = 1 To 3
For i = 1 To 3
matrix2(i, j) = Range("G5").Offset(i - 1, j - 1)
Next i
Next j
ReDim matrix3(3, 3)
matrix3 = Application.WorksheetFunction.MMult(matrix1, matrix2)
End Sub
答案 0 :(得分:0)
如果替换
行matrix3 = Application.WorksheetFunction.MMult(matrix1, matrix2)
通过
Debug.Print TypeName(matrix3 = Application.WorksheetFunction.MMult(matrix1, matrix2))
输出结果为:
Variant()
不能将其分配给Integer()
。
我建议更换
Dim matrix1() As Integer
Dim matrix2() As Integer
Dim matrix3() As Integer
Dim i, j, k As Integer
通过
Dim matrix1, matrix2, matrix3 As Variant 'note lack of ()
Dim i, j, k As Long 'Integer is borderline obsolete in VBA
Variants可以很好地保存和传递数组,并且可以自动处理任何所需类型的转换。在VBA中处理数组时,我倾向于几乎完全使用它们。首先,它可以轻松地从范围加载数组。
只需使用ReDim
使变体保持数组:
ReDim matrix1(1 to 3, 1 to 3) 'doesn't hurt to be explicit about lower bounds
ReDim matrix2(1 to 3, 1 to 3)
'load arrays...
'no need to redim matrix3, just:
matrix3 = Application.WorksheetFunction.MMult(matrix1, matrix2)
有一种更短的方式来做你想做的事情:
matrix1 = Range("C5:E7").Value
matrix2 = Range("G5:I7").Value
matrix3 = Application.WorksheetFunction.MMult(matrix1, matrix2)
在上面的代码中,您不需要使用任何初步ReDim
。当您想要将矩形范围的值加载到VBA中的变体中时,您不需要循环,这是不必要的慢。只需一举分配值即可。