Название в основном резюмирует мою проблему. Я изо всех сил пытаюсь найти здесь виновника.

Подпрограмма переходит в бесконечный цикл при автоматическом запуске, но при попытке отладки и пошагового выполнения она работает так, как задумано.

Что я делаю не так?

Sub insert_custom_table(ByVal table_range As Range)
    Dim target_worksheet As Worksheet
    Set target_worksheet = table_range.Parent
    
    Dim table_style As TableStyle
    
    Do While table_style Is Nothing
        On Error Resume Next
        
        With target_worksheet.Parent
            Set table_style = .TableStyles("tablestyle_df")
            
            If table_style Is Nothing Then
                Set table_style = .TableStyles.Add("tablestyle_df")
            Else
                table_style.Delete
                Set table_style = Nothing
            End If
        End With

        On Error GoTo 0
    Loop

' rest of code

End Sub
0
hollson 18 Май 2021 в 15:01

2 ответа

Лучший ответ

Старайтесь избегать циклов Пока без определенного конца. По неизвестным причинам table_style никогда не может быть ничем, что может вызвать бесконечный цикл.

Вместо этого перефразируйте свой цикл, чтобы у него было определенное начало и конец:

Sub insert_custom_table(ByVal table_range As Range)
    Dim target_worksheet As Worksheet
    Set target_worksheet = table_range.Parent
    
    Dim table_style As TableStyle
    
    For Each table_style In target_worksheet.Parent.TableStyles
        If table_style.Name <> "tablestyle_df" Then table_style.Delete
    Next table_style

' rest of code

End Sub
0
Toddleson 18 Май 2021 в 14:13

Ваш цикл while не имеет смысла, вам не о чем зацикливаться. Если вы просто хотите удалить существующий стиль таблицы, просто сделайте это.

TableStyles - это коллекция, и в коллекции вы можете получить доступ к элементу либо через номер индекса, либо через имя перехода (очень похоже на Worksheets - коллекцию книги). Если вы знаете имя, вы можете просто написать

.TableStyles("tablestyle_df").delete

Теперь единственная небольшая проблема заключается в том, что это вызовет ошибку времени выполнения ( ошибка 9 - индекс вне допустимого диапазона ), если стиль не существует. Просто проигнорируйте эту ошибку, заключив оператор (но только этот единственный оператор !!!) в предложение On Error Resume Next -. Если стиль не существует, удалять его не нужно. Итак, все, что вам нужно, это

With target_worksheet.Parent
    On Error Resume Next      ' Ignore the error if delete fails because style does not exist
    .TableStyles("tablestyle_df").delete
    On Error Goto 0
    Set table_style = .TableStyles.Add("tablestyle_df")
End With
1
FunThomas 20 Май 2021 в 10:49