学习笔记411

Sub ClearBlankBeforeParagraph()
    Dim StartTime As Variant
    Dim UsedTime As Variant
    StartTime = VBA.Timer
    Application.ScreenUpdating = False
    Dim oneP As Paragraph
    Dim rng As Range
    Call ConvertShape
    Call DivideInLineShape
    '删除所有空行
    ActiveDocument.Content.Find.Execute "^13[  ^t" & ChrW(160) & "^11^13]{1,}", , , 2, , , , , , "^p", 2
    '清除缩进
    With ActiveDocument.Paragraphs.Format
        .TabStops.ClearAll
        .CharacterUnitLeftIndent = 0
        .CharacterUnitRightIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .FirstLineIndent = CentimetersToPoints(0)
        .LeftIndent = CentimetersToPoints(0)
        .RightIndent = CentimetersToPoints(0)
        .SpaceBefore = 0
        .SpaceBeforeAuto = False
        .SpaceAfter = 0
        .SpaceAfterAuto = False
        .LineUnitBefore = 0
        .LineUnitAfter = 0
        .MirrorIndents = False
    End With
    
    ActiveDocument.Content.Find.Execute "^l", , , 0, , , , , , "^13", 2 '软回车转硬回车
    
    ActiveDocument.Range(0, 0).InsertBefore vbCrLf
    ActiveDocument.Content.Find.Execute "[^13^11]@[  ^s^32^t]@([! ^t ^s^32]@)", , , 1, , , , , , "^13\1", 2   '删除段首空白和替换回车
    ActiveDocument.Paragraphs(1).Range = ""
    ActiveDocument.Content.Find.Execute "([ABCD])[.、.][ ^s^32 ^t?" & Chr(63) & ChrW(160) & "]@([! ^t^s^32]@)", , , 1, , , , , , "\1.\2", 2 '删除字母和选项之间的空白
    ActiveDocument.Content.Find.Execute "[!^13]([BCD].)", , , 1, , , , , , "^13\1", 2  'ABCD选项独立一行
    ActiveDocument.Content.Find.Execute "(^13[ABCD].[!^13]@)[ ^s^32 ^t? " & Chr(63) & Chr(160) & "]@(^13)", , , 1, , , , , , "\1\2", 2  '删除选项后面的空白
    ActiveDocument.Content.Find.Execute "(^13[ABCD].[! ^s^32 ^t?" & Chr(63) & Chr(160) & "]@)[ ^s^32 ^t?" & Chr(63) & "]@([! ^s^32 ^t?" & Chr(63) & Chr(160) & "]@^13)", , , 1, , , , , , "\1、\2", 2    '选项中间多个答案部分之间的空白
    ActiveDocument.Content.Find.Execute "^13", , , 0, , , , , , "^p", 2 '假回车转硬回车
    ActiveDocument.Content.Find.Execute "^m", , , 0, , , , , , "", 2 '分页符
    Call ModifyFont
    Call AddTabStopForOptions
    Application.ScreenUpdating = True
    
    
    UsedTime = VBA.Timer - StartTime
    Debug.Print "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
    'MsgBox "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
    
End Sub

Private Sub ModifyFont()
    For Each oneP In ActiveDocument.Paragraphs
        n = n + 1
        Set rng = oneP.Range
        Count = Len(rng.Text)
        If rng.MoveStartWhile("(())01234567890123456789ABCDABCD①②③④⑤⑥⑦⑧⑨⑩.、.分", wdForward) >= 1 Then
            With oneP.Range.Font
                .Name = "宋体"
                .Size = 10.5
                .ColorIndex = wdBlack
                .Bold = False
                .Italic = False
            End With
        Else
            If rng.MoveStartWhile("一二三.、.选择综合题", wdForward) > 1 Then
                With oneP.Range.Font
                    .Name = "宋体"
                    .Size = 12
                    .Bold = True
                    .Italic = False
                    .ColorIndex = wdBlack
                End With
            Else
                If rng.MoveEndWhile("1234567890~-据此完成下列各题.。(())分" & Chr(13) & Chr(11), wdBackward) < -2 Then 'dasdasd
                    With oneP.Range.Font
                        .Name = "楷体"
                        .Size = 10.5
                        .ColorIndex = wdBlack
                        .Bold = False
                        .Italic = False
                    End With
                End If
            End If
        End If
    Next
End Sub
Private Sub AddTabStopForOptions()
    '处理选项和制表位
    Dim ap As Paragraph, bp As Paragraph, cp As Paragraph, dp As Paragraph
    lenth = ActiveDocument.PageSetup.CharsLine
    For i = ActiveDocument.Paragraphs.Count To 4 Step -1
        Set oneP = ActiveDocument.Paragraphs(i)
        Set rng = oneP.Range
        movestep = rng.MoveStartWhile("D..", 10)
        If movestep >= 2 Then
            Set dp = ActiveDocument.Paragraphs(i)
            Set cp = ActiveDocument.Paragraphs(i - 1)
            Set bp = ActiveDocument.Paragraphs(i - 2)
            Set ap = ActiveDocument.Paragraphs(i - 3)
            If dp.Range.ComputeStatistics(wdStatisticCharacters) < lenth / 4 - 1 And _
                cp.Range.ComputeStatistics(wdStatisticCharacters) < lenth / 4 - 1 And _
                bp.Range.ComputeStatistics(wdStatisticCharacters) < lenth / 4 - 1 And _
                ap.Range.ComputeStatistics(wdStatisticCharacters) < lenth / 4 - 1 Then '一行足够
                ap.Range.Text = vbTab & Replace(ap.Range.Text, Chr(13), vbTab) & Replace(bp.Range.Text, Chr(13), vbTab) & Replace(cp.Range.Text, Chr(13), vbTab) & dp.Range.Text
                bp.Range.Text = ""
                cp.Range.Text = ""
                dp.Range.Text = ""
                AddTabStopInRange ActiveDocument.Paragraphs(i - 3).Range, 4
                'Debug.Print "一行"
            Else
                If dp.Range.ComputeStatistics(wdStatisticCharacters) > lenth / 2 - 2 Or _
                    cp.Range.ComputeStatistics(wdStatisticCharacters) > lenth / 2 - 2 Or _
                    bp.Range.ComputeStatistics(wdStatisticCharacters) > lenth / 2 - 2 Or _
                    ap.Range.ComputeStatistics(wdStatisticCharacters) > lenth / 2 - 2 Then '分四行好看
                    dp.Range.Text = vbTab & dp.Range.Text
                    cp.Range.Text = vbTab & cp.Range.Text
                    bp.Range.Text = vbTab & bp.Range.Text
                    ap.Range.Text = vbTab & ap.Range.Text
                    AddTabStopInRange ActiveDocument.Paragraphs(i - 3).Range, 1
                    AddTabStopInRange ActiveDocument.Paragraphs(i - 2).Range, 1
                    AddTabStopInRange ActiveDocument.Paragraphs(i - 1).Range, 1
                    AddTabStopInRange ActiveDocument.Paragraphs(i).Range, 1
                    'Debug.Print "四行"
                Else '分两行
                    ap.Range.Text = vbTab & Replace(ap.Range.Text, Chr(13), vbTab) & bp.Range.Text
                    bp.Range.Text = vbTab & Replace(cp.Range.Text, Chr(13), vbTab) & dp.Range.Text
                    cp.Range.Text = ""
                    dp.Range.Text = ""
                    AddTabStopInRange ActiveDocument.Paragraphs(i - 3).Range, 2
                    AddTabStopInRange ActiveDocument.Paragraphs(i - 2).Range, 2
                End If
            End If
        End If
    Next i
End Sub

Private Sub AddTabStopInRange(ByVal rng As Range, ByVal tabStopCount As Integer)
    Dim pgWidth As Double, pgLeftMargin As Double, opWidth As Integer
    Dim chrLine As Integer, i As Integer
    With ActiveDocument.PageSetup
        pgLeftMargin = .LeftMargin
        pgWidth = .PageWidth - .LeftMargin - .RightMargin
    End With
    opWidth = Int(pgWidth / tabStopCount) '计算选项宽度
    chrLine = ActiveDocument.PageSetup.CharsLine '获取每行字符数
    rng.ParagraphFormat.TabStops.ClearAll '清除原有制表位
    '新增制表位
    For i = 1 To tabStopCount
        rng.ParagraphFormat.TabStops.Add Position:=20 + (i - 1) * opWidth, _
            Leader:=wdTabLeaderSpaces, Alignment:=wdAlignTabLeft
    Next i
End Sub
Private Sub ConvertShape()
    '转换图形
    Dim shp As Shape
    Dim inshp As InlineShape
    ConvertTime = 0
    Do While ActiveDocument.Shapes.Count > 0
        ConvertTime = ConvertTime + 1
        For Each shp In ActiveDocument.Shapes
            shp.ConvertToInlineShape
        Next shp
        If ConvertTime > 20 Then Exit Do
    Loop
End Sub
Private Sub DivideInLineShape()
    Dim p As Paragraph
    Dim rng As Range
    For i = ActiveDocument.Paragraphs.Count To 1 Step -1
        Set p = ActiveDocument.Paragraphs(i)
        If p.Range.InlineShapes.Count > 0 Then
            '不断向后查找段落中inlineshape的位置 并插入回车
            lenth = Len(p.Range.Text)
            Set rng = p.Range
            Debug.Print rng.Text
            hasMove = rng.MoveStartUntil(Chr(47), lenth)
            m = 0
            Do While hasMove > 0
                rng.Start = rng.Start + 1
                Debug.Print ">>>>>>"; Asc(rng.Characters.First.Next)
                If rng.Characters.First.Next <> Chr(13) Then rng.InsertBefore Chr(13)
                m = m + 1
                lenth = Len(rng.Text)
                hasMove = rng.MoveStartUntil(Chr(47), lenth)
                If m = 20 Then Exit Do
            Loop
        End If
        
    Next i
End Sub

  

posted @ 2019-04-11 11:44  wangway  阅读(306)  评论(0编辑  收藏  举报