vba删除word表中的特定行和列

vba删除word表中的特定行和列,vba,excel,ms-word,Vba,Excel,Ms Word,我需要解析大多数word文档表并删除包含字符串“Deleted”的单元格。这些表有不同的格式,因此我需要根据格式更改开始索引。我编写了一个代码,首先删除所有包含“已删除”字符串的单元格中的行。相同的策略用于删除列。它适用于行,但不适用于列删除。当运行表格单元格时,由于删除了列,列索引大于实际可用列。我不知道为什么它出现在列删除部分而不是行删除部分。下面的代码适用于某些表,但不是所有表 Dim msWord As Word.Application

我需要解析大多数word文档表并删除包含字符串“Deleted”的单元格。这些表有不同的格式,因此我需要根据格式更改开始索引。我编写了一个代码,首先删除所有包含“已删除”字符串的单元格中的行。相同的策略用于删除列。它适用于行,但不适用于列删除。当运行表格单元格时,由于删除了列,列索引大于实际可用列。我不知道为什么它出现在列删除部分而不是行删除部分。下面的代码适用于某些表,但不是所有表

Dim msWord                          As Word.Application
Dim myDoc                           As Word.Document
Dim wordTable                       As Table
Dim r                               As Long
Dim c                               As Long
Dim col_del_cnt                     As Long
Dim row_del_cnt                     As Long
Dim i                               As Long
Dim col_index                       As Long
Dim param                           As Long
Dim Tbl                             As Table
Dim Tmpfile                         As String

Tmpfile = ThisWorkbook.Path & "\Template.docx"
    With msWord
      .Visible = True
      Set myDoc = .Documents.Open(Filename:=Tmpfile)
    End With

    With myDoc
      For i = 7 To 21
      Set wordTable = .Tables(i)
      If wordTable.Columns.Count < 2 Then
        col_index = 1
        param = wordTable.Columns.Count
      Else
        col_index = 2
        param = wordTable.Columns.Count - 1
      End If

      For r = 2 To wordTable.Rows.Count
        col_del_cnt = 0
        For c = col_index To wordTable.Columns.Count
          If InStr(1, wordTable.Cell(r, c).Range.Text, "Deleted", 1) Then
            col_del_cnt = col_del_cnt + 1
          End If
        Next c

        If col_del_cnt = param Then
          If r > wordTable.Rows.Count Then
            wordTable.Rows(wordTable.Rows.Count).Delete
          Else
            wordTable.Rows(r).Delete
          End If
            End If
      Next r
    Next
  End With

  With myDoc
       For i = 7 To 21
    Set wordTable = .Tables(i)
    If wordTable.Columns.Count < 2 Then
      col_index = 1
    Else
      col_index = 2
    End If

    For c = col_index To wordTable.Columns.Count
      row_del_cnt = 0
      For r = 2 To wordTable.Rows.Count
                  If InStr(1, wordTable.Cell(r, c).Range.Text, "Deleted", 1) Then '\Error located here'
        row_del_cnt = row_del_cnt + 1
          End If
      Next r

      If row_del_cnt = wordTable.Rows.Count - 1 Then
        If c > wordTable.Columns.Count Then
        wordTable.Columns(wordTable.Columns.Count).Delete
        Else
        wordTable.Columns(c).Delete
        End If
      End If
            Next c
          Next
      End With
Dim msWord作为Word.Application
将myDoc设置为Word.Document
Dim wordTable As Table
变暗,变长
尺寸c与长度相同
颜色与长度相同
变暗行的长度相同
我想我会坚持多久
Dim col_索引与长
暗参数与长参数相同
如表所示的尺寸Tbl
将Tmpfile设置为字符串
Tmpfile=thispoolk.Path&“\Template.docx”
用msWord
.Visible=True
设置myDoc=.Documents.Open(文件名:=Tmpfile)
以
用myDoc
对于i=7到21
Set wordTable=.Tables(一)
如果wordTable.Columns.Count小于2,则
col_指数=1
param=wordTable.Columns.Count
其他的
col_指数=2
param=wordTable.Columns.Count-1
如果结束
对于r=2的wordTable.Rows.Count
col_del_cnt=0
对于c=col_,索引为wordTable.Columns.Count
如果InStr(1,wordTable.Cell(r,c).Range.Text,“已删除”,1),则
col_del_cnt=col_del_cnt+1
如果结束
下一个c
如果col_del_cnt=param,则
如果r>wordTable.Rows.Count,则
wordTable.Rows(wordTable.Rows.Count).删除
其他的
wordTable.Rows(r).删除
如果结束
如果结束
下一个r
下一个
以
用myDoc
对于i=7到21
Set wordTable=.Tables(一)
如果wordTable.Columns.Count小于2,则
col_指数=1
其他的
col_指数=2
如果结束
对于c=col_,索引为wordTable.Columns.Count
行删除内容=0
对于r=2的wordTable.Rows.Count
如果InStr(1,wordTable.Cell(r,c).Range.Text,“已删除”,1),则“\Error located here”
行删除cnt=行删除cnt+1
如果结束
下一个r
如果row_del_cnt=wordTable.Rows.Count-1,则
如果c>wordTable.Columns.Count,则
wordTable.Columns(wordTable.Columns.Count).删除
其他的
wordTable.Columns(c).删除
如果结束
如果结束
下一个c
下一个
以

我希望有人能帮我找到解决办法

删除索引的内容时,必须向后执行

更改
对于i=7到21


对于i=21到7步骤-1


以此类推。

删除索引的内容时,必须向后执行

更改
对于i=7到21


对于i=21到7步骤-1


依此类推。

当某个单元格已“删除”该行和该列时,您似乎正在尝试同时删除该行和该列。显然,如果使用一个循环删除其中已“删除”的行,然后使用第二个循环删除其中已“删除”的列,则第二个循环将找不到任何内容。尝试以下内容:

Dim t As Long, r As Long, c As Long, ArrCols() As String
With myDoc
  For t = 21 To 7 Step -1
    With .Tables(t)
      If InStr(1, .Range.Text, "Deleted", 1) Then
        ReDim ArrCols(.Columns.Count)
        For r = .Rows.Count To 1 Step -1
          With .Rows(r)
            If InStr(1, .Range.Text, "Deleted", 1) Then
              For c = 1 To .Cells.Count
                If InStr(1, .Cells(c).Range.Text, "Deleted", 1) Then
                  ArrCols(c) = c
                End If
              Next
              .Delete
            End If
          End With
        Next r
        For c = UBound(ArrCols) To 1 Step -1
          If ArrCols(c) <> "" Then .Columns(c).Delete
        Next
      End If
    End With
  Next
End With
Dim t为长,r为长,c为长,ArrCols()为字符串
用myDoc
对于t=21至7,步骤-1
附.表格(t)
如果InStr(1、.Range.Text,“已删除”,1),则
ReDim ArrCols(.Columns.Count)
对于r=.Rows.Count,将其设置为1步骤-1
带.Rows(r)
如果InStr(1、.Range.Text,“已删除”,1),则
对于c=1到.Cells.Count
如果InStr(1、.Cells(c).Range.Text,“已删除”,1)则
ArrCols(c)=c
如果结束
下一个
.删除
如果结束
以
下一个r
对于c=UBound(ArrCols)到1步骤-1
如果ArrCols(c)“,.Columns(c).Delete
下一个
如果结束
以
下一个
以
注意所有涉及删除的循环是如何向后运行的


事实上,您自己的代码在删除行时没有抛出错误,这只是巧合。

当单元格“删除”行和列时,您似乎正在尝试同时删除行和列。显然,如果使用一个循环删除其中已“删除”的行,然后使用第二个循环删除其中已“删除”的列,则第二个循环将找不到任何内容。尝试以下内容:

Dim t As Long, r As Long, c As Long, ArrCols() As String
With myDoc
  For t = 21 To 7 Step -1
    With .Tables(t)
      If InStr(1, .Range.Text, "Deleted", 1) Then
        ReDim ArrCols(.Columns.Count)
        For r = .Rows.Count To 1 Step -1
          With .Rows(r)
            If InStr(1, .Range.Text, "Deleted", 1) Then
              For c = 1 To .Cells.Count
                If InStr(1, .Cells(c).Range.Text, "Deleted", 1) Then
                  ArrCols(c) = c
                End If
              Next
              .Delete
            End If
          End With
        Next r
        For c = UBound(ArrCols) To 1 Step -1
          If ArrCols(c) <> "" Then .Columns(c).Delete
        Next
      End If
    End With
  Next
End With
Dim t为长,r为长,c为长,ArrCols()为字符串
用myDoc
对于t=21至7,步骤-1
附.表格(t)
如果InStr(1、.Range.Text,“已删除”,1),则
ReDim ArrCols(.Columns.Count)
对于r=.Rows.Count,将其设置为1步骤-1
带.Rows(r)
如果InStr(1、.Range.Text,“已删除”,1),则
对于c=1到.Cells.Count
如果InStr(1、.Cells(c).Range.Text,“已删除”,1)则
ArrCols(c)=c
如果结束
下一个
.删除
如果结束
以
下一个r
对于c=UBound(ArrCols)到1步骤-1
如果ArrCols(c)“,.Columns(c).Delete
下一个
如果结束
以
下一个
以
注意所有涉及删除的循环是如何向后运行的


事实上,您自己的代码在删除行时没有抛出错误只是巧合。

即使我将i设置为常量,我也得到了错误,因此我认为它与for循环索引无关。即使我将i设置为常量,我也得到了错误,因此我认为它与for循环索引无关。