ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3791|回复: 36

[求助] 查找连续的数字(继续寻找方法)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-28 21:39 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aman1516 于 2021-3-2 12:39 编辑

字符串 t 为:
t = "D18,D15,D22,D23,D24,D25,D12,D11,D10,D7,D4,D3,D27"
各字符代表单元格,无序不规则,如何将其中连续的单元格(t)设置成如下格式:
t = "D3:D4,D7,D10:D12,D15,D18,D22:D25,D27"

附件就不上了,请教下老师如何处理?

3月1日补充:
当字符串存在两种格式时,如:t = "D18,D15,D1:D3,D22,D23,D24,D25,D12,D11,D10,D7,D4,D27:D32"
还是 准提部林 老师的最适用(能排序,唯一缺点是要添加批注,若表格对应单元格有批注时就会产生冲突),
其他的方法在字符串处理时又复杂了许多,若不考虑排序,则还是直接用  Union 方法简单些:

  1. Sub t99()
  2. Dim t As String, rng As Range, ran As Range
  3. t = "D18,D15,D1:D3,D22,D23,D24,D25,D12,D11,D10,D7,D4,D27:D32"
  4. For Each ran In Range(t)
  5.     If rng Is Nothing Then Set rng = ran Else Set rng = Union(rng, ran)
  6. Next
  7. MsgBox rng.Address(0, 0)
  8. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2021-2-28 21:59 | 显示全部楼层
Sub test()
    t = "D18,D15,D22,D23,D24,D25,D12,D11,D10,D7,D4,D3,D27"
   
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = "[A-Z]+"
        zm = .Execute(t)(0).Value
        BRR = Split("," & .Replace(t, ""), ",")
    End With


    For i = 1 To UBound(BRR)
        For l = i + 1 To UBound(BRR)
            If Val(BRR(l)) < Val(BRR(i)) Then
                tm = BRR(i)
                BRR(i) = BRR(l)
                BRR(l) = tm
               
            End If
        Next l
    Next i
    str1 = ""
    x = BRR(1)
    y = 1
    For i = 2 To UBound(BRR)
        If Val(BRR(i)) <> Val(BRR(i - 1)) + 1 Then
            If y + 1 <> i Then
                str1 = str1 & "," & zm & x & ":" & zm & BRR(i - 1)
                x = BRR(i)
                y = i
            Else
                str1 = str1 & "," & zm & x
                x = BRR(i)
                y = i
            End If
        End If
    Next i
    If y = UBound(BRR) Then
        str1 = str1 & "," & zm & x
    Else
        str1 = str1 & "," & zm & x & ":" & zm & BRR(UBound(BRR))
    End If

    MsgBox Mid(str1, 2)

  

End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-28 22:41 | 显示全部楼层
liulang0808 发表于 2021-2-28 21:59
Sub test()
    t = "D18,D15,D22,D23,D24,D25,D12,D11,D10,D7,D4,D3,D27"
   

感谢版主出手,正则处理后再排序再组合
非常正确,改成自定义函数就可通用了

TA的精华主题

TA的得分主题

发表于 2021-3-1 01:37 | 显示全部楼层
本帖最后由 lss001 于 2021-3-1 10:42 编辑

Sub nn()
    t = "D18,D15,D22,D23,D24,D25,D12,D11,D10,D7,D4,D3,D27"
    t = Split(Replace(t, "D", ""), ",")
    Set s = CreateObject("System.Collections.ArrayList")
    For i = 0 To UBound(t): s.Add Val(t(i)): Next
    s.Sort: s.Add 0: r = "D" & s(0)
    For i = 1 To UBound(t)
         If s(i) - s(i - 1) <> 1 Then
            r = r & "," & "D" & s(i)
         Else
            If s(i ) - s(i + 1) <> -1 Then
               r = r & ":" & "D" & s(i)
            Else:  r = r
            End If
         End If
    Next
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-3-1 07:45 | 显示全部楼层
Sub try()
Dim arr, brr, i%, j%, t, k%, temp, n%
  arr = [{"D18","D15","D22","D23","D24","D25","D12","D11","D10","D7","D4","D3","D27"}]
  ReDim brr(1 To UBound(arr))
  For i = 1 To UBound(arr)
    brr(i) = Val(Replace(arr(i), "D", ""))
  Next
  Erase arr
    For i = 1 To UBound(brr) - 1
      For j = 1 To UBound(brr) - i
        If brr(j) > brr(j + 1) Then
          t = brr(j): brr(j) = brr(j + 1): brr(j + 1) = t
        End If
      Next
    Next
  For i = 1 To UBound(brr) - 1

      If brr(i + 1) - brr(i) = 1 Then
        n = n + 1
        If n = 1 Then
          temp = "D" & brr(i)
          Else
            temp = temp & ":D" & brr(i)
        End If
      ElseIf brr(i + 1) - brr(i) > 1 Then
        If temp = vbNullString Then
          k = k + 1
          ReDim Preserve arr(1 To k)
          arr(k) = "D" & brr(i)
          Else
            k = k + 1
            ReDim Preserve arr(1 To k)
            arr(k) = temp & ":D" & brr(i)
            n = 0: temp = vbNullString
            If i = UBound(brr) - 1 Then
              k = k + 1
              ReDim Preserve arr(1 To k)
              arr(k) = "D" & brr(i + 1)
            End If
        End If
      End If
  Next
  t = Join(arr, ",")
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-3-1 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001老师的代码怎么给删除了,写得非常好!既简练又实用,让我了解了不少,只是有一个小小的笔误,稍微知道点的人都不会在意。

TA的精华主题

TA的得分主题

发表于 2021-3-1 11:12 | 显示全部楼层
本帖最后由 lss001 于 2021-3-1 11:15 编辑
cui26896 发表于 2021-3-1 10:49
lss001老师的代码怎么给删除了,写得非常好!既简练又实用,让我了解了不少,只是有一个小小的笔误,稍微知 ...

优化一下,正在审核,稍后......

TA的精华主题

TA的得分主题

发表于 2021-3-1 12:19 | 显示全部楼层
取巧法...利用"註解"重新抓位置,
可連續列 或 跨列:
Sub TEST()
Dim T$, Rng As Range, A As Range
T = "D18,D15,D22,D23,D24,D25,D12,D10,D11,D7,D4,D3,D27"
Set Rng = Range(T)
For Each A In Rng
    A.NoteText "test"
Next
With Rng.EntireColumn
     T = .SpecialCells(xlCellTypeComments).Address(0, 0)
     .ClearComments
End With
MsgBox T
End Sub


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-3-1 12:40 | 显示全部楼层
准提部林 发表于 2021-3-1 12:19
取巧法...利用"註解"重新抓位置,
可連續列 或 跨列:
Sub TEST()

准部老师加注释,取得有注释单元格地址的方法太新颖了!不得不点赞!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-1 16:26 | 显示全部楼层
准提部林 发表于 2021-3-1 12:19
取巧法...利用"註解"重新抓位置,
可連續列 或 跨列:
Sub TEST()

向各位老师学习,这个方法太绝妙了,必须赞一个!

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 12:26 , Processed in 0.039364 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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