Мне нужно проанализировать большинство таблиц документов 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
Я надеюсь, что кто-то может помочь мне найти решение.
Удаляя что-то проиндексированное, вы должны делать это в обратном порядке.
Изменить
For i = 7 To 21
toFor i= 21 to 7 Step -1
и так далее.
Похоже, вы пытаетесь удалить и строку, и столбец, когда в ячейке есть «Удалено». Очевидно, что если вы используете один цикл для удаления строки, в которой есть «Deleted», то второй цикл для удаления столбца, в котором есть «Deleted», второй цикл ничего не найдет. Попробуйте что-нибудь на основе:
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
Обратите внимание, как все циклы, включающие удаления, идут в обратном направлении.
То, что ваш собственный код не выдавал ошибок при удалении строк, было просто совпадением.
даже если я установил i как константу, я получил ошибку, поэтому я не думаю, что это связано с индексом цикла for.