ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] Word排版跳过表格的代码,提高效率

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-8-29 21:11 | 显示全部楼层
参照下面的代码:

Sub ChooseContent()
    Dim rng As Range
    Dim sArr() As Variant
    Dim eArr() As Variant
    Dim ListC, TableC, FieldC, InshapeC, Cnt As Integer
   
    With ActiveDocument
        ListC = .ListParagraphs.Count
        TableC = .Tables.Count
        FieldC = .Fields.Count
        InshapeC = .InlineShapes.Count
        Cnt = ListC + TableC + FieldC + InshapeC
        ReDim sArr(Cnt - 1)
        ReDim eArr(Cnt - 1)
        
        If ListC <> 0 Then  '获取带列表的段落位置
            For i = 0 To ListC - 1
                sArr(i) = .ListParagraphs.Item(i + 1).Range.Start
                eArr(i) = .ListParagraphs.Item(i + 1).Range.End
            Next
        End If
        
        If TableC <> 0 Then '获取表格的位置
            For i = ListC To ListC + TableC - 1
                sArr(i) = .Tables.Item(i + 1 - ListC).Range.Start - 1
                eArr(i) = .Tables.Item(i + 1 - ListC).Range.End
            Next
        End If
        
        If FieldC <> 0 Then '获取题注的位置
            For i = ListC + TableC To ListC + TableC + FieldC - 1
                sArr(i) = .Fields.Item(i + 1 - ListC - TableC).Result.Paragraphs(1).Range.Start
                eArr(i) = .Fields.Item(i + 1 - ListC - TableC).Result.Paragraphs(1).Range.End
            Next
        End If
         
        If InshapeC Then  '获取内嵌图片位置
            For i = ListC + TableC + FieldC To ListC + TableC + FieldC + InshapeC - 1
                sArr(i) = .InlineShapes.Item(i + 1 - ListC - TableC - FieldC).Range.Start
                eArr(i) = .InlineShapes.Item(i + 1 - ListC - TableC - FieldC).Range.End + 1
            Next
        End If
        
        Call BubbleSort(sArr, Cnt - 1) '排序
        Call BubbleSort(eArr, Cnt - 1)
        
        If sArr(0) <> 0 Then  '前文字
            Set rng = .Range(Start:=0, End:=sArr(0))
            rng.Editors.Add wdEditorEveryone
        End If
        
        For i = 0 To Cnt - 2 '间文字
             If eArr(i) < sArr(i + 1) Then
                Set rng = .Range(Start:=eArr(i), End:=sArr(i + 1))
            End If
            rng.Editors.Add wdEditorEveryone
        Next
        
        If eArr(Cnt - 1) <> .Range.End Then '后文字
            Set rng = .Range(Start:=eArr(Cnt - 1), End:=.Range.End)
           
        End If
        .SelectAllEditableRanges wdEditorEveryone
        .DeleteAllEditableRanges wdEditorEveryone

        
    End With
End Sub

Function BubbleSort(ByRef byArr() As Variant, bySize As Integer)
    Dim TEMP As Variant
    For i = 0 To bySize - 2
        For j = i + 1 To bySize - 1
            If byArr(i) > byArr(j) Then
                TEMP = byArr(j)
                byArr(j) = byArr(i)
                byArr(i) = TEMP
            End If
        Next j
    Next i
End Function

TA的精华主题

TA的得分主题

发表于 2022-8-29 21:31 | 显示全部楼层
简单参照下面代码:
Sub 选择所有不含表格的段落图片()
   
    Application.ScreenUpdating = False
    Dim starTimer As Long
    Dim tempStr As String
    starTimer = Timer
    Dim i%, myRange()
   
    '选择所有不含表格的段落
    With ActiveDocument
        ReDim myRange(.Tables.Count + 1)
        If .Tables.Count > 0 Then
            Set myRange(0) = .Range(0, 0)
            For i = 1 To .Tables.Count
                If i = 1 Then
                    Set myRange(i) = .Range(0, .Tables(i).Range.Start)
                Else
                    Set myRange(i) = .Range(.Tables(i - 1).Range.End, .Tables(i).Range.Start)
                End If
            Next
            Set myRange(i) = .Range(.Tables(i - 1).Range.End, .Content.End)
        Else
            Set myRange(1) = .Content
        End If
    End With
     
    '选择不含图片的段落
    For i = 1 To UBound(myRange)
        
        For Each myPara In myRange(i).Paragraphs
            tempStr = myPara.Range.text
            
                If Len(tempStr) >= 3 Then
                    myPara.Range.Editors.Add wdEditorEveryone
                End If
        Next
    Next
    ActiveDocument.SelectAllEditableRanges wdEditorEveryone
    ActiveDocument.DeleteAllEditableRanges wdEditorEveryone
   
    MsgBox "作业完成,用时:" & Int(Timer - starTimer) & "秒"
    Application.ScreenUpdating = True
      
End Sub

TA的精华主题

TA的得分主题

发表于 2023-5-29 16:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 04:00 , Processed in 0.035652 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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