ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]如何用VBA--将尾注文本变为普通文本?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-9-23 20:34 | 显示全部楼层 |阅读模式

一文档中有尾注,但又不是都集中放在文尾,而是分几处插在正文中(见附件中的NEW.DOC),如果将这样的文档另存为文本文件,在所得的文本文件中,尾注文本又都集中到文尾了(见NEW1.TXT)。

现要求:

1. 将这篇文档中的尾注文本都变成普通文本,且还是放在尾注文本原来所在页面的位置,这样就可保证再另存为文本文件后,尾注文本和原文档页面布局是相同的(见NEW2.TXT)。且要求实现这种转换后,原文中的尾注序号不丢失,或者干脆将其也变为普通的上标格式文本

2. 如果原正文和尾注文本间有尾注分隔符(即有一条横线),将这条线变为[line]。

不知这种要求能否实现?请高人相助。谢谢!

UJnRtlW2.rar (16.48 KB, 下载次数: 47)

TA的精华主题

TA的得分主题

发表于 2006-9-24 09:21 | 显示全部楼层

这个问题问得我好累,从昨天开始考虑到收稿,近4小时。

以下代码供参考:

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2006-9-24 9:20:40
'
仅测试于System: Windows NT Word: 11.0 Language: 2052
'
0075^The Code CopyIn [ThisDocument-ThisDocument]^'
'*
-----------------------------

Option Explicit
Sub GetEndNotes()
    Dim myRange As Range, oSection As Section
    Dim NewDoc As Document
    Dim intCount As Integer, rngStart As Range, rngEnd As Range
    Application.ScreenUpdating = False    '
关闭屏幕更新

    Set NewDoc = Documents.Add    '
新建一个文档
    For Each oSection In ThisDocument.Sections    '
本文档节中循环
        With oSection
            '
定义一个Range对象为新文档的文档结束标记前一个插入点位置
            Set myRange = NewDoc.Range(NewDoc.Content.End - 1, NewDoc.Content.End - 1)
            myRange.InsertAfter .Range.Text    '
插入节文本
            If .Range.Endnotes.Count = 0 Then    '
如果没有尾注
            Else
                myReplace myRange, .Index, True    '
执行指定的查找与替换
                '
定义一个Range对象为新文档的文档结束标记前一个插入点位置
                Set myRange = NewDoc.Range(NewDoc.Content.End - 1, NewDoc.Content.End - 1)
                '
如果具有尾注分隔符
               

TA的精华主题

TA的得分主题

发表于 2006-9-24 09:22 | 显示全部楼层

 If Asc(.Range.Endnotes.Separator.Text) = 3 Then
                    '
插入指定标记文本

                    myRange.InsertAfter "[line]" & Chr(13)
                    '
定义一个Range对象为新文档的文档结束标记前一个插入点位置
                    Set myRange = NewDoc.Range(NewDoc.Content.End - 1, NewDoc.Content.End - 1)
                    intCount = .Range.Endnotes.Count    '
取得本节尾注数量
                    Set rngStart = .Range.Endnotes(1).Range    '
定义一个起始Range对象
                    Set rngEnd = .Range.Endnotes(intCount).Range    '
定义一个结束Range对象
                    rngStart.SetRange rngStart.Start - 1, rngEnd.End    '
重新定义一个Range对象,为本节尾注区域
                    myRange.InsertAfter rngStart.Text    '
插入尾注文本
                    myReplace myRange, .Index, False    '
执行指定的查找与替换
                End If
            End If
        End With
    Next
    NewDoc.Fields.Update    '
更新SEQ
    Application.ScreenUpdating = True    '
恢复屏幕更新
End Sub
'----------------------

oNqPwA9n.rar

19.02 KB, 下载次数: 64

[求助]如何用VBA--将尾注文本变为普通文本?

TA的精华主题

TA的得分主题

发表于 2006-9-24 09:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Function myReplace(oRange As Range, RC As Integer, TF As Boolean)
    Dim FieldText1 As String, FieldText2 As String, FieldText As String
    Dim FieldRange As Range, wdNR As WdNumberingRule
    With ThisDocument
        wdNR = .Endnotes.NumberingRule    '
取得尾注编号类型

        If wdNR = wdRestartContinuous Then    '
继续编号
            FieldText1 = "SEQ A"
            FieldText2 = "SEQ B"
        ElseIf wdNR = wdRestartSection Then    '
每节开始重新编号
            FieldText1 = "SEQ " & Chr(64 + RC)
            FieldText2 = "SEQ _" & Chr(64 + RC)
        End If
        Set FieldRange = .Range(0, 0)    '
定义一个Range对象
        FieldText = VBA.IIf(TF = True, FieldText1, FieldText2)    '
域代码文本
        .Fields.Add FieldRange, wdFieldEmpty, FieldText, False    '
插入域
        FieldRange.SetRange 0, Len(FieldText) + 6    '
重新定义Range对象,注意2003中的域标记长度为4而非2
        With FieldRange    '
此处设置编号格式

            '        .Select'
            .Font.Superscript = True    '
上标
            .Font.Name = "Tahoma"    '
字体
            .Cut
        End With
        With oRange.Find    '
查找与替换
            .ClearFormatting
            .Execute findtext:="^2", replacewith:="^c", Replace:=wdReplaceAll
        End With
    End With
End Function
'----------------------


[此贴子已经被作者于2006-9-24 9:23:43编辑过]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-9-24 10:09 | 显示全部楼层

非常谢谢守柔大侠!

我仔细看了代码,再回想我最初试图解决的思路,反倒使我感到要把VBA学到能解决较复杂问题的水平还很有些难度。

经测试,非常好,完全达到要求。

TA的精华主题

TA的得分主题

发表于 2011-8-9 16:54 | 显示全部楼层

回复 4楼 守柔 的帖子

对守柔的程序进行了修改,应该可以适合更多的人


'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2006-9-24 9:20:40
'* modfied by dengyixiang@gmail.com 2011-8-9 16:52:03
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0075^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Option Explicit

'尾注均放在文档末尾

Sub 尾注转化为文本()
    Dim orng As Range, sec As Section
    Dim odoc As Document
    Dim intCount As Integer, rngStart As Range, rngEnd As Range
   
    Application.ScreenUpdating = False    '关闭屏幕更新
    Set odoc = Documents.Add    '新建一个文档
    ThisDocument.Range.Copy
    odoc.Range.Paste
    odoc.Fields.Unlink
    Call myReplace(odoc.Range, 1, True)    '执行指定的查找与替换
   
    For Each sec In ThisDocument.Sections    '本文档节中循环
        With sec
            '定义一个Range对象为新文档的文档结束标记前一个插入点位置
            Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
'            orng.InsertAfter sec.Range.Text    '插入节文本
            
'            sec.Range.Copy
'            orng.Paste
            
            
            If sec.Range.Endnotes.Count = 0 Then    '如果没有尾注
            Else
'                Call myReplace(orng, sec.Index, True)    '执行指定的查找与替换
'
'                ' 定义一个Range对象为新文档的文档结束标记前一个插入点位置
'                Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
               
                '如果具有尾注分隔符
               
               
               
                If Asc(sec.Range.Endnotes.Separator.Text) = 3 Or sec.Range.Endnotes.Separator.Text = "" Then
                        
                        '插入指定标记文本
'                        orng.InsertAfter "[line]" & Chr(13)
                        
                        '定义一个Range对象为新文档的文档结束标记前一个插入点位置
                        Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
                        
                        intCount = sec.Range.Endnotes.Count    '取得本节尾注数量
                        Set rngStart = sec.Range.Endnotes(1).Range    '定义一个起始Range对象
                        Set rngEnd = sec.Range.Endnotes(intCount).Range    '定义一个结束Range对象
                        
                        rngStart.SetRange rngStart.Start - 1, rngEnd.End    '重新定义一个Range对象,为本节尾注区域
                        'orng.InsertAfter rngStart.Text    '插入尾注文本
                        rngStart.Copy
                        orng.Paste
                        
                        Call myReplace(orng, sec.Index, False)    '执行指定的查找与替换
                End If
            End If
        End With
    Next
   
    odoc.Fields.Update    '更新SEQ域
    odoc.Fields.Unlink
    Call 替换连续数字(ThisDocument, odoc)
    Application.ScreenUpdating = True    '恢复屏幕更新
End Sub



'如果文档有多节,且每节都有尾注,采用此文档

Sub 多节尾注转化为文本()
    Dim orng As Range, sec As Section
    Dim odoc As Document
    Dim intCount As Integer, rngStart As Range, rngEnd As Range
   
    Application.ScreenUpdating = False    '关闭屏幕更新
    Set odoc = Documents.Add    '新建一个文档
   
    For Each sec In ThisDocument.Sections    '本文档节中循环
        With sec
            '定义一个Range对象为新文档的文档结束标记前一个插入点位置
            Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
'            orng.InsertAfter sec.Range.Text    '插入节文本
            
            sec.Range.Copy
            orng.Paste
            
            
            If sec.Range.Endnotes.Count = 0 Then    '如果没有尾注
            Else
                Call myReplace(orng, sec.Index, True)    '执行指定的查找与替换
               
                ' 定义一个Range对象为新文档的文档结束标记前一个插入点位置
                Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
               
                '如果具有尾注分隔符
                If Asc(sec.Range.Endnotes.Separator.Text) = 3 Then
                        
                        '插入指定标记文本
'                        orng.InsertAfter "[line]" & Chr(13)
                        
                        '定义一个Range对象为新文档的文档结束标记前一个插入点位置
                        Set orng = odoc.Range(odoc.Content.End - 1, odoc.Content.End - 1)
                        
                        intCount = sec.Range.Endnotes.Count    '取得本节尾注数量
                        Set rngStart = sec.Range.Endnotes(1).Range    '定义一个起始Range对象
                        Set rngEnd = sec.Range.Endnotes(intCount).Range    '定义一个结束Range对象
                        
                        rngStart.SetRange rngStart.Start - 1, rngEnd.End    '重新定义一个Range对象,为本节尾注区域
'                        orng.InsertAfter rngStart.Text    '插入尾注文本
                        rngStart.Copy
                        orng.Paste
                        Call myReplace(orng, sec.Index, False)    '执行指定的查找与替换
                End If
            End If
        End With
    Next
    odoc.Fields.Update    '更新SEQ域
    Application.ScreenUpdating = True    '恢复屏幕更新
End Sub


'将orange中的阈替换为编号
'TF表示是否采用A还是B编号
'RC是为了生成域标志

Function myReplace(oRange As Range, RC As Integer, TF As Boolean)
    Dim txt1 As String, txt2 As String, txt As String
    Dim FieldRange As Range, wdNR As WdNumberingRule
    Dim doc As Document
   
    With ThisDocument
        wdNR = ThisDocument.Endnotes.NumberingRule    '取得尾注编号类型
        If wdNR = wdRestartContinuous Then    '继续编号
            txt1 = "SEQ A"
            txt2 = "SEQ B"
        ElseIf wdNR = wdRestartSection Then    '每节开始重新编号
            txt1 = "SEQ " & Chr(64 + RC)
            txt2 = "SEQ _" & Chr(64 + RC)
        End If
        
        Set FieldRange = ThisDocument.Range(0, 0)    '定义一个Range对象
        txt = VBA.IIf(TF = True, txt1, txt2)    '域代码文本
        
        ThisDocument.Fields.Add FieldRange, wdFieldEmpty, txt, False    '插入域
        
        FieldRange.SetRange 0, Len(txt) + 6    '重新定义Range对象,注意2003中的域标记长度为4而非2
        With FieldRange    '此处设置编号格式
            '        .Select'
            If (TF = True) Then
                .Font.Superscript = True    '上标
            End If
            .Font.Size = 10
            .Font.Name = "Times New Roman"    '字体
            .Cut
        End With
        With oRange.Find    '查找与替换
            .ClearFormatting
            .Execute findtext:="^2", replacewith:="^c", Replace:=wdReplaceAll
        End With
    End With
End Function


Sub 替换连续数字(refdoc As Document, doc As Document)
    Dim p As Paragraph, ch As String, s As String
    Dim i1 As Long, i2 As Long, i As Long
    Dim r As Range
    Dim np As Long
   
   
   
    For np = 1 To refdoc.Paragraphs.Count
    If (refdoc.Paragraphs(np).Range.Endnotes.Count > 1) Then
   
        i1 = -1
        i2 = -1
        For i = doc.Paragraphs(np).Range.Start To doc.Paragraphs(np).Range.End - 1
        
            If (doc.Range(i, i + 1).Text = "[") Then
                i1 = i + 1
            End If
            If (doc.Range(i, i + 1).Text = "]") Then
                i2 = i
                If (i1 > 0 And i2 > 0) Then
                    Set r = doc.Range(i1, i2)
                    
                    With r.Find    '查找与替换
                        .ClearFormatting
                        .Execute findtext:=r.Text, replacewith:=ns(r.Text), Replace:=wdReplaceAll
                    End With
                    
'                    Debug.Print r.Text
                    i1 = -1
                End If
            End If
            
        Next i
   
    End If
    Next np
        
        

End Sub



Function ns(s As String) As String

's = WorksheetFunction.Substitute(s, ":", ";")
's = WorksheetFunction.Substitute(s, ";", ";")
's = WorksheetFunction.Substitute(s, ":", ";")
's = WorksheetFunction.Substitute(s, ";", ";")

s = conNumStr(s, ",")
s = conNumStr(s, ",")
ns = s


'ns = WorksheetFunction.Substitute(ns, "基本项目;", "基本项目:")
'ns = WorksheetFunction.Substitute(ns, "特定项目;", "特定项目:")



End Function

Function conNumStr(s As String, flag As String) As String
Dim s2 As String
Dim i As Integer, j As Integer, n As Integer
Dim ib As Integer, ie As Integer
Dim num1 As Integer, num2 As Integer, nums As String, numstart As Integer
Dim ss(200) As String, nss As Integer, ss2(200) As String


'可以用Function Substitute(Arg1 As String, Arg2 As String, Arg3 As String, [Arg4]) As String进行字符替换

If (Right(s, 1) <> flag) Then s = s & flag
ib = 1
numstart = -1
nss = 0

num1 = 1
For i = 1 To Len(s)

    If (Mid(s, i, 1) = flag) Then
        nss = nss + 1
        ss(nss) = Mid(s, num1, i - num1)
        ss2(nss) = Mid(s, num1, i - num1)
        num1 = i + 1
'        Debug.Print ss(nss)
    End If
Next i



For i = 2 To nss - 1
If (IsNumeric(ss(i)) And IsNumeric(ss(i - 1)) And IsNumeric(ss(i + 1))) Then
If (ss(i - 1) + 1 = ss(i) And ss(i) + 1 = ss(i + 1)) Then
ss2(i) = "-"
End If
End If
Next i

s2 = ss2(1)
For i = 2 To nss
    If (Not (ss2(i) = "-" And ss2(i - 1) = "-")) Then
        If (ss2(i) = "-" Or ss2(i - 1) = "-") Then
            s2 = s2 & ss2(i)
        Else
            s2 = s2 & flag & ss2(i)
        End If
    End If
Next i

conNumStr = s2

End Function

TA的精华主题

TA的得分主题

发表于 2012-2-28 14:41 | 显示全部楼层
编译错误:方法和数据成员未找到

TA的精华主题

TA的得分主题

发表于 2012-2-28 09:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这些代码怎么使用 啊

TA的精华主题

TA的得分主题

发表于 2020-5-5 19:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
守柔 发表于 2006-9-24 09:23
Function myReplace(oRange As Range, RC As Integer, TF As Boolean)&nbsp;&nbsp;&nbsp; Dim FieldText1 A ...

谢谢,非常有用。
但原文档的格式丢失了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-28 04:50 , Processed in 0.064102 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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