查找循环范围可变的缺失编号

时间:2019-03-15 08:48:03

标签: excel vba

我正在尝试找到一种使用VBA的方式来显示可变范围的行中缺少的1-3(仅整数)范围内的数字。

D列可以为空白,或具有一个数字(1、2或3)。 E列的数字递减。最低值为1。

范围取决于E列中的值。

示例/说明:

  • E2 = 4,因此它必须寻找D2-D5中缺少的数字。这4行全部包含三个数字。
  • E6 =2。在D6-D7中查找缺失的数字。缺少的数字是3。
  • E8 = 1,为空白。缺少1、2、3
  • (不在表中)E列中的值也可以是1,并且在相应的D列中具有数字1-3。

我认为,如果我在每组行之间添加一个空白行(在下图中的交替颜色之间),可能会更容易。但是为此,我可能仍需要大量帮助。

Image

我真的希望这里的人能够帮助/了解我正在尝试做的事情。这是我的代码的最后一步,我对如何使这项工作感到震惊。

2 个答案:

答案 0 :(得分:0)

蛮力方法:(为单元格F1编写的公式)

=IF(E1<IFERROR(OFFSET(E1,-1,0),-1),"",MID(IF(COUNTIF(OFFSET(D1,0,0,E1,1),1)>0,"",", 1") & IF(COUNTIF(OFFSET(D1,0,0,E1,1),2)>0,"",", 2") & IF(COUNTIF(OFFSET(D1,0,0,E1,1),3)>0,"",", 3"),3,99))

打破现状:

  

=IF(E1<IFERROR(OFFSET(E1,-1,0),-1),"", <OUTPUT>)
  如果E列中的值小于其上方的值,则不显示任何内容。否则,请显示我们的<OUTPUT>


接下来的内容将以相反的顺序显示,因为这样更有意义:

  

OFFSET(D1, 0, 0, E1, 1)
  这是一个<RANGE>个单元,宽1个单元,高E1个单元,从D1开始(0行0列​​)


找出我们的<RANGE>中缺少的数字,以及要显示的<TEXT>

  

IF(COUNTIF(<RANGE>,1)>0,"",", 1") &
  如果数字1没有出现在范围内,请在", 1"
中包含<TEXT>   IF(COUNTIF(<RANGE>,2)>0,"",", 2") &
  如果数字2没有出现在范围内,请在", 2"
中包含<TEXT>   IF(COUNTIF(<RANGE>,3)>0,"",", 3")
  如果数字3没有出现在范围内,请在", 3"
中包含<TEXT>   这为我们提供了<TEXT>""", 1"", 1, 2"", 1, 2, 3"", 1, 3",{{1} }或", 2"


最后,整理我们的", 2, 3"

  

", 3"
  修剪<OUTPUT>

前面的前2个字符

答案 1 :(得分:0)

简单的UDF

假设您的第一个数据块包含第2至5行,则可以在单元格F2中输入以下公式,例如=ABSENT(D2:D5)或什至=ABSENT(D2:E5)来在F列中显示所需的结果字符串(由于OP在第一种情况下为空)。

示例代码

Function absent$(rng As Range)
Dim i&, s$, tmp, found                                          ' declare data types (Long, String, Variant, Variant)
For i = 1 To 3
    tmp = Application.Transpose(Application.Index(rng, 0, 1))   ' change 1st column to flat array
    found = Application.Match(i, tmp, 0)                        ' match numbers 1 to 3
    If IsError(found) Then                                      ' remember, if no match in array
       s = s & i & IIf(i < 3, ",", "")                          ' add absent number to string
    End If
Next i
absent = s                                                      ' return string
End Function