如何找到表格列,然后向下移动并替换单元格的内容,如果它是“N/A”
Posted
技术标签:
【中文标题】如何找到表格列,然后向下移动并替换单元格的内容,如果它是“N/A”【英文标题】:How to find table column, then move down and replace the cell's content IF it is "N/A" 【发布时间】:2021-05-25 19:20:51 【问题描述】:我有将近 1,800 个 Word 文档,这些文档大约有 8 页,表格中有独特的数据。我们刚刚被告知,我们为其中一些表格提供的数据不准确,需要从“N/A”更改为“0.0%”。由于文档中大量使用了“N/A”,很遗憾我不能只查找/替换该文本。
使用此线程 (Macro to find in Word table for specific string in a cell and move x cell left, check isnumeric then set typography on down x cell in the same column) 我能够调整下面的代码以找到列标题(准时完成率)并移动到相邻的单元格以更新它们。但是,由于此列是百分比,IsNumeric
代码会更改它找到的任何数据,因为百分比符号。
有没有办法做同样的事情,而不是使用IsNumeric
(因为它不适用于百分比)检查单元格中的值,如果发现“N/A”将其更改为“0.0%”?然后需要对另外两个表重复此操作,其中一个表有四行要查看。
提前感谢您提供的任何帮助!
Screenshot of table
Sub Demo()
Application.ScreenUpdating = False
Dim r As Long, c As Long
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "On-time Completion Rate" 'Column Header'
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
If .Information(wdWithInTable) = True Then
r = .Cells(1).RowIndex
c = .Cells(1).ColumnIndex
With .Tables(1)
If Not IsNumeric(Split(.Cell(r + 1, c).Range.Text, vbCr)(0)) Then .Cell(r + 1, c).Range.Text = "0.0%"
If Not IsNumeric(Split(.Cell(r + 2, c).Range.Text, vbCr)(0)) Then .Cell(r + 2, c).Range.Text = "0.0%"
End With
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
Application.ScreenUpdating = True
End Sub
【问题讨论】:
您可以使用IFERROR在单元格公式本身中执行此操作 如果您绝对必须使用 VBA,您可以像这样调用任何 Excel 函数:WorksheetFunction.IfError
感谢您的回复,@HackSlash。 “N/A”不是来自实际的计算问题,而是我们被告知在某些情况下在 Word 文档中输入的文本。现在我们被告知将其更改为值“0.0%”。所以我认为“IFERROR”对此没有帮助?
【参考方案1】:
试试这个:
Sub Demo()
Application.ScreenUpdating = False
Dim r As Long, c As Long
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "On-time Completion Rate" 'Column Header'
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
If .Information(wdWithInTable) = True Then
r = .Cells(1).RowIndex
c = .Cells(1).ColumnIndex
With .Tables(1)
If Split(.Cell(r + 1, c).Range.Text, vbCr)(0) = "N/A" Then .Cell(r + 1, c).Range.Text = "0.0%"
If Split(.Cell(r + 2, c).Range.Text, vbCr)(0) = "N/A" Then .Cell(r + 2, c).Range.Text = "0.0%"
End With
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
Application.ScreenUpdating = True
End Sub
【讨论】:
难以置信!非常感谢@timothyrylatt!这完全符合我的需要,即使在针对其他表格进行了修改之后也是如此。非常感激!我是“IsNumeric”函数的新手,并认为“Split”是其中的一部分......我需要进一步研究它,因为它非常有帮助。【参考方案2】:如果要替换表中的所有 N/A 实例,则以下方法会更有效:
Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "On-time Completion Rate"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
.Duplicate.Tables(1).Range.Find.Execute FindText:="N/A", ReplaceWith:="0.0%", Wrap:=wdFindStop, Replace:=wdReplaceAll
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
Application.ScreenUpdating = True
End Sub
将此扩展为处理整个文件夹的文档,您可以使用如下代码:
Sub UpdateDocuments()
Application.ScreenUpdating = False
Dim strFolder As String, strFile As String, strDocNm As String, wdDoc As Document
strDocNm = ActiveDocument.FullName: strFolder = GetFolder
If strFolder = "" Then Exit Sub
strFile = Dir(strFolder & "\*.docx", vbNormal)
While strFile <> ""
If strFolder & "\" & strFile <> strDocNm Then
Set wdDoc = Documents.Open(FileName:=strFolder & "\" & strFile, AddToRecentFiles:=False, Visible:=False)
With wdDoc
With .Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "On-time Completion Rate"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
.Duplicate.Tables(1).Range.Find.Execute FindText:="N/A", ReplaceWith:="0.0%", Wrap:=wdFindStop, Replace:=wdReplaceAll
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
.Close SaveChanges:=True
End With
End If
strFile = Dir()
Wend
Set wdDoc = Nothing
Application.ScreenUpdating = True
End Sub
Function GetFolder() As String
Dim oFolder As Object
GetFolder = ""
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
Set oFolder = Nothing
End Function
要进一步扩展代码以处理子文件夹中的文档,请参阅:https://www.msofficeforums.com/47785-post14.html
要将更新的文档另存为 PDF,请插入:
.SaveAs FileName:=Split(.FullName, ".doc")(0) & ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
之前:
.Close SaveChanges:=True
【讨论】:
感谢您提供这个,@macropod!不幸的是,并不是文档中的所有“N/A”都被替换了,只是三个不同表格中的某个列。我确实尝试了您提供的代码(并在子文件夹的链接中添加了信息),但无法让它进行实际更改。它将使用文件和 PDF 创建输出文件夹,但不会更改文件中的任何“N/A”...我真的很感谢所有这些帮助!我学到了很多东西,非常感谢! 我发布的代码仅更改了包含“准时完成率”文本的表格中的“N/A” - 而不是整个文档中的。不过,要解决的问题是您要保留的其他列中是否可能存在“N/A”。 FWIW,蒂莫西的代码也将仅替换“准时完成率”列中第 2 行和第 3 行的“N/A”,而不是同一列中后面的行。 感谢您指出这一点!我知道它只影响了一个表,我想我会为每个人省去麻烦,自己重新创建其他表的代码。我很抱歉我有点时间紧张,所以我继续我的工作。不过,我也会研究你的代码,因为我想让它工作。我使用了第二个代码块,但没有看到它更新了 On-Time Comp Rate 列。有没有办法添加代码,还是创建一个新问题更好?仅供参考,我也没有义务回应,我已经感谢您提供的所有帮助! «我知道它只影响了一个表» Timothy 的代码和我的进程 every 表都包含“准时完成率”,并且都对那些之外的任何内容都没有影响表。当然,如果您的文本与“准时完成率”不完全匹配,则不会处理该表格。以上是关于如何找到表格列,然后向下移动并替换单元格的内容,如果它是“N/A”的主要内容,如果未能解决你的问题,请参考以下文章