在VBA函数中传递Excel范围,作为数组处理,并返回结果
我有一个Excel工作表,列中有一些字符串。有时所有条目都相同,有时则不同: 我编写了一个函数,将范围作为参数传递: =凹痕(A1:A6) VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“Ag”),然后分别返回0或12:在VBA函数中传递Excel范围,作为数组处理,并返回结果,excel,vba,Excel,Vba,我有一个Excel工作表,列中有一些字符串。有时所有条目都相同,有时则不同: 我编写了一个函数,将范围作为参数传递: =凹痕(A1:A6) VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“Ag”),然后分别返回0或12: Function DentWG(WG_Mat As Range) As Single Dim dat As Variant, rw As Variant, temp As Single dat = WG_Mat temp = 0 For
Function DentWG(WG_Mat As Range) As Single
Dim dat As Variant, rw As Variant, temp As Single
dat = WG_Mat
temp = 0
For rw = LBound(dat, 1) To UBound(dat, 1)
If dat(rw, 1) = "Ag" Then
temp = 12
End If
Next
If temp = 12 Then
DentWG = 12
Else
DentWG = 0
End If
端函数
但是,该函数始终返回0,即使对于范围内出现“Ag”的第二种情况也是如此。我确信我无法将范围正确地转换为数组,或者无法将预期的逻辑正确地应用于该数组。我的代码有什么问题吗?这对我很有用:
Function DentWG(WG_Mat As Range) As Single
Dim result As Single, cl as Range
result = 0
For Each cl In WG_Mat
If cl = "Ag" Then
DentWG = 12
Exit Function
End If
Next cl
DentWG = result
End Function
这对我很有用:
Function DentWG(WG_Mat As Range) As Single
Dim result As Single, cl as Range
result = 0
For Each cl In WG_Mat
If cl = "Ag" Then
DentWG = 12
Exit Function
End If
Next cl
DentWG = result
End Function
你真的不需要一个自定义项。你可以说:
=IF(COUNTIF(A1:A6,“Ag”)>=1,12,0)
您实际上不需要自定义项。你可以说:
=IF(COUNTIF(A1:A6,“Ag”)>=1,12,0)
根据您的问题
VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“Ag”),然后分别返回0或12:
Function DentWG(WG_Mat As Range) As Single
Dim dat As Variant, rw As Variant, temp As Single
dat = WG_Mat
temp = 0
For rw = LBound(dat, 1) To UBound(dat, 1)
If dat(rw, 1) = "Ag" Then
temp = 12
End If
Next
If temp = 12 Then
DentWG = 12
Else
DentWG = 0
End If
这就是你需要的
Function DentWG(WG_Mat As Range) As Long
Dim ClCount As Long
ClCount = WG_Mat.Cells.Count
If Application.WorksheetFunction.CountIf(WG_Mat, "Al") = ClCount Then
DentWG = 0
ElseIf Application.WorksheetFunction.CountIf(WG_Mat, "Ag") > 0 Then
DentWG = 12
End If
End Function
使用公式也可以实现同样的效果
=IF(COUNTIF(A1:A6,“Al”)=(行(A1:A6)*列(A1:A6)),0,IF(COUNTIF(A1:A6,“Ag”)>0,12“”)
如果总是1列,则不需要*列(A1:A6)
。这就行了
=IF(COUNTIF(A1:A6,“Al”)=行(A1:A6),0,IF(COUNTIF(A1:A6,“Ag”)>0,12,”)
屏幕截图
根据您的问题
VBA函数应确定哪种情况为真(所有entries=“Al”或至少一个entry=“Ag”),然后分别返回0或12:
Function DentWG(WG_Mat As Range) As Single
Dim dat As Variant, rw As Variant, temp As Single
dat = WG_Mat
temp = 0
For rw = LBound(dat, 1) To UBound(dat, 1)
If dat(rw, 1) = "Ag" Then
temp = 12
End If
Next
If temp = 12 Then
DentWG = 12
Else
DentWG = 0
End If
这就是你需要的
Function DentWG(WG_Mat As Range) As Long
Dim ClCount As Long
ClCount = WG_Mat.Cells.Count
If Application.WorksheetFunction.CountIf(WG_Mat, "Al") = ClCount Then
DentWG = 0
ElseIf Application.WorksheetFunction.CountIf(WG_Mat, "Ag") > 0 Then
DentWG = 12
End If
End Function
使用公式也可以实现同样的效果
=IF(COUNTIF(A1:A6,“Al”)=(行(A1:A6)*列(A1:A6)),0,IF(COUNTIF(A1:A6,“Ag”)>0,12“”)
如果总是1列,则不需要*列(A1:A6)
。这就行了
=IF(COUNTIF(A1:A6,“Al”)=行(A1:A6),0,IF(COUNTIF(A1:A6,“Ag”)>0,12,”)
屏幕截图
+1对于非VBA解决方案:)但是您遗漏了一部分
哪种情况是正确的(所有条目=“Al”,或至少一条条目=“Ag”)
您仍然忘记了“Al”:@SiddharthRout是的,但从他的代码中,我假设OP假设输入是可靠的“Ag”或“Al”。不可否认,这是一个很大的假设:-)请参见附件中的屏幕截图。问题的这一部分VBA函数应该确定哪种情况是正确的(所有条目=“Al”,或至少一个条目=“Ag”),然后分别返回0或12:
,然后查看我发布的答案。必须这样做,因为没有人真正得到OP真正想要的东西…+1对于非VBA解决方案:)但是你错过了一部分哪种情况是正确的(所有条目=“Al”,或至少一条条目=“Ag”)
你仍然忘记了“Al”:@SiddharthRout是的,但从他的代码中我假设OP假设输入是可靠的“Ag”或“Al”。不可否认,这是一个很大的假设:-)请参见附件中的屏幕截图。问题的这一部分VBA函数应该确定哪种情况是正确的(所有条目=“Al”,或至少一个条目=“Ag”),然后分别返回0或12:
,然后查看我发布的答案。必须这样做,因为没有人真正得到OP真正想要的东西…这也不能回答问题。@Alex P:对我不起作用,可能是因为cl没有声明?从循环中退出函数…真的吗?这也不能回答问题。@Alex P:对我不起作用,可能是因为cl没有声明?从循环中退出函数…真的吗?@Siddharth Rout:+1并检查。感谢这两种解决方案。它们对我来说都很好。我自己的解决方案(我已在上面更正)也能起作用。我看到您的解决方案调用了Application.WorksheetFunction。在我的简单应用程序中,资源不是问题,但一般来说:在VBA代码中调用application.WorksheetFunction是否比严格使用VBA方法更占用资源?@assylias:相反,谢谢你纠正我的循环计数器。它完成了-我只是一个随意的vba er,你可以告诉我与专业的区别!;-)@西德哈特路线:+1并检查。感谢这两种解决方案。它们对我来说都很好。我自己的解决方案(我已在上面更正)也能起作用。我看到您的解决方案调用了Application.WorksheetFunction。在我的简单应用程序中,资源不是问题,但一般来说:在VBA代码中调用application.WorksheetFunction是否比严格使用VBA方法更占用资源?@assylias:相反,谢谢你纠正我的循环计数器。它完成了-我只是一个随意的vba er,你可以告诉我与专业的区别!;-)