ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 如何用vba实现“连续的数字用 — 代替”?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-7 09:30 | 显示全部楼层 |阅读模式
本帖最后由 pipiludaxian 于 2014-11-7 23:49 编辑

中國 1,2,3,4,5,8,12
美國 1,3,4,5,6,9

如何用vba實現如下效果?
中國 1-5,8,12
美國 1,3-6,9

TA的精华主题

TA的得分主题

发表于 2014-11-7 13:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhanglei1371 于 2014-11-7 14:00 编辑

仅仅针对题目有效,具体情况自己修改:
Sub sdf()
    Selection.HomeKey wdStory
    With Selection.Find
        .Text = "[01234567890-9]@[, ,]@[01234567890-9]{1,}"
        .MatchWildcards = 1
        Do While .Execute
            p = Replace(.Parent, ",", ", ")
            a0 = Split(p, ", ")(0)
            b0 = Split(p, ", ")(1)
            a = StrConv(Split(p, ", ")(0), vbNarrow) '全角转半角
            b = StrConv(Split(p, ", ")(1), vbNarrow)
            If sta = "" Then sta = a0
            If a + 1 = Val(b) Then
                .Parent.Start = .Parent.End - Len(b)
                i = i + 1
                Selection.Collapse 1
            Else
                If i < 1 Then sta = "": .Parent.End = .Parent.End - 2: .Parent.Collapse 0: GoTo aa:
                en = a0
                Selection.HomeKey
                Debug.Print sta & "[!^13]@" & en
                Selection.Find.Execute sta & "[!^13]@" & en, , , 2, , , , , , sta & "-" & en, 1
                Selection.Collapse 0
                .Text = "[01234567890-9]@[, ,]@[01234567890-9]{1,}"
                sta = ""
                i = 0
            End If
aa:
        Loop
    End With
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-5-18 08:53 | 显示全部楼层
  1. Function myJoinNum(ByVal str$, ByVal splitChar$) As String
  2. Dim aLen&, i&, arr() As String
  3. arr = Split(str, splitChar)
  4. aLen = UBound(arr)
  5. myJoinNum = arr(0)
  6. For i = 1 To aLen
  7.     If 1 * arr(i) = 1 * arr(i - 1) + 1 Then
  8.         Do While 1 * arr(i) = 1 * arr(i - 1) + 1
  9.             i = i + 1
  10.         Loop
  11.         myJoinNum = myJoinNum & "-" & arr(i - 1) & splitChar & arr(i)
  12.     Else
  13.         myJoinNum = myJoinNum & splitChar & arr(i)
  14.     End If
  15. Next i
  16. End Function
复制代码

作为参考,求高手简化。
总感觉还可以简化。

TA的精华主题

TA的得分主题

发表于 2015-5-18 08:56 | 显示全部楼层
这个比上述代码效率稍低一些,仅供交流。
  1. Function myJoinNum_MeThee(ByVal str$, ByVal splitChar$) As String
  2. '参数1:待处理的字符串
  3. '参数2:字符串中间的分隔符
  4. Dim aLen&, i&, arr() As String
  5. Dim aIndex&, bIndex&
  6. arr = Split(str, splitChar)
  7. aLen = UBound(arr)
  8. myJoinNum_MeThee = arr(0)
  9. For i = 1 To aLen
  10.     If 1 * arr(i) = 1 * arr(i - 1) + 1 Then
  11.         aIndex = InStrRev(myJoinNum_MeThee, "-")  '逆向查找“-”
  12.         bIndex = InStrRev(myJoinNum_MeThee, splitChar) '逆向查找splitChar
  13.         aTemp = Mid(myJoinNum_MeThee, InStrRev(myJoinNum_MeThee, "-") + 1)  '取“-”之后的部分
  14.         If aIndex > bIndex And IsNumeric(aTemp) Then   '如果有“-”存在 且“-”之后的部分只有数字
  15.             myJoinNum_MeThee = Left(myJoinNum_MeThee, aIndex - 1) & "-" & arr(i)
  16.         Else
  17.             myJoinNum_MeThee = myJoinNum_MeThee & "-" & arr(i)
  18.         End If
  19.     Else
  20.         myJoinNum_MeThee = myJoinNum_MeThee & splitChar & arr(i)
  21.     End If
  22. Next i
  23. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-16 05:33 , Processed in 0.020885 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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