我有4个变量,希望列出正在使用哪个(最多3个)变量。 我之前使用过VBA功能,但我对这个功能无效的原因感到困惑。
这四个变量是百分比,例如:
如果(20%,空,20%,60%)我想要三个单元格(A,C,D)
if(50%,50%,空,空)=> (A,B,空)
您好,
if(empty,empty,100%,empty)=> (C,空,空)
我目前的代码不起作用(对于第一个单元格):
Function whichtoa(w As Integer, x As Integer, y As Integer, z As Integer) As String
If w <> 0 Then
whichtoa = "A"
ElseIf x <> 0 Then
whichtoa = "B"
ElseIf y <> 0 Then
whichtoa = "C"
ElseIf z <> 0 Then
whichtoa = "D"
End If
End Function
是否可以将空单元格作为一般而其他单元格是百分比?我无法真正改变这一点,因为数据来自另一个程序。 我可以使用空检查或类似的东西吗?
提前致谢!
卢卡斯
答案 0 :(得分:2)
考虑以下数据。最后一列的公式为a
A B C D E
60% 40% 30% 30% ABC
30% 60% 30% 90% ABC
10% 20% 50% ABC
30% 50% BC
30% C
50% 60% CD
如果使用百分比,则需要在函数中使用除整数之外的其他内容,因为您正在处理小数。
Function whichtoa(w As Double, x As Double, y As Double, z As Double) As String
Dim emptyCount As Integer
Dim results As String
' Assume zero
valueCount = 0
' Assume empty string
results = ""
If w <> 0 Then
results = results & "A"
valueCount = valueCount + 1
End If
If x <> 0 Then
results = results & "B"
valueCount = valueCount + 1
End If
If y <> 0 Then
results = results & "C"
valueCount = valueCount + 1
End If
' This is the only time you need to check the condition of valueCount. If you want 3 maximum
If (z <> 0) And (valueCount < 3) Then
results = results & "D"
End If
whichtoa = results
End Function
单独检查每个条件。您拥有的If块仅处理第一个匹配,然后停止评估块。然后,使用valueCount
计算正值的数量或点击,如果我们得到3次点击,我们可以停止处理。如果我们此时已经有3次点击,则只需要使用z
参数进行检查。将结果构建为字符串并返回它。
答案 1 :(得分:2)
您的条件语句是链接的:每个ElseIf
仅在前面的If
求值为True
时进行评估,因此该函数只返回单个字符串值(A,B,C或D,但不是多个可能值的组合,这需要在集合/字典/数组/等中对它们进行全部删除,并删除那些空值。
由隐含的类型转换(可能是你将范围对象传递给此函数,在工作表上,如果范围为空,则评估为.Value
为“0”。
您可能还没有遇到的另一个问题(如果您仍在使用上述内容)是,如果单元格值包含百分比,则通过在函数声明中将它们转换为Integer
,将向下舍入的任何值将0评估为零。
我建议将变量声明为Range对象,然后专门检查它们的.Value
属性。将所有单元格和键值(“A”,“B”等)存储在字典中。迭代dictioanry并检查空虚的值:
如果字典包含4个项目,我也会使用它来返回错误值,因为您最多需要3个。
Function whichtoa(a As Range, b As Range, c As Range, d As Range)
Dim dict As Object
Dim itm As Variant
Set dict = CreateObject("Scripting.Dictionary")
'Add each cell value to a dictionary, using unique letter as Key
dict("A") = a.Value
dict("B") = b.Value
dict("C") = c.Value
dict("D") = d.Value
'iterate the dictionary keys, removing empty values
For Each itm In dict.Keys()
If IsEmpty(dict(itm)) Then dict.Remove (itm)
Next
If Not dict.Count = 4 Then
whichtoa = Join(dict.Keys(), ",")
Else:
whichtoa = CVerr(2023)
End If
End Function
答案 2 :(得分:-1)
我不确定您想要的返回值是什么(您的示例不一致),但以下内容可能指向正确的方向:
Public Function whichtoa(r as Range)
Dim arr, i
arr = Array("A", "B", "C", "D")
For i = 0 to 3
If IsEmpty(r.Cells(1,i+1) Then
arr(i) = "empty"
End If
Next
whichtoa = arr(0) & "," & arr(1) & "," & arr(2) & "," & arr(3)
End Function