Excel 查找具有循环变量范围的缺失编号

Excel 查找具有循环变量范围的缺失编号,excel,vba,Excel,Vba,我正在试图找到一种方法,使用VBA向我显示可变行范围中缺少的1-3范围内的数字(仅限整数) D列可以为空,也可以有一个位数(1、2或3)。 列E中的数字为递减值。最低值为1 范围取决于E列中的值 示例/说明: E2=4,因此必须查找D2-D5中缺失的数字。这四行有三个数字 E6=2。在D6-D7中查找丢失的号码。丢失的号码是3 E8=1,和E8为空。缺少1号、2号、3号 (不在表中)E列中的值也可以是1,并且在相应的D列中有数字1-3 我想如果我在每一组行之间(下图中的交替颜色之间)添加一个

我正在试图找到一种方法,使用VBA向我显示可变行范围中缺少的1-3范围内的数字(仅限整数)

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

范围取决于E列中的值

示例/说明:

  • E2=4,因此必须查找D2-D5中缺失的数字。这四行有三个数字
  • E6=2。在D6-D7中查找丢失的号码。丢失的号码是3
  • E8=1,E8为空。缺少1号、2号、3号
  • (不在表中)E列中的值也可以是1,并且在相应的D列中有数字1-3
我想如果我在每一组行之间(下图中的交替颜色之间)添加一个空行,可能会更容易。但我可能仍然需要大量的帮助

我真的希望这里有人能帮助/理解我在做什么。这是我的代码的最后一步,对于如何让它工作,我感到目瞪口呆

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

=IF(E10,“,”,1”)&IF(COUNTIF(偏移量(D1,0,0,E1,1),2)>0,“,”,2”)&IF(COUNTIF(偏移量(D1,0,0,E1,1),3)>0,“,”,3,99))
细分:

=IF(E10,“,”,1“&

如果数字
1
未出现在范围内,则在

IF(COUNTIF(,2)>0,“,”2“&

如果数字
2
未出现在范围内,则在

IF(COUNTIF(,3)>0,“,”,3”)

如果数字
3
未出现在范围内,则在

这给了我们一个
,3


最后,整理我们的

MID(,3,99)


简单自定义项

假设您的第一个数据块包括第2行到第5行,您可以在单元格
F2
中输入以下公式,例如
=缺席(D2:D5)
或甚至
=缺席(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
功能缺失$(rng作为范围)
Dim i&,s$,tmp,找到了“声明数据类型(长、字符串、变量、变量)”
对于i=1到3
tmp=Application.Transpose(Application.Index(rng,0,1))'将第一列更改为平面数组
found=Application.Match(i,tmp,0)'匹配号1到3
如果IsError(找到),则“记住,如果数组中没有匹配项
s=s&i&IIf(i<3,“,”,“)”将缺少的数字添加到字符串中
如果结束
接下来我
缺席=s'返回字符串
端函数

您可以使用
索引
创建一个动态大小的范围,其中包含要检查的行数(例如
索引(D2,1,0,E2,1)
),感谢您的回复@Chronocidal,但我不太明白如何使其工作。索引只有四个参数?我还在原始帖子中添加了一个表,其中包含代码的“期望”结果。F列显示了缺失的数字。对不起,把
索引
偏移量
混在一起了-
偏移量(D2,1,0,E2,1)
,并将其与
计数结合起来,如果
我开始意识到我可能在头脑中。一周半前开始为这个项目学习VBA。到目前为止,我主要是复制/粘贴在其他地方找到的代码,并利用每一个机会“记录宏”。也许我需要退一步,开始学习基础知识。令人沮丧的是,我的代码只缺少一部分。我尝试了一种蛮力方法(检查
1
,如果缺少,则返回
“,1”,对
2`和
3
执行相同的操作,然后将它们组合成一个字符串,并使用
MID(,3,99)
删除第一个
”,“
),但是我不能从你的解释中得到你预期的结果(我第二行有
2
,第三行有
1,2
,但你都是空白的?),我认为把它分解成一个分步的方法会帮助你想清楚。哇,真的被这个回答吓坏了!非常感谢你!直到周一我才有机会尝试,但它看起来很有希望!可能需要多次回到这一点才能完全理解它。我点击向上箭头,当我有机会尝试时,将点击“解决”!再次感谢你!工作很有魅力,非常感谢你提供的帮助!请问您花了多长时间才想出这个解决方案?这种类型的编程对我来说非常陌生,所以我甚至不能对时间使用情况给出一个有根据的猜测@肯尼决定最初的方法大概需要5分钟?您已经确认只有3个选项(
1
2
3
),因此可以进行单独检查-对于大型列表,您需要Office365
CONCAT
TEXTJOIN
功能。主要的问题是如何在值之间只包含逗号,但幸运的是,我以前已经使用了
MID
删除了这样的初始字符。当我的输出与您的输出不匹配时,遇到了一个短暂的绊脚石,但那是因为我在做每一行。一旦你更新了图像,我意识到我需要外部的
IF
语句来确保它只是“格言”
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