2016-10-25 51 views
0

私の目的は、実際の行にユーザー定義関数を使用して特定の列の値を追加することです。列は別の表に示されています。私は行の名前を読んで、実際の値を計算し、それらを合計しています。この関数はExcelから1回呼び出されたが、4回実行された。最後に、循環参照エラーを示します。 excelファイルにこのようなエラーはありません。udfが42だけ戻ってエラーがないかどうかを確認しました。最初に私はApplication.Callerを疑ったが、除外した。循環参照はユーザー定義関数ですVBAはExcel

Function SumColumnsWithSuffix(suffix As String, rowNumber) As Integer 
    'can be used only in Összesíto table 
    Dim myTable As Excel.ListObject 
    Dim mySheet As Excel.Worksheet 
    Dim myRow As Excel.ListRow 

    Set mySheet = ThisWorkbook.Worksheets("összesíto") 
    Set myTable = mySheet.ListObjects("Számlák") 
    Dim columnName As String 

    result = 0 

    For Each myRow In myTable.ListRows 
     columnName = Intersect(myRow.Range, myTable.ListColumns("Oszlop név").Range) 
     columnName = "Összesíto[" & columnName & " " & suffix & "]" 
     'actualRow = Application.Caller.row 
     'rowName = actualRow & ":" & actualRow 
     rowName = rowNumber & ":" & rowNumber 
     myRowRange = Range(rowName) 
     actualValue = Intersect(Range(columnName), Range(rowName)) 
     result = result + actualValue 
    Next myRow 

    SumColumnsWithSuffix = result 
End Function 
+0

私はより多くの変数を宣言し、異なるタイプのデータに対してそれらを再利用しません。コードを明確にし、簡単なエラーを発見するのに役立ちます。これらの動作のいくつかを強制するために、VBAファイルの先頭に 'option explicit'を入れてください。 'columnName'を使って、範囲参照(' Intersect'から)と範囲アドレス(文字列)の両方を保持します。これはあなたが期待していない文字列を作成している可能性があります。 – JamesFaix

答えて

1

myRowRange明示的に宣言(または使用し、実際に)ので、それは暗黙的にVariantですされていません。それはまた、.Valueへの暗黙の呼び出しを行っている...ここにあなたの割り当て...

myRowRange = Range(rowName) 

を意味します。この呼び出しでは、Range(rowName)のすべての単一セルの結果が、返されるVariantの配列に移入すると評価されます。 のセルにSumColumnsWithSuffixの呼び出しが含まれている場合は、循環参照を取得します。

+0

ありがとう、それは働いた! –