当前位置: 首页 > 知识库问答 >
问题:

Word VBA查找和替换

百里胜泫
2023-03-14

我试图在表格的第2列中找到所有文本为“0.118”的单元格,并为该行列出命令列表。我还试图从该行中找到的选定文本的第5列中获取值,然后减去我在该行的输入框中输入的值。

我遇到的问题是,它只改变了我找到的“0.118”之一,而不是每行中的所有内容。

我不知道如何搜索选定行的列(5)。

任何帮助都将不胜感激。

非常感谢。

Sub ConvertTo_3MM()

Dim oTable As Table
Dim stT As Long, enT As Long
Dim stS As Long, enS As Long

With Selection.Find
    
    .Forward = True
    .MatchPhrase = True
    .Execute FindText:="0.118"
            
End With
    
For Each oTable In ActiveDocument.Tables
    
    Do While Selection.Find.Execute = True

        stT = oTable.Range.Start
        enT = oTable.Range.End

        stS = Selection.Range.Start
        enS = Selection.Range.End

        If stS < stT Or enS > enT Then Exit Do

        Selection.Collapse wdCollapseStart

        If ActiveDocument.Tables.Count >= 1 Then
            With ActiveDocument.Tables(1).Cell(nRow, 2).Range
                .Text = "3 MM" & vbCrLf & "-" & vbCrLf & "6 MM"
            End With
        End If

        Selection.MoveRight Unit:=wdCell
        
        If ActiveDocument.Tables.Count >= 1 Then
            With ActiveDocument.Tables(1).Cell(nRow, 3).Range
                .InsertAfter Text:=vbCrLf & "-" & vbCrLf & "SHANK"
            End With
        End If

        Selection.MoveRight Unit:=wdCell
        Selection.MoveRight Unit:=wdCell
                                       
        response = InputBox("Cut Length For 3 MM")

        If ActiveDocument.Tables.Count >= 1 Then
            With ActiveDocument.Tables(1).Cell(nRow, 5).Range
                .Text = response & vbCrLf & "-" & vbCrLf & (column(5).value - response)
            End With
        End If
                                 
        Selection.Find.Execute Replace:=wdReplaceAll
                    
    Loop
            
    Selection.Collapse wdCollapseEnd
            
Next
    
    Application.ScreenUpdating = True
    
End Sub

共有3个答案

诸葛康胜
2023-03-14

请尝试以下代码:

Sub ConvertTo_3MM()
    Dim oTable As Table, rng As Range
    Dim nRow As Long, response As String
    
    For Each oTable In ActiveDocument.Tables
        With oTable
            Set rng = .Range
            Do
                If rng.Find.Execute("0.118") Then
                    If rng.Information(wdEndOfRangeColumnNumber) = 2 Then
                        nRow = rng.Information(wdEndOfRangeRowNumber)
                        .Cell(nRow, 2).Range.Text = "3 MM" & vbCrLf & "-" & vbCrLf & "6 MM"
                        .Cell(nRow, 3).Range.InsertAfter Text:=vbCrLf & "-" & vbCrLf & "SHANK"
                        response = Val(InputBox("Cut Length For 3 MM"))
                        .Cell(nRow, 5).Range.Text = response & _
                            vbCrLf & "-" & vbCrLf & (Val(.Cell(nRow, 5).Range.Text) - response)
                    End If
                Else
                    Exit Do
                End If
                rng.Collapse wdCollapseEnd
            Loop
        End With
    Next
    Application.ScreenUpdating = True
End Sub
慕容聪
2023-03-14

这可能不是一个解决方案,但我确实看到了一些问题:

你可以:

For Each oTable In ActiveDocument.Tables

然后你在循环中这样做:

    Do While Selection.Find.Execute = True

但是这个查找将不限于For每个循环的表。

虽然无害,但在这个循环中,您可以执行:

        If ActiveDocument.Tables.Count >= 1 Then

但这当然是正确的,因为每个的已经确定至少有一个表。

我建议你查找查找的留档,重新思考逻辑,然后在调试器中一步一步地运行它,看看代码在做什么。

钦耀
2023-03-14

如果你问题中的代码真的做了什么,甚至没有编译,我会非常惊讶。

您的代码相当混乱,因此我不能完全确定我是否正确理解了您试图执行的操作,但请尝试以下操作:

Sub ConvertTo_3MM()
    Application.ScreenUpdating = False

    Dim oTable As Table
    Dim response As String
    
    For Each oTable In ActiveDocument.Tables
        With oTable.Range
            With .Find
                .Forward = True
                .MatchPhrase = True
                .Text = "0.118"
                .Wrap = wdFindStop
                .Execute
            End With

            Do While .Find.Found = True
                .Text = "3 MM" & vbCr & "-" & vbCr & "6 MM"
                With .Rows(1)
                    .Cells(3).Range.InsertAfter Text:=vbCr & "-" & vbCr & "SHANK"
                    response = Val(InputBox("Cut Length For 3 MM"))
                    With .Cells(5).Range
                        .Text = response & vbCr & "-" & vbCr & (Val(.Text) - response)
                    End With
                End With
                .Collapse wdCollapseEnd
                .Find.Execute
            Loop
        End With
    Next
    
    Application.ScreenUpdating = True
    
End Sub
 类似资料:
  • 在Atom中,对你文件或者项目中的文本进行查找或者替换,非常快速而且容易。 cmd-F 在缓冲区中查找 cmd-shift-f 在整个项目中查找 如果你执行了这些命令,你屏幕的底部会出现一个“Find and Replace”面板。 你可以按下cmd-F,输入需要搜索的字符串,并且多次按下回车(或者cmd-G,或者“Find Next”按钮)来在当前文件中搜索,循环查找当前文件中的匹配内容。“Fi

  • 我有一些占位符的docx文档。现在我应该用其他内容替换它们,并保存新的docx文档。我从docx4j开始,发现了这个方法: 但这很少起作用,因为通常占位符会在多个文本运行中拆分。 如何解决这个问题?

  • 从word文件中,我想替换字符的交替出现。通过使用查找

  • 查找工具栏 快捷键 Mac: Command + F Windows\/Linux: Ctrl + F 先选中复制,然后调出查找工具栏,选中部分就被自动填入搜索框,按回车键快速搜索。 操作步骤(快捷键): Command + C (复制单词) Command + F (调出查找工具栏) Enter (回车开始查找) 在查找结果中跳转 下一个匹配到的结果 快捷键: Mac: Command + G

  • 如何使用PDFBox2.0找到和替换PDF文档中的文本,他们拉出了旧的示例,它的语法不再有效,所以我想知道这是否仍然可能,如果是,最好的方法是什么。谢了!

  • 了解如何在当前文档、文件夹、站点或所有打开的文档中查找和替换代码、文本或标签(包含或不包含属性)。 使用 Dreamweaver 强大的查找和替换功能在当前文档、文件夹、站点或所有打开的文档中查找和替换代码、文本或标签(包含或不包含属性)。 您还可以将强大的模式匹配算法(正则表达式)用于高级查找和替换操作。 可以查找和替换的内容如下: 代码中的标签、属性和文本 一个选区或多个选区中的文本 多个文档