Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1117|回复: 6

[已解决]查找缺少数字

[复制链接]
发表于 2022-1-14 12:34 | 显示全部楼层 |阅读模式
统计有效和作废号段在头 ,尾内的缺少数值,写在L列
如第7行头是2251尾是2300,有效号是2253到2254和2256到2258,作废号是2259
那么缺少的就是2251到2252和2255,2257,2260到2300
连续号用-表示,单一号用/表示

见下图及附件,请老师帮忙处理一下,谢谢(数据为模拟数据,行数不定)
截图.jpg
求助.rar (14.05 KB, 下载次数: 4)
发表于 2022-1-14 13:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 excel用户1116 于 2022-1-14 14:02 编辑

求助.zip (24.58 KB, 下载次数: 7)
回复

使用道具 举报

发表于 2022-1-14 17:21 | 显示全部楼层
本帖最后由 林木水 于 2022-1-14 18:29 编辑

思路:
1.把有效跟作废的内容处理为全部以单个数字组成以/隔开的字符串sr,循环头到尾
2.判断是否在sr存在,如果存在就下一个,如果不存在就说明是缺少号
3.再处理所有缺少号,难点是把所有连续的数字合并成A-B形式,比较薅头发4.行数不定改第7行代码范围
见附件
  1. Sub demo()
  2. On Error Resume Next
  3. 'Dim reg As New RegExp
  4. Dim reg As Object
  5. Set reg = CreateObject("vbscript.regexp")
  6. Dim i As Integer, sr, m, mat, j As Integer, arr, hr, brr, z1, z2, fr
  7. arr = Range("a6:b14")
  8. With reg
  9.     .Global = True
  10.     .Pattern = "\d+\-\d+|\d+"
  11.     For i = 1 To UBound(arr)
  12.     Set mat = .Execute(Cells(i + 5, "f").Value)
  13.         For Each m In mat
  14.             If InStr(m, "-") > 0 Then
  15.                 For j = Val(Mid(m, 1, InStr(m, "-") - 1)) To Val(Mid(m, InStr(m, "-") + 1, Len(m)))
  16.                     sr = sr & "/" & j
  17.                 Next j
  18.             Else
  19.                 sr = sr & "/" & m
  20.             End If
  21.         Next m
  22.         sr = sr & "/" & Cells(i + 5, "i").Value
  23.         For j = arr(i, 1) To arr(i, 2)
  24.             If InStr(sr, j) = 0 Then
  25.                 hr = hr & "/" & j
  26.                 If Mid(hr, 1, 1) = "/" Then hr = Mid(hr, 2, Len(hr))
  27.             End If
  28.         Next j
  29.             If InStr(hr, "/") > 0 Then
  30.                 brr = VBA.Split(hr, "/")
  31.                 z1 = brr(0)
  32.                 fr = z1
  33.                 For j = 0 To UBound(brr)
  34.                 If j = UBound(brr) - 1 Then
  35.                     If brr(j + 1) - brr(j) = 1 Then
  36.                         fr = z1 & "-" & brr(j + 1)
  37.                     Else
复制代码




dbe85f49a817f7ae7740660a16ee7b2.png

求助.rar

21.96 KB, 下载次数: 1

回复

使用道具 举报

 楼主| 发表于 2022-1-14 18:06 | 显示全部楼层
本帖最后由 clyf 于 2022-1-14 18:14 编辑
林木水 发表于 2022-1-14 17:21
思路:
1.把有效跟作废的内容处理为全部以单个数字组成以/隔开的字符串sr,循环头到尾
2.判断是否在sr存 ...

谢谢老师帮助,解决我的问题了,不过有个小问题,,做好的结果应该是1955-1956/1977    您的是1955/1977,没提取出1956
回复

使用道具 举报

 楼主| 发表于 2022-1-14 18:07 | 显示全部楼层

谢谢老师帮助,解决我的问题了,自定义函数,学习了
回复

使用道具 举报

发表于 2022-1-14 18:30 | 显示全部楼层
clyf 发表于 2022-1-14 18:06
谢谢老师帮助,解决我的问题了,不过有个小问题,,做好的结果应该是1955-1956/1977    您的是1955/1977 ...
  1. Sub demo()
  2. On Error Resume Next
  3. 'Dim reg As New RegExp
  4. Dim reg As Object
  5. Set reg = CreateObject("vbscript.regexp")
  6. Dim i As Integer, sr, m, mat, j As Integer, arr, hr, brr, z1, z2, fr
  7. arr = Range("a6:b14")
  8. With reg
  9.     .Global = True
  10.     .Pattern = "\d+\-\d+|\d+"
  11.     For i = 1 To UBound(arr)
  12.     Set mat = .Execute(Cells(i + 5, "f").Value)
  13.         For Each m In mat
  14.             If InStr(m, "-") > 0 Then
  15.                 For j = Val(Mid(m, 1, InStr(m, "-") - 1)) To Val(Mid(m, InStr(m, "-") + 1, Len(m)))
  16.                     sr = sr & "/" & j
  17.                 Next j
  18.             Else
  19.                 sr = sr & "/" & m
  20.             End If
  21.         Next m
  22.         sr = sr & "/" & Cells(i + 5, "i").Value
  23.         For j = arr(i, 1) To arr(i, 2)
  24.             If InStr(sr, j) = 0 Then
  25.                 hr = hr & "/" & j
  26.                 If Mid(hr, 1, 1) = "/" Then hr = Mid(hr, 2, Len(hr))
  27.             End If
  28.         Next j
  29.             If InStr(hr, "/") > 0 Then
  30.                 brr = VBA.Split(hr, "/")
  31.                 z1 = brr(0)
  32.                 fr = z1
  33.                 For j = 0 To UBound(brr)
  34.                 If j = UBound(brr) - 1 Then
  35.                     If brr(j + 1) - brr(j) = 1 Then
  36.                         fr = z1 & "-" & brr(j + 1)
  37.                     Else
  38.                         z1 = fr
  39.                         fr = z1 & "/" & brr(j + 1)
  40.                     End If
  41.                     Exit For
  42.                 End If
  43.                     If brr(j + 1) - brr(j) = 1 Then
  44.                         fr = z1 & "-" & brr(j + 1)
  45.                     Else
  46.                       z1 = fr & "/" & brr(j + 1)
  47.                       fr = z1
  48.                     End If
  49.                 Next j
  50.                 Cells(i + 5, "l") = fr
  51.             Else
  52.             Cells(i + 5, "l") = hr
  53.             End If
  54.            
  55.         sr = "": hr = ""
  56.     Next i
  57. End With
  58. End Sub

复制代码
用这个,确实有点小问题,第38行代码加一个z1=fr就可以了,你再试试
回复

使用道具 举报

 楼主| 发表于 2022-1-14 18:49 | 显示全部楼层
林木水 发表于 2022-1-14 18:30
用这个,确实有点小问题,第38行代码加一个z1=fr就可以了,你再试试

谢谢老师帮助,解决我的问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 01:09 , Processed in 0.344331 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表