Python: скрипт для запуска скрипта Excel VBA не работает

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

from win32com.client import Dispatch

def RunExcelMacro(name):
    myExcel = Dispatch('Excel.Application')
    myExcel.Visible = 0
    myExcel.Workbooks.Add('C:\AC_Software\TestDatei.xls')
    myExcel.Run(name)
    myExcel.DisplayAlerts = 0
    myExcel.Quit()

if __name__ == "__main__":
    RunExcelMacro('Makro_test')

Предполагается запустить vba-скрипт "Makro_test", содержащийся в файле Excel "TestDatei.xls". Я пробовал разные комбинации версий Python и Java (32- и 64-битные) на настольном компьютере с 64-битной Windows 7 в моем офисе. Я также пробовал разные комбинации косой черты и обратной косой черты в пути (обратная и прямая косая черта, простая, двойная). К сожалению, сообщение об ошибке на немецком языке. Но на случай, если кто-то из вас сможет обнаружить что-нибудь из этого, вот оно:

Traceback (most recent call last):
  File "C:\Users\alloun\workspace\MyTestProject\root\nested\example.py", line 22, in <module>
    RunExcelMacro('Makro_test')
  File "C:\Users\alloun\workspace\MyTestProject\root\nested\example.py", line 16, in RunExcelMacro
    myExcel.Workbooks.Add('C:\AC_Software\TestDatei.xls')
  File "<COMObject <unknown>>", line 2, in Add
pywintypes.com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, u'Microsoft Excel', u"'TestDatei.xls' wurde nicht gefunden. \xdcberpr\xfcfen Sie die Rechtschreibung des Dateinamens, und \xfcberpr\xfcfen Sie, ob der Speicherort der Datei korrekt ist.\n\nWenn Sie versuchen, die Datei \xfcber die Liste der zuletzt ge\xf6ffneten Dateien zu \xf6ffnen, stellen Sie sicher, dass die Datei nicht umbenannt, verschoben oder gel\xf6scht wurde.", u'xlmain11.chm', 0, -2146827284), None)

person David Alloun    schedule 27.11.2012    source источник
comment
Вы пытались избежать обратной косой черты?   -  person filmor    schedule 27.11.2012
comment
Я просто хотел предложить заменить 'C:\AC_Software\TestDatei.xls' на r'C:\AC_Software\TestDatei.xls' или 'C:\\AC_Software\\TestDatei.xls'. Но поскольку и A, и T написаны в верхнем регистре, это должно быть что-то другое...   -  person glglgl    schedule 27.11.2012
comment
@FrédéricHamidi Вы пробовали это? Здесь '\a\A\t\T' разрешается в '\x07\\A\t\\T', поэтому \A\T разрешается в \\A\\T.   -  person glglgl    schedule 27.11.2012
comment
@David Действительно ли файл, к которому вы пытаетесь получить доступ, находится там, где вы ожидаете?   -  person glglgl    schedule 27.11.2012
comment
@glglgl, ты прав, я исправляюсь. Python действительно интерпретирует обратную косую черту буквально, когда следующий символ не является допустимой управляющей последовательностью.   -  person Frédéric Hamidi    schedule 27.11.2012
comment
@All: Большое спасибо за ваши комментарии. К сожалению, ни r'C:\AC_Software\TestDatei.xls', ни 'C:\\AC_Software\\TestDatei.xls' не работали. Что касается правильного пути, я думаю, так и должно быть, поскольку, если я проверю свойства «TestDatei.xls», он покажет «C: \ AC_Software». Сейчас я использую Python 2.7 и Spyder, включенные в Python(x,y). Моя Java JRE — 32-битная версия, а моя ОС — Windows 7 в 64-битной версии. Любые дальнейшие подсказки?   -  person David Alloun    schedule 29.11.2012
comment
Хорошо, проблема решена: поскольку я сохранил в нем макрос, файл Excel больше не является файлом .xls, а файлом .xlsm. Так что в основном мой путь был правильным, код был правильным, но расширение файла Excel было неправильным. Это было довольно глупо, спасибо, ребята, за попытку помочь в любом случае :)   -  person David Alloun    schedule 30.11.2012


Ответы (2)


Вот сообщение об ошибке на английском языке:

pywintypes.com_error: (-2147352567, «Произошло исключение.», (0, u'Microsoft Excel', u"'TestDatei.xls' не удалось найти. Проверьте правильность написания имени файла и убедитесь, что расположение файла правильно.\n\nЕсли вы пытаетесь открыть файл из списка недавно использовавшихся файлов, убедитесь, что файл не был переименован, перемещен или удален.", 'xlmain11.chm', 0, -2146827284) , Никто)

Убедитесь, что вы указали правильный путь, и попробуйте вместо этого необработанную строку r'C:\AC_Software\TestDatei.xls'. Я попробовал тот же код, и он работал с файлом, который у меня был.

person Mark Tolonen    schedule 27.11.2012
comment
Большое спасибо за ваш ответ, Марк. К сожалению, у меня это не сработало :( Может быть, вы можете прочитать мой последний комментарий и посмотреть, имеет ли смысл для вас что-то, связанное с Python, IDE, OS и JRE, которые я использую. - person David Alloun; 29.11.2012

Ниже приведен код запуска макроса Excel с использованием Python. Вы можете найти код на этом сайте - ссылка.

from __future__ import print_function
import unittest
import os.path
import win32com.client

class ExcelMacro(unittest.TestCase):
    def test_excel_macro(self):
        try:
            xlApp = win32com.client.DispatchEx('Excel.Application')
            xlsPath = os.path.expanduser('C:\test1\test2\test3\test4\MacroFile.xlsm')
            wb = xlApp.Workbooks.Open(Filename=xlsPath)
            xlApp.Run('macroName')
            wb.Save()
            xlApp.Quit()
            print("Macro ran successfully!")
        except:
            print("Error found while running the excel macro!")
            xlApp.Quit()
if __name__ == "__main__":
    unittest.main()
person Developer    schedule 20.02.2014