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

我有4个variables,希望列出哪些(最多3个)variables被使用。 我曾经使用过VBA函数,但是我不明白为什么这个工作不正常。

这四个variables是百分比,例如:

如果(20%,空,20%,60%)我想这三个单元格是(A,C,D)

如果(50%,50%,空,空)=>(A,B,空)

你好,

如果(空,空,100%,空)=>(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 

难道是空单元是普遍的,其他的是一个百分比吗? 由于数据来自另一个程序,我不能真正改变这一点。 我可以使用空检查或类似的东西吗?

提前致谢!

卢卡斯

考虑以下数据。 最后一列有对A的公式

 ABCDE 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次命中,我们可以停止处理。 这只需要用z参数来检查,如果我们已经有3个点击的话。 以stringforms创build结果并返回。

您的条件语句是链接的:每个ElseIf只有在前面的If计算结果为True才会被计算,所以函数只返回一个string值(A,B,C或D,但不是多个可能值的组合)需要在一个集合/字典/数组/等等中将它们全部取出,并删除那些是空值的。

默认的types转换(大概是你将范围对象传递给这个函数,在工作表上,如果范围是空的,那么它的值是.Value ,它是“0”。

另一个你可能还没碰到的问题是,如果单元格值包含百分比,那么在函数声明中将它们转换为Integer ,任何舍入到0的值都将被评估为0 。

我build议将variables声明为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 

我不确定你想要的返回值是什么(你的例子是不一致的),但是下面可能会指出你正确的方向:

 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