繁体   English   中英

从包含特定单词的 ms 单词表中删除特定行

[英]Deleting specific row from ms word table that contains a specific word

我在 MS Word 中有一个表格,并试图从中删除一些特定的行。 我有一个 vba 脚本,但它会从所有表中删除行。 我只想从 2 号表中删除行。这是我的代码:

Sub DeleteRowWithSpecifiedText()
Selection.Find.ClearFormatting
With .Tables.Find
    .Text = "Moderate"
    .Wrap = wdFindContinue
End With
Do While Selection.Find.Execute
    If Selection.Information(wdWithInTable) Then
        Selection.Rows.Delete
    End If
Loop

End Sub

如何指定其中的表以删除第 3 列中包含Moderate的行? 我对 VBA 完全陌生。 请帮我解决这个问题

更新要求

  1. 我需要删除第 3 列中包含 Moderate 或 Empty 的所有行
  2. 我需要根据第 3 列中的值对表格进行排序,这些值是关键、高、中 3。将 cell3/行的 colors 更改为关键,高:红色,中:橙色,低:黄色(如果可能。)

我正在处理上述任务,但没有在 MS Word 中找到合适的方法。 是否有任何可用的扩展或可以完成任务的东西,或者 VBA 更好还是什么? 非常感谢您的时间

脚本中的更多问题
由于存在中等和空,如何删除 Col3 中没有内容的行? 原谅我太笨了

例如:

Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, r As Long, Clr As Long, bFit As Boolean
Const StrFnd As String = "|Moderate|Empty"
Const MyColorOrange As Long = 41215
With ActiveDocument.Tables(2)
  bFit = .AllowAutoFit
  .AllowAutoFit = False
  For r = 1 To UBound(Split(StrFnd, "|"))
    Set Rng = .Range
    With .Range
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = Split(StrFnd, "|")(r)
        .Replacement.Text = ""
        .Format = False
        .Forward = True
        .Wrap = wdFindStop
        .MatchCase = False
        .MatchWholeWord = True
      End With
      Do While .Find.Execute
        If .InRange(Rng) = False Then Exit Do
        If .Cells(1).ColumnIndex = 3 Then .Rows(1).Delete
        .Collapse wdCollapseEnd
      Loop
    End With
  Next
  For r = 2 To .Rows.Count
    With .Cell(r, 3)
      Select Case Split(.Range.Text, vbCr)(0)
        Case "Critical": Clr = wdColorRed
        Case "High": Clr = MyColorOrange
        Case "Moderate": Clr = wdColorYellow: .Range.Text = "X"
        Case "Low": Clr = wdColorBrightGreen: .Range.Text = "Y"
        Case Else: Clr = wdColorAutomatic: .Range.Text = "Z"
      End Select
      .Row.Shading.BackgroundPatternColor = Clr
    End With
  Next
  .Sort ExcludeHeader:=True, FieldNumber:=3, SortFieldType:=wdSortFieldAlphanumeric, SortOrder:=wdSortOrderAscending
  With .Range
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "[XYZ]"
      .Replacement.Text = ""
      .Format = False
      .Forward = True
      .Wrap = wdFindStop
      .MatchWildcards = True
    End With
    Do While .Find.Execute
      If .InRange(Rng) = False Then Exit Do
      If .Cells(1).ColumnIndex = 3 Then
        Select Case .Text
          Case "X": .Text = "Moderate"
          Case "Y": .Text = "Low"
          Case "Z": .Rows(1).Delete
        End Select
      End If
      .Collapse wdCollapseEnd
    Loop
  End With
  .AllowAutoFit = bFit
End With
Application.ScreenUpdating = True
End Sub

对于长表,查找/替换应该比遍历所有行更快。

您的附加规格不明确。 您的第一个规范包括删除第 3 列中包含“中等”的所有行,但在规范 2 和 3 中,您说您希望对这些行进行排序和着色。 规范 3 引入了包含“低”的单元格,但在规范 2 的排序要求中没有提到这些。也不清楚“关键”应该有什么阴影。 按照这种不一致的规范进行编码是不可能的。 如果要保留“中等”行,请从以下位置删除“|中等”:

Const StrFnd As String = "|Moderate|Empty"

使用您的附加规范,仍然需要循环所有剩余的表行。 请参阅更新的代码。 我假设所有保留的行都需要不同的阴影,具体取决于它们是严重、高、中等还是低。 更改着色规格(即 Clr)以适应您的实际需求。

如果您只想对条件单元格而不是整行进行着色,请更改:

.Row.Shading.BackgroundPatternColor = Clr

至:

.Shading.BackgroundPatternColor = Clr

您可以非常简单直接地解决这个问题。 尝试这个。

sub deleteRowsWithModerate()
Dim T As Table
Dim r As row
'  Set your 2nd Table as the one to be worked on
Set T = ActiveDocument.Tables(2)

'iterate over all rows, check if the 3rd cell (= 3rd column) of each row has the desired String in it.
For Each r In T.Rows
  If InStr(r.Cells(3).Range.text, "Moderate") Then r.Delete
Next

End sub

请注意

If r.Cells(3).Range.text = "Moderate" then

不起作用,因为单元格的文本中总是有一个隐藏的占位符,所以单元格文本就像“中等”&chr(13)&chr(7)。

暂无
暂无

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

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