ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]为何VBA不能替换尾注中的换行符?如何解决?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-3-15 08:48 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

想对尾注文本进行适当的替换,且将换行符人工换行符前分别加一标记(),同时将人工换行符换成落标记,用了下面的代码,但奇怪的是常规替换部分替换正常,唯独对换行符人工换行符替换无效!是何原因?如何达到目的?变通解决也可。

Sub 替换尾注()

  '常规替换
    Set myRange = ActiveDocument.Endnotes(1).Range
     myRange.Find.Execute findtext:="[", replacewith:="[", Replace:=wdReplaceAll
     myRange.Find.Execute findtext:="]", replacewith:="]", Replace:=wdReplaceAll
   '替换换段符
     myRange.Find.Execute findtext:="^p", replacewith:="♀^p", Replace:=wdReplaceAll
     myRange.Find.Execute findtext:="^l", replacewith:="♀^p", Replace:=wdReplaceAll

End Sub

I42nkogy.rar (7.85 KB, 下载次数: 11)
[此贴子已经被作者于2007-3-15 10:01:45编辑过]

TA的精华主题

TA的得分主题

发表于 2007-3-16 06:13 | 显示全部楼层

最近很忙,所以也没有更多的时间上论坛了。

请参考:

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2007-3-16 6:09:53
'
仅测试于System: Windows NT Word: 11.0 Language: 2052
'
0179^The Code CopyIn [ThisDocument-ThisDocument]^'
'*
-----------------------------

Sub Example()
    Dim myRange As Range, i As Endnote
    Application.ScreenUpdating = False
    For Each i In ActiveDocument.Endnotes
        With i.Range
            .Find.Execute findtext:="[", replacewith:="
", Replace:=wdReplaceAll
            .Find.Execute findtext:="]", replacewith:="
", Replace:=wdReplaceAll
            .Find.Execute findtext:="^l", replacewith:="
^p", Replace:=wdReplaceAll
            .InsertAfter "
"
        End With
    Next
    Application.ScreenUpdating = True
End Sub
'----------------------

Sub Example2()
    Dim myRange As Range, i As Endnote
    Application.ScreenUpdating = False
Again:     With ActiveDocument.StoryRanges(wdEndnotesStory).Find
        .Execute findtext:="[", replacewith:="
", Replace:=wdReplaceAll
        .Execute findtext:="]", replacewith:="
", Replace:=wdReplaceAll
        .Execute findtext:="^l", replacewith:="
^p", Replace:=wdReplaceAll
        Set myRange = ActiveDocument.StoryRanges(wdEndnotesStory)
        While Not (myRange.NextStoryRange Is Nothing)
            GoTo Again
        Wend
    End With
    For Each i In ActiveDocument.Endnotes
        i.Range.InsertAfter "
"
    Next
    Application.ScreenUpdating = True
End Sub
'----------------------


在你提供的尾注文本中,"^p"是一个可查找内容,但不是一个可以替换的内容,可以从   i.Range.InsertAfter ""看出.

正常的尾注文本和脚注文本是可以替换的段落标记的.

[此贴子已经被作者于2007-3-16 6:19:59编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-16 09:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

高手就是高手,两招都能致胜。以后一招更为厉害(速度更快)。

非常感谢!

[此贴子已经被作者于2007-3-16 10:18:19编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-16 11:18 | 显示全部楼层

此法如文档中无尾注,则运行错误,为此加下面的语句,不知有无其他问题?

On Error GoTo line1    ' 如无尾注退出程序
……

line1:
End Sub

TA的精华主题

TA的得分主题

发表于 2007-3-17 06:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用ssq1109在2007-3-16 11:18:11的发言:

此法如文档中无尾注,则运行错误,为此加下面的语句,不知有无其他问题?

On Error GoTo line1    ' 如无尾注退出程序
……

line1:
End Sub

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2007-3-17 6:23:13
'
仅测试于System: Windows NT Word: 11.0 Language: 2052
'
0181^The Code CopyIn [ThisDocument-ThisDocument]^'
'*
-----------------------------

Option Explicit

Sub Example2()
    Dim myRange As Range, i As Endnote
    '
如果没有尾注则退出

    If ActiveDocument.Endnotes.Count = 0 Then Exit Sub
    Application.ScreenUpdating = False
Again:     With ActiveDocument.StoryRanges(wdEndnotesStory).Find
        .Execute findtext:="[", replacewith:="
", Replace:=wdReplaceAll
        .Execute findtext:="]", replacewith:="
", Replace:=wdReplaceAll
        .Execute findtext:="^l", replacewith:="
^p", Replace:=wdReplaceAll
        Set myRange = ActiveDocument.StoryRanges(wdEndnotesStory)
        While Not (myRange.NextStoryRange Is Nothing)
            GoTo Again
        Wend
    End With
    For Each i In ActiveDocument.Endnotes
        i.Range.InsertAfter "
"
    Next
    Application.ScreenUpdating = True
End Sub
'----------------------


在编辑的设计中,对于已知错误,可以规避的,没有必要使用处理错误,对于未知错误,必须规避,并且对文档不会产生致命影响的,可以使用On error resume next;对于可能导致文档致命影响(如数据计算),应侦测错误并返回错误信息,由用户决定是否继续程序的运行更好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-17 13:12 | 显示全部楼层

谢谢守大侠的指点。以后遇到此类问题我一定会按您说的步骤考虑。

其实我原也想到了If语句,但就是不知道后面怎么准确表达,看帮助文件也未得其果。On Error Resume Next也试过,但测试时好像是死循环,无道理?

已感到WORD越学越有趣,特别是VBA,通过它能知道一些对象的具体运作方式,对对象的属性和方法会有更深的理解,消去对软件的神秘感,同时也能窥见软件编制者和网上高手的绝妙思维。但也觉得越学困惑也越多,也许是水平低所致。不知守版主、孔版主等高手是否也会有疑惑的时候,我想有的话也是“高级烦恼”吧!

比如最近几天遇到的事都感到无道理,先是脚注中的序号用^f查不到,后又出现顶楼的问题,今天又发现新问题:

在守大侠的Sub Example2代码中间加上下面的语句段,意图见注释(要求不对尾注正文中的上标起作用)

    '先去掉尾注标记序号的上标属性,这样更符合中文排版习惯
   With ActiveDocument.StoryRanges(wdEndnotesStory).Find
      .ClearFormatting
      .Text = "^e"
      .Font.Superscript = True
      With .Replacement
          .ClearFormatting
          .Font.Superscript = False
          .Text = "^&"
      End With
      .Execute Format:=True, Replace:=wdReplaceAll
   End With
测试几个文档都可以,如对顶楼的附件就能完全达到目的。但对下面附件中的Test1.doc又不灵了!?这怎么回事呢?又怎样能编出应对各种可能情况的代码呢?

 

DuFTaFec.rar (8.16 KB, 下载次数: 9)


TA的精华主题

TA的得分主题

发表于 2007-3-19 06:59 | 显示全部楼层
QUOTE:
以下是引用ssq1109在2007-3-17 13:12:57的发言:
测试几个文档都可以,如对顶楼的附件就能完全达到目的。但对下面附件中的Test1.doc又不灵了!?这怎么回事呢?又怎样能编出应对各种可能情况的代码呢?

这些问题的来源,主要是楼主或者楼主相关的人员,未严格按照WORD文档自来的要求与功能来做的.

为什么此附件文档不能正确查找呢?

请选中这些文档中的某个尾注或者脚注标记,运行以下代码

Sub Example()
If Asc(Selection.Text) = 2 Then MsgBox "这是尾注/脚注标记!" Else MsgBox "这是普通文本!"
End Sub
VBA只能针对已知对象或者共有属性,才能正确运行.如果象楼主这样不规范的文本标记又无法固定规律的,VBA运行过程中是极易出错的.

[此贴子已经被作者于2007-3-19 6:59:50编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-19 13:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 16:24 , Processed in 0.038914 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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