Я пытаюсь создать подпрограмму для снятия защиты и повторной защиты защищенных паролем, я могу использовать pandas для загрузки данных в консолидированный фрейм данных.
Пока скрипт работает нормально. xlsx он падает для xlsm, где я продолжаю получать:
com_error: (-2147352567, «Исключение произошло.», (0, «Microsoft Excel», «Невозможно получить доступ к« MYFILENAME.xlsm ».» , 'xlmain11.chm', 0, -2146827284), Нет)
После долгих исследований причин возникновения ошибок я понял, что в VBA это произошло из-за взаимодействия между xcl.DisplayAlerts = False и метод .Saveas.
Похоже, что у Microsoft другое значение по умолчанию для книг Xlsx и xlsm (с поддержкой VBA).
Я попытался обойти это, добавив параметр ConflictResolution = 2, в результате чего я принудительно принимаю любое приглашение, но, похоже, это помогло мне сохранить файл без пароля в первой подпрограмме, но во второй подпрограмме. для l oop не получится. Точно такой же код будет работать, если я использую имя файла IE версию xlsx. см. ниже . если я запускаю только xlsx, он работает, только xlsm только второй сбой.
Do c ссылка:
saveas do c
displayalerts do c
См. Отдельный код ниже (оригинальные имена файлов изменены)
import win32com.client
filename3 = r"f1.xlsm"
filename2 = r"f2.xlsm"
filename = r"f3.xlsx"
for i in [filename2, filename3]:
pw_str = 'PIM FINAL'
xcl = win32com.client.Dispatch("Excel.Application")
wb = xcl.Workbooks.Open(i, False, False, None, pw_str)
xcl.DisplayAlerts = False
wb.SaveAs(i, None, '', '', ConflictResolution = 2)
xcl.Quit()
print("done")
for i in [filename2, filename3]:
pw_str = 'PIM FINAL'
xcl = win32com.client.Dispatch("Excel.Application")
wb = xcl.Workbooks.Open(i, False, False, None, None)
xcl.DisplayAlerts = False
wb.SaveAs(i, None, pw_str, '', ConflictResolution = 2)
xcl.Quit()
print(i ," done")