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