ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 急急急,如何实现这样的批量替换???

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-3-25 08:05 | 显示全部楼层

师傅好!
昨天比较忙,今天测试了20楼的宏,可替换为何拉伯数字,师傅的意思是如要把:章、节、条的小标题,设为加粗字体,再用14楼的宏分别设置运行?

TA的精华主题

TA的得分主题

发表于 2016-3-25 09:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
139:是的,20楼的代码只是负责把“第一条”翻译为“第1条”,最大是“第九百九十九条”翻译为“第999条”,因为在这个翻译小程序中我已经内置了“删除所有空格”宏,所以,要想把“第1条”设置为加粗、黑体格式,还要再运行我的“第一章(条)”这个宏才行,分工不同。

TA的精华主题

TA的得分主题

发表于 2016-3-25 10:08 | 显示全部楼层
413191246se 发表于 2016-3-25 09:12
139:是的,20楼的代码只是负责把“第一条”翻译为“第1条”,最大是“第九百九十九条”翻译为“第999条” ...

好的、感谢师傅!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-14 15:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se 发表于 2012-4-6 11:21
似乎达到了目的,楼主不妨用用看!大部分是用 VBA 宏代码,略微用查找与替换。
附件:

给个VBA代码好吗?我也学习一下。

TA的精华主题

TA的得分主题

发表于 2020-7-15 00:04 | 显示全部楼层
楼主,你好!——你的帖子,最早是 2012年建立的,到现在已经有 8 年了!
* 请下载我今天最新发布的《Word2003 自动排版宏(金秋版)》,里面有《第一章》宏,它也可以处理《第一条》这种情况,只须按照说明正确使用即可,在《辅助》菜单中,试试吧!
* 请注意:在使用《第一章》宏之前,最好是按 F8 进行公文排版 或 按 F7 进行普通排版。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-17 11:58 | 显示全部楼层
这个程序好,解决了问题。

Sub test()
    Dim mh, reg
    Set reg = CreateObject("VBScript.RegExp")
    With reg
        .Pattern = "第[零一二三四五六七八九十百千万]*条"
        .Global = True
    End With
    Set mh = reg.Execute(ActiveDocument.Content)
    For Each mhk In mh
        With ActiveDocument.Content.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Forward = True
            .Text = mhk
            .Replacement.Text = "第" & toNum1(toNumBZH(Mid(mhk, 2, Len(mhk) - 2))) & "条" '替换字符串
            .Execute Replace:=wdReplaceAll
        End With
    Next
End Sub

Private Function toNumBZH(mystr As String) As String    '此函数将输入的中文数字(允许大写、小写、数字、西文空格混编,如有其它字符出现则输出为空串)
    Dim i%, k%, k1%, myPos1%
    Dim str1$, comString$
    comString = "一壹二贰三叁四肆五伍六陆七柒八捌九玖零〇十拾百佰千仟万萬亿億兆0123456789"
    mystr = Replace(mystr, " ", "")
    mystr = Replace(mystr, "貳", "2")
    mystr = Replace(mystr, "陸", "6")
    mystr = Replace(mystr, "两", "2")
    For i = 1 To Len(mystr)
        str1 = Mid(mystr, i, 1)
        myPos1 = InStr(1, comString, str1, vbBinaryCompare)
        If myPos1 = 0 Then Exit Function
        Select Case myPos1
        Case 1 To 18
            mystr = Replace(mystr, str1, Trim(str(Int((myPos1 + 1) / 2))))
        Case 19, 20
            mystr = Replace(mystr, str1, "0")
        Case 22, 24, 26, 28, 30
            mystr = Replace(mystr, str1, Mid(comString, myPos1 - 1, 1))
        End Select
    Next
    For i = 1 To Len(mystr)
        str1 = Mid(mystr, i, 1)
        myPos1 = InStr(1, comString, str1, vbBinaryCompare)
        If myPos1 >= 21 And myPos1 <= 31 Then k1 = i
        If str1 = "0" Then
            k = InStr(1, comString, Mid(mystr, i + 1, 1), vbBinaryCompare)
            If k >= 21 And k <= 31 And Val(Mid(mystr, k1 + 1, i - k1)) = 0 Then mystr = Left$(mystr, i - 1) & "1" & Right$(mystr, Len(mystr) - i)
        End If
    Next
    toNumBZH = mystr
End Function

Private Function toNum1(mystr As String) As Double  'mystr 数据已经经过toNumBZH函数处理
    Dim i As Integer, myPos1 As Integer, myPos2%, falg%    'falg标志最高位在字串中出现位置,myPos2 表示最高位次数
    Dim str1 As String
    Dim comString As String
    comString = "十百千万┩兆╊亿0123456789"    '加入┩╊为处理方便,如在有可能出现的场合可先清除
    If mystr = "" Then
        toNum1 = 0
        Exit Function
    End If
    myPos2 = 0
    falg = 0
    For i = 1 To Len(mystr)
        str1 = Mid(mystr, i, 1)
        myPos1 = InStr(1, comString, str1, vbBinaryCompare)
        Select Case myPos1
        Case 1 To 8
            If myPos1 >= myPos2 Then
                falg = i
                myPos2 = myPos1
            End If
        End Select
    Next
    Select Case falg
    Case 0    '代表字串为纯数字
        Dim mynum As Long
        For i = Len(mystr) To 1 Step -1
            mynum = mynum + Val(Mid(mystr, i, 1)) * 10 ^ (Len(mystr) - i)
        Next
        toNum1 = mynum
        Exit Function
    Case 1    '万三千....
        toNum1 = toNum1(Right(mystr, Len(mystr) - falg)) + 10 ^ (myPos2)
    Case 2
        Dim temp As String
        temp = Mid(mystr, 1, 1)
        If InStr(1, comString, temp, vbBinaryCompare) > 8 Then    '代表第一位为数字第二位为位符如6万
            toNum1 = toNum1(Right(mystr, Len(mystr) - falg)) + Val(temp) * 10 ^ (myPos2)
        Else    '如十万、百万...万万
            toNum1 = toNum1(Right(mystr, Len(mystr) - falg)) + 10 ^ (InStr(1, comString, temp, vbBinaryCompare) + myPos2)
        End If
    Case Else
        toNum1 = toNum1(Right(mystr, Len(mystr) - falg)) + toNum1(Left(mystr, falg - 1)) * 10 ^ (myPos2)
    End Select
End Function
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 07:58 , Processed in 0.027455 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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