ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

一个困扰我很长时间的代码转换问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-19 07:58 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 5ihome 于 2017-3-20 08:08 编辑

本人编程水平入门,被下面的代码转换问题已经困扰了有快一个月了,期间加入了五六个VBA群,请教高手后均石沉大海,特前来论坛发贴

请教,希望各路高手,能在百忙之中,解决一下,万分感激!要求、结果、代码附上
8.png

最新代码.zip

4.64 KB, 下载次数: 23

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-19 08:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不知道用VBA改VBA代码,合不合理,里面的需要处理的逻辑太多了,希望有高手能提供一些建议或使用其它工具的想法,非常感谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-19 09:02 | 显示全部楼层
我想的思路是:
1.先处理断行,把断行并成一行
2.再处理With语句,因为with语句会一层套一层,所以要先处理最顶层的with语句,然后再处理下一层……
3.处理带括号的赋值语句
4.删除对象定义的关键词,并换成新的关键词
5.处理不带括号的赋值语句
但是心有余,力不足 ,哎
6.处理对象的属性或方法后面没有赋值的语句,添加()

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-19 09:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这条想了一下,应该更正为
2.再处理With语句,因为with语句会一层套一层,所以要先最底层的with语句开始,然后再处理上一层……

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-19 16:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 5ihome 于 2017-3-19 16:55 编辑

本人使用其他平台语言,操作word VBA,因为语言不支持With语句,不支持断行,不支持直接片断赋值,只能这样更新一下代码才能使用,所以想用个批处理的方法,解决一下!希望高手,支招一下!多谢!

TA的精华主题

TA的得分主题

发表于 2017-3-19 21:44 | 显示全部楼层
本帖最后由 zhanglei1371 于 2017-3-20 13:48 编辑


Sub df()
Dim pa As Paragraph, re As Object
    ActiveDocument.Range.Find.Execute "_^13", , , 2, , , , 0, 0, "", 2  '第一个2决定是否通配,第二个决定是否全部替换
    Set re = CreateObject("vbscript.regexp")
    re.Global = 1
    For Each pa In ActiveDocument.Paragraphs
        If InStr(pa.Range, ":=") > 0 Then
              re.Pattern = "\w+:=.+?(?=,)|\w+:=.+(?=\))|\w+:=.+?(?=\r)"
            For Each ma In re.Execute(pa.Range)
                s1 = Split(ma, ":=")(0)
                s2 = Split(ma, ":=")(1)

                If ch13 = 0 Then
                    ch13 = ch13 + 1
                    pa.Range.InsertBefore Chr(13)
                End If
ma = Replace(Replace(ma, "(", "\("), ")", "\)")
                ActiveDocument.Range(pa.Range.Previous.End - 1, pa.Range.Previous.End - 1).InsertAfter "virant " & s1 & "=" & s2 & Chr(13)
                If InStr(pa.Range, "(") > 0 Then
                    pa.Range.Find.Execute "\(" & ma, MatchWildcards:=1, replacewith:="(" & s1, Replace:=1
                    pa.Range.Find.Execute "[ \,]{1,}" & ma, MatchWildcards:=1, replacewith:=" " & s1, Replace:=1
                    pa.Range.Find.Execute ma, replacewith:=s1, Replace:=1
                    If UBound(Split(pa.Range, ":=")) = 0 And pa.Range.Characters.Last.Previous <> ")" Then pa.Range.Characters.Last.Previous.InsertAfter ")"
                ElseIf UBound(Split(pa.Range, ":=")) > 1 Then
                    pa.Range.Find.Execute "[ ,]{1,}" & ma, MatchWildcards:=1, replacewith:="(" & s1, Replace:=1
                Else
                    pa.Range.Find.Execute " " & ma, replacewith:="(" & s1 & ")", Replace:=1
                End If
            Next
            ch13 = 0
        End If
        fi = Split(Trim(pa.Range.Text), " ")(0)
        re.Pattern = "\.\w+\r"
        If re.test(pa.Range) And InStr(pa.Range, "With") = 0 Then
            pa.Range = Replace(pa.Range, Chr(13), "") & "()" & Chr(13)
        ElseIf fi = "With" Then
            tf = tf + 1
            strB = strB & Replace(Split(Trim(pa.Range.Text), " ")(1), Chr(13), "") & "@"
            pa.Range = ""
        ElseIf fi = "Set" Then
            re.Pattern = "\.(\w+)\("
            Set sm = re.Execute(pa.Range)
            strA = sm(0).submatches(0)
            pa.Range.Find.Execute findtext:=fi, replacewith:="word." & strA
        ElseIf Left(Trim(pa.Range), 1) = "." Then
            pa.Range = Replace(strB, "@", "") & Trim(pa.Range)
        ElseIf InStr(pa.Range.Text, " .") > 0 Then
            re.Pattern = "\s\."
            If re.test(pa.Range) Then
                st = re.Execute(pa.Range)(0).firstindex
                ActiveDocument.Range(pa.Range.Start + st + 1, pa.Range.Start + st + 1).InsertAfter Replace(strB, "@", "")
            End If
        ElseIf Replace(Trim(pa.Range), Chr(13), "") = "End With" Then
            tf = tf - 1
            strB = Left(strB, InStrRev(strB, "@", Len(strB) - 2))
            pa.Range = ""
        End If
    Next
    re.MultiLine = 1
    re.ignorecase = 1
re.Pattern = "^\s+|Then|End If|End Sub"      '|^Sub.+$^\s*Dim.+$"
Debug.Print re.test(ActiveDocument.Range)
ActiveDocument.Range = re.Replace(ActiveDocument.Range, "")
End Sub
其他的很简单了,自己搞

ActiveDocument.rar

4.63 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 05:30 | 显示全部楼层
刚刚看到回复,真心感谢您

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 06:00 | 显示全部楼层
本帖最后由 5ihome 于 2017-3-20 06:11 编辑

测试了一下,发现:赋值符:=前、后都有同一个单词的情况下(如下图,都有Strart、End)会出现错误,期待楼上的高手能指点一下迷津!万分感谢!
真心感觉正则的高手,应该能很容易解决,本人刚在网上买了本正则指引,还没有收到货,发现玩转查找替换,真该补补正则了!

也希望论坛出版一些针对Word VBA的正则方面的书籍,因为我发现论坛上的有难度的问题,几乎都是清一色的正则问题!


365.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 07:49 | 显示全部楼层
本帖最后由 5ihome 于 2017-3-20 08:11 编辑

如果有三个参数需要赋值,也出现了错误

err.png

最新代码.zip

4.64 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 11:23 | 显示全部楼层
本帖最后由 5ihome 于 2017-3-20 11:27 编辑
zhanglei1371 发表于 2017-3-19 21:44
难度倒是不难,就是繁琐,粗略写了些,不想写了:
Sub df()
Dim pa As Paragraph, re As Object

您好,因为我刚注册,不能发消息,所以在这里回复一下:
您编写的代码,基本上没有什么问题,就是对多个参数的识别上有点小问题
另外,后期我也要在用一些kootools插件进行优化,怕到时候有影响,所以把优化代码的注意事项,也写在了下面,希望能一并处理一下。
你我素不相,如此热心帮助,感激涕零,无以言表!

注意事项:
1.有时会有多个参数赋值,所以要考虑到多个,号的识别,如:三个参数是两个逗号,四个参数是三个逗号……
2.有时变量值和变量值的最后一个字段是相同,如:代码5中的Start End Text

优化代码事项:
删除所有 Dim……所在行 语句
删除所有 Sub……所在行 语句
删除所有 End Sub所在行 语句
删除所有 Then 单词
删除所有 End If 所在行 语句
删除所有行前面的缩进,即:所有行左对齐
所有ActiveDocument.替换为ad.
所有Application.替换为wd.
所有=ture结尾的行替换为= 1
所有= ture结尾的行替换为= 1
手改完美代码.png

未处理代码.zip

4.67 KB, 下载次数: 12

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

本版积分规则

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

GMT+8, 2024-5-27 15:08 , Processed in 0.039541 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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