Vba 从包含特定单词的ms word表中删除特定行
我在MS Word中有一个表,并试图从中删除一些特定的行。我有一个vba脚本,但它会从所有表中删除行。我只想从表2中删除行。这是我的密码:Vba 从包含特定单词的ms word表中删除特定行,vba,ms-word,word,Vba,Ms Word,Word,我在MS Word中有一个表,并试图从中删除一些特定的行。我有一个vba脚本,但它会从所有表中删除行。我只想从表2中删除行。这是我的密码: Sub DeleteRowWithSpecifiedText() Selection.Find.ClearFormatting With .Tables.Find .Text = "Moderate" .Wrap = wdFindContinue End With Do While Selection.Find.Execu
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列中包含mediate的行?我对VBA一无所知。请帮我弄清楚
更新要求
如何删除Col3中没有内容的行,因为该行是中等和空的?对不起,我太笨了,你可以很简单直接地解决这个问题。试试这个
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
注意
如果r.Cells(3).Range.text=“中等”,则
不起作用,因为单元格的文本中始终有一个隐藏的占位符,因此单元格文本类似于“中等”&chr(13)&chr(7)。例如:
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引入了包含“Low”的单元格,但在规范2中的排序要求中没有提到这些单元格。也不清楚“关键”阴影应该有什么。按照这样不一致的规范编写代码是不可能的。如果要保留“中等”行,请从以下位置删除“|中等”:
Const StrFnd As String = "|Moderate|Empty"
使用附加的规范,仍然需要循环遍历所有剩余的表行。请参阅更新的代码。我假设所有保留的行都需要不同的着色,这取决于它们是临界的、高的、中等的还是低的。更改着色规格(即Clr)以满足您的实际需求
如果只对条件单元格(而不是整行)进行着色,请更改:
.Row.Shading.BackgroundPatternColor = Clr
致:
为什么是函数?整个过程可以作为一个子系统来完成……不管子系统或函数是否对解决方案没有影响。这正是我在测试中破解的问题。因为我们没有返回值,所以可以使用sub。如果我需要在文本中添加OR运算符,该怎么办?这对一张长桌子是可行的吗?因为我有一张很长的桌子,而且这个专栏没有任何价值,我想知道为什么我的答案被贬低了。对于“VBA新手”提问者来说,它清晰、正确、有注释/解释且简单。真的很不满意被降级(特别是因为这是我的第一个贡献)。别哭了。什么是“长”桌?20、200、2k排?我测试了大约20行,没有出现延迟,所以运行时间<1秒。测试您自己运行时是否适合您。对于触发删除的多个文本,如果InStr(r.Cells(3).Range.Text,“XYZ”),则可以添加更多行
,然后r.delete
或构建一组值。取决于触发器的数量和懒散程度;)如果我需要在文本中添加一个或条件,而该列不包含任何值,请将所有条件放在原始帖子中,而不是放在事后的评论中。您需要特别清楚“哪个”列没有价值。在任何情况下,“查找”操作都找不到“无”。@为了排序,我再次更新了问题。请再看一看。对不起,我太傻了。我真的不知道这件事。我想这就像用Java编程一样。我得到了一个分数,并将其与其他人合并,但与此大不相同。我已经开始了另一笔价值100英镑的奖金,并将奖励给你。首先,你说“我需要删除第3列中包含中等或空的所有行”,然后你说“我需要按关键、高、中等和低的顺序对行进行排序”。删除“中等”行后,您希望如何对其进行排序?请参阅我的答案中的更新代码和注释。
.Shading.BackgroundPatternColor = Clr