[英]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 完全陌生。 请帮我解决这个问题
更新要求
我正在处理上述任务,但没有在 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.