Код VBA останавливается без ошибок, чтобы удалить модули и формы из целевой книги. - PullRequest
0 голосов
/ 12 июня 2018

Итак, у меня есть система с несколькими книгами.При запуске рабочая книга должна создать копию целевой рабочей книги, удалить все модули и формы, защитить ее паролем, сохранить и закрыть ее.Все это прекрасно работает, кроме удаления модулей и форм.Когда я отключаю подпрограмму DeleteAllMacros, код работает хорошо: он делает копию, защищает книгу, сохраняет и закрывает ее и продолжает следующую процедуру.

Когда я включаю подпрограмму DeleteAllMacros, код останавливается (без каких-либо ошибок) прямо перед подпрограммой и не удаляет модули или формы.Процедура не продолжается и ничего не происходит.Когда я запускаю DeleteAllMacros вручную, он работает просто отлично, и все модули и исходные файлы удаляются.

Я не могу понять, в чем проблема, поскольку код на самом деле работает нормально, но когда я пытаюсь вызвать его, он просто останавливается.Ниже приведены важные части кода:

Public Sub Copy_file(C)

'[removed some code that is not necessary for the problem]

Application.AskToUpdateLinks = False                                ' disables automated link update
Application.AutomationSecurity = msoAutomationSecurityForceDisable  ' disables macros running on start

Set wb = Workbooks.Open(Filename:=fn, Password:=pw, UpdateLinks:=0)


Application.AutomationSecurity = msoAutomationSecurityByUI          ' enables macros running on start
Application.AskToUpdateLinks = True                                 ' enables automated link update

For i = 1 To Sheets.Count

    Sheets(i).Unprotect Password:="XXXX"

Next i

Call BreakExternalLinks(wb, pw)                                 ' Remove links

Call kill_macros(wb)                                            '


Application.DisplayAlerts = False                                    ' Skips the are you sure you want to save
Workbooks(new_name).SaveAs Password:="XXXX", Filename:=fn
Application.DisplayAlerts = True

Workbooks(new_name).Close
End Sub

----------------------------------------

Public Sub kill_macros(wb)

Dim otmp As Object

With wb.VBProject
For Each otmp In wb.VBProject.VBComponents
    If otmp.Type = 100 Then
        otmp.CodeModule.DeleteLines 1, otmp.CodeModule.CountOfLines
        otmp.CodeModule.CodePane.Window.Close

    Else
        wb.VBProject.VBComponents.Remove otmp

    End If

Next otmp

End With

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