2016-12-12 21 views
0

これを実行して、SUMPRODUCTに似た行列乗算の関数を作成しようとしています。しかし、私は(あなたのSub Button1から渡された)列b内のデータとLASTROWを探していますMSumProd FunctionIf Cells(a, b).Value = Null Then実行時エラー1004.アプリケーション定義またはオブジェクト定義エラーVBA

Sub Button1() 
    Cells(2, 1).Value = MSumProd(1, 1, 1, 5) 
End Sub 

Function MSumProd(a As Integer, b As Integer, c As Integer, d As Integer) 

Dim n As Integer 
n = 0 
Do While a >= 0 
    n = n + Cells(a, b).Value * Cells(c, d).Value 
    b = b + 1 
    c = c + 1 

    If Cells(a, b).Value = Null Then 
     Exit Do 
    End If 
Loop 

MSumProd = n 

End Function 
+0

当該用紙に集中する最初の試み(例えば 'シート( 'シート1')。SELECT')。 – FDavidov

+1

そして、 'Cell(x、y).Value =" "'で、 "Null"でないかどうかをチェックする必要があります。 – FDavidov

+1

'a'の値は変更されず、無限ループになります。セルは空にできますが、ヌルではありません –

答えて

0

渡っオブジェクト定義のエラーを取得し続けます。その後、Do WhileExit Doを使用する代わりに、最初のセル(Cells(a, b))からデータとともに最後の行までのForループを使用しています。

警告:あなたのコードでは、あなたがCells(2, 1).Value = MSumProd(1, 1, 1, 5)を送信している、列Aの2行目はMSumProd関数値の結果で上書きされることを意味します。 MSumProd関数の開始セルとしてセル(1,1)を送信しているため、セルA1から始まりセルA4までの数行のデータがある場合は、セルA2の元の値が上書きされますMSumProdの値。

サブButton1をコード

Sub Button1() 

Cells(2, 1).Value = MSumProd(1, 1, 1, 5) 

End Sub 

機能MSumProdコード

Function MSumProd(a As Integer, b As Integer, c As Integer, d As Integer) 

Dim n As Long 
Dim Lastrow As Long, lRow As Long 

' find last row with data in Column with passed integer 'b' 
Lastrow = Range(Cells(a, b), Cells(a, b)).CurrentRegion.Rows.Count 

' reset SUMPRODUCT value 
n = 0 

' loop through all rows with data in column 'b' 
For lRow = a To Lastrow 
    n = n + Cells(lRow, b).Value * Cells(c, d).Value 
    ' I think you are trying to advance the row (and not column) 
    ' Therefore, you need to advance a and not b 
    ' In this code I advance the row with lROw in the "For" loop 
    c = c + 1 ' can be removed, since is advanced as with lRow 
Next lRow 

MSumProd = n 

End Function 
+0

@Shashank Nathaniあなたはこのコードをテストしましたか?どんなフィードバックもいいだろう –

関連する問題