vba Удаление определенных строк и столбцов в таблице слов - PullRequest
0 голосов
/ 13 сентября 2018

Мне нужно проанализировать большую часть таблиц doc и удалить ячейки, содержащие строку «Удалено». Таблицы имеют разные форматы, поэтому мне нужно изменить начальный индекс в зависимости от формата. Я написал код, в котором я начинаю сначала удалять строки со всеми ячейками, содержащими строку «Удалено». Эта же стратегия используется для удаления столбцов. Это работало для строк, но не для удаления столбцов. При запуске через ячейки таблицы индекс столбца больше, чем фактические доступные столбцы из-за удаленных столбцов. Я не знаю, почему это произошло в части удаления столбца, а не в части удаления строки. Код ниже работает для некоторых таблиц, но не для всех.

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

Я надеюсь, что кто-то может помочь мне найти решение.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Похоже, вы пытаетесь удалить строку и столбец, когда в ячейке есть «Удалено».Очевидно, что если вы используете один цикл для удаления строки, в которой есть «Удаленный», то второй цикл для удаления столбца, в котором есть «Удаленный», второй цикл ничего не найдет.Попробуйте что-то на основе:

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

Обратите внимание, как все циклы, включающие удаления, работают в обратном направлении.

Тот факт, что ваш собственный код не выдавал ошибок при удалении строкбыло просто совпадением.

0 голосов
/ 13 сентября 2018

При удалении чего-либо проиндексированного, вы должны сделать это задом наперед.

Изменить
For i = 7 To 21
на
For i= 21 to 7 Step -1
и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...