如何找到表格列,然后向下移动并替换单元格的内容,如果它是“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”的主要内容,如果未能解决你的问题,请参考以下文章

Office表中如何把一定范围单元格的内容多列数据去除空值以TXT文本方式导出?

DataGrid 用鼠标拖动改变列宽,怎么做

怎样将excel表格一次拖拽到底?

向上或向下移动 HTML 表格单元格(不是行)

怎么调整excel单元格的行列宽度

如何使用 Word VBA 宏在列标题下方添加一行并向下移动现有行?