Ошибка 1004 при выполнении нескольких макросов с помощью xlwings

Я пытаюсь запустить файл xls, содержащий несколько листов и макросов (все они написаны в модулях) с помощью python, используя xlwings, но, похоже, у меня возникают проблемы при последовательном выполнении более одного макроса. Я уже пробовал несколько вещей, чтобы решить эту проблему, но пока не смог найти решение:

Вот простой пример моего скрипта xlwings и макросов vba (все они определены в модулях):

Типичный макрос VBA, который я пытаюсь запустить с помощью xlwings, эти макросы используются для очистки некоторого диапазона листа, когда он находит в нем данные:

Sub Clear_data()
Application.ScreenUptating = False
Application.Calculation = xlCalculationAutomatic

last_col = Worksheets("Sheet1").Range("ZZ2").End(xlToLeft).Column

If last_col > 6 Then
    Worksheets("Sheet1").Range(Cells(2,7), Cells(6,last_col)).ClearContents
End If

Application.ScreenUptating = False
Application.Calculation = xlCalculationAutomatic
End Sub

Пример скрипта xlwings, который я запускаю:

def clear_sheet1(filename = "", file_location = "") :

# Connection with the xls workbook
    fullpathname = os.path.join(file_location,filename)
    Workbook = xw.Book(fullpathname)

# Executing the vba macros with xlwings
    #1
    macro1 = Workbook.macro("NAME_OF_MY_MACRO_1")
    macro1()
    #2
    macro2 = Workbook.macro("NAME_OF_MY_MACRO_2")
    macro2()
    #3
    macro3 = Workbook.macro("NAME_OF_MY_MACRO_3")
    macro3()

# Saving and closing the Workbook
Workbook.save()
Workbook.close()
return()
  1. Когда я выполняю все макросы vba в Excel, все работает нормально.

  2. Когда я запускаю свою функцию для выполнения только одного из макросов, все в порядке.

  3. Когда я запускаю свою функцию для последовательного выполнения нескольких макросов (как написано в приведенном ниже примере скрипта), я систематически получаю ошибку VBA 1004. внутри моего второго макроса в строках, где я должен подавить данные, найденные в лист : Worksheets("Sheet1").Range(Cells(2,7), Cells(6,last_col)).ClearContents

Был бы очень признателен, если бы кто-нибудь поделился своими знаниями по этой проблеме или помог мне найти ошибку в моем коде! Не стесняйтесь обращаться ко мне за более подробной информацией, если это необходимо.

Большое спасибо :)

NB


person Popovitch    schedule 15.03.2018    source источник
comment
Всем привет :)   -  person Popovitch    schedule 16.03.2018


Ответы (1)


Я думаю, что проблема может быть распространенной в VBA, поскольку вы не полностью определили все свои ссылки на диапазоны. Попробуй это

If last_col > 6 Then
    With Worksheets("Sheet1")
        .Range(.Cells(2, 7), .Cells(6, last_col)).ClearContents
    End With
End If
person SJR    schedule 15.03.2018
comment
Здравствуйте :) Спасибо за ваш ответ, это сработало при использовании вашего кода! Тем не менее, я не уверен, что правильно понял, что произошло, поскольку я не совсем знаком с vba! Было бы очень приятно, если бы вы могли объяснить мне, что не так :) Еще раз спасибо! - person Popovitch; 16.03.2018
comment
Конечно. VBA предполагает активный лист, если лист не указан. Если Sheet1 активен при запуске кода, все в порядке, но если активен другой лист, диапазон охватывает два листа, что недопустимо. - person SJR; 16.03.2018
comment
Поскольку у вас не было ссылки на лист перед ссылками на ячейки, предполагался активный лист. - person SJR; 16.03.2018