列出多个单元格中的已占用单元

时间:2014-08-19 02:36:02

标签: excel vba excel-vba

我有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

是否可以将空单元格作为一般而其他单元格是百分比?我无法真正改变这一点,因为数据来自另一个程序。 我可以使用空检查或类似的东西吗?

提前致谢!

卢卡斯

3 个答案:

答案 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