Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从包含特定单词的ms word表中删除特定行_Vba_Ms Word_Word - Fatal编程技术网

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

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

我在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列中包含mediate的行?我对VBA一无所知。请帮我弄清楚

更新要求

  • 我需要删除第3列中包含中等或空的所有行
  • 我需要根据第3列中的临界值、高值、中等值对表进行排序 3.将单元格3/行的颜色更改为临界、高:红色、中等:橙色、低:黄色(如果可能)
  • 我正在做以上的工作,但没有找到一个合适的方式在微软Word中完成。是否有任何可用的扩展或其他可以完成任务或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