UDF 在调试模式下工作,但它不会为单元格赋值
UDF works in debug mode but it doesn't give value into the cell
我是第一次使用 VBA Excel UDF。
我的目标是创建类似于“SumIf”的东西,但它通过项目列表(写入单元格并由“|”分隔)获得次要标准。
我已经通过回调 sub 测试了这个 UDF,逐步完成过程,在这里它工作正常(这是测试 sub:MsgBox SommaSeIncludo(Range("A:A"), Range("B:B"), Range("B1"), Range("C:C"), "D1")
但是,我不知道为什么,如果我将公式放入单元格中,它只会显示“值”错误 ( =SommaSeIncludo(A:A;B:B;B1;C:C;D1)
)。
你有什么想法吗?
这是我的代码:
Function SommaSeIncludo(ByVal intSomma As Range, ByVal intCriteri1 As Range, ByVal criteri1 As Range, ByVal intCriteri2 As Range, ByVal listaCriteri2 As String) As String
Dim listaCriteri2Array As Variant
Dim numberOfListaCriteri2ArrayItems As Integer
Dim thisItemCriteria As String
Dim subTotal As Double
Dim total As Double
Dim thisSheet As Worksheet
Set thisSheet = ThisWorkbook.Sheets("MySheet")
total = 0
listaCriteri2Array = Split(thisSheet.Range(listaCriteri2).Value, "|")
numberOfListaCriteri2ArrayItems = UBound(listaCriteri2Array) - LBound(listaCriteri2Array)
For i = 0 To numberOfListaCriteri2ArrayItems
subTotal = 0
thisItemCriteria = listaCriteri2Array(i)
subTotal = WorksheetFunction.SumIfs(intSomma, intCriteri1, criteri1.Value, intCriteri2, thisItemCriteria)
total = subTotal + total
Next
SommaSeIncludo = total
End Function
在评论中提出以下建议:
简短的回答是你可以通过在调用函数时将 D1 变成一个字符串来让它工作:
=SommaSeIncludo(A:A;B:B;B1;C:C;"D1")
但是通过将函数的第一行更改为
将其更改为一个范围可能更好
Function SommaSeIncludo(ByVal intSomma As Range, ByVal intCriteri1 As Range, ByVal criteri1 As Range, ByVal intCriteri2 As Range, ByVal listaCriteri2 As Range) As Long
如果你想让它在指定的sheet中引用D1,我只知道Split语句中稍微long-winded构造将范围转换为字符串,将它与[=连接起来28=] 名称,并转换回一个范围:
listaCriteri2Array = Split(Range("MySheet" & "!" & listaCriteri2.Address).Value, "|")
也许最好不要将其绑定到特定的 sheet,因为您始终可以将 MySheet!D1 放入函数调用中,并将拆分行保留为
listaCriteri2Array = Split(listaCriteri2.Value, "|")
我是第一次使用 VBA Excel UDF。 我的目标是创建类似于“SumIf”的东西,但它通过项目列表(写入单元格并由“|”分隔)获得次要标准。
我已经通过回调 sub 测试了这个 UDF,逐步完成过程,在这里它工作正常(这是测试 sub:MsgBox SommaSeIncludo(Range("A:A"), Range("B:B"), Range("B1"), Range("C:C"), "D1")
但是,我不知道为什么,如果我将公式放入单元格中,它只会显示“值”错误 ( =SommaSeIncludo(A:A;B:B;B1;C:C;D1)
)。
你有什么想法吗?
这是我的代码:
Function SommaSeIncludo(ByVal intSomma As Range, ByVal intCriteri1 As Range, ByVal criteri1 As Range, ByVal intCriteri2 As Range, ByVal listaCriteri2 As String) As String
Dim listaCriteri2Array As Variant
Dim numberOfListaCriteri2ArrayItems As Integer
Dim thisItemCriteria As String
Dim subTotal As Double
Dim total As Double
Dim thisSheet As Worksheet
Set thisSheet = ThisWorkbook.Sheets("MySheet")
total = 0
listaCriteri2Array = Split(thisSheet.Range(listaCriteri2).Value, "|")
numberOfListaCriteri2ArrayItems = UBound(listaCriteri2Array) - LBound(listaCriteri2Array)
For i = 0 To numberOfListaCriteri2ArrayItems
subTotal = 0
thisItemCriteria = listaCriteri2Array(i)
subTotal = WorksheetFunction.SumIfs(intSomma, intCriteri1, criteri1.Value, intCriteri2, thisItemCriteria)
total = subTotal + total
Next
SommaSeIncludo = total
End Function
在评论中提出以下建议:
简短的回答是你可以通过在调用函数时将 D1 变成一个字符串来让它工作:
=SommaSeIncludo(A:A;B:B;B1;C:C;"D1")
但是通过将函数的第一行更改为
将其更改为一个范围可能更好Function SommaSeIncludo(ByVal intSomma As Range, ByVal intCriteri1 As Range, ByVal criteri1 As Range, ByVal intCriteri2 As Range, ByVal listaCriteri2 As Range) As Long
如果你想让它在指定的sheet中引用D1,我只知道Split语句中稍微long-winded构造将范围转换为字符串,将它与[=连接起来28=] 名称,并转换回一个范围:
listaCriteri2Array = Split(Range("MySheet" & "!" & listaCriteri2.Address).Value, "|")
也许最好不要将其绑定到特定的 sheet,因为您始终可以将 MySheet!D1 放入函数调用中,并将拆分行保留为
listaCriteri2Array = Split(listaCriteri2.Value, "|")