简体   繁体   English

Word VBA 查找和替换

[英]Word VBA Find And Replace

I am trying to find all of the cells with a certain text of "0.118" in column 2 of my table and do a list of commands for that row I am also trying to take the value from column 5 of that selected text found in that row and subtract the value I put in the input box for that row.我试图在我的表格的第 2 列中找到具有特定文本“0.118”的所有单元格,并为该行执行命令列表我还试图从该选定文本的第 5 列中获取值行并减去我在该行的输入框中输入的值。

The problem I am having is that it only changes one of my found "0.118" and not all of them in each row.我遇到的问题是它只更改了我找到的“0.118”中的一个,而不是每行中的全部。

And I can't figure out how to search for the column(5) of that selected row.而且我不知道如何搜索该选定行的 column(5)。

在此处输入图片说明

Any help would be greatly appreciated.任何帮助将不胜感激。

Thank you.谢谢你。

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

I would be very surprised if the code in your question actually does anything as it doesn't even compile.如果您问题中的代码实际上做了任何事情,因为它甚至无法编译,我会感到非常惊讶。

Your code is rather a confused mess so I'm not entirely certain that I have correctly understood what you are attempting to do, but try this:您的代码相当混乱,因此我不完全确定我是否正确理解了您要执行的操作,但是请尝试以下操作:

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

Thi may not be a solution, but I do see some problems:这可能不是解决方案,但我确实看到了一些问题:

You do:你做:

For Each oTable In ActiveDocument.Tables

Then you do inside that loop:然后你在那个循环中做:

    Do While Selection.Find.Execute = True

but this Find will not be limited to the table of the For Each loop.但是这个Find将不限于For Each循环的表。

Though harmless, inside this Do While loop you do:虽然无害,但在此Do While循环中,您可以执行以下操作:

        If ActiveDocument.Tables.Count >= 1 Then

but of course this is true because the For Each already determined there is at least 1 table.但当然这是true因为For Each已经确定至少有 1 个表。

I suggest you lookup the documentation of Find , rethink the logic and then run it step by step in the debugger to see what the code is doing.我建议您查找Find的文档,重新思考逻辑,然后在调试器中逐步运行它以查看代码在做什么。

Try this code:试试这个代码:

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

Before
在此处输入图片说明
After
在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM