Итак, у меня есть скрипт VBA для загрузки содержимого файла Excel на мой сайт SharePoint. Я пытаюсь запустить скрипт из моего скрипта Python, который обрабатывает перенос данных в эту книгу Excel. Макрос работает в основном сам по себе, как и перемещение данных с моим скриптом Python, однако для простоты использования я бы хотел, чтобы скрипт попытался запустить макрос после того, как он переместил данные и сохранил рабочую книгу. Ниже приведен код для скрипта Python.
from openpyxl import load_workbook
from tkinter import Tk
from tkinter.filedialog import askopenfilename
from collections import defaultdict
import collections
import datetime
import time
import os, os.path
import win32com.client
class TransferSheet:
def __init__(self):
'''
Initializes all Variables for use within the ClassProgram
'''
Tk().withdraw()
self.utbook = load_workbook(filename = 'Untimed Report2019-06-17.xlsx')
self.macbook = load_workbook(filename = 'UploadUntimed.xlsm', keep_vba= True)
def transfer_report(self):
'''
This creates the sheets for the two workbooks, clears the contents of the Upload Document
Then once cleared it transfers the content of the UT. Report.
'''
utsheet = self.utbook.worksheets[2]
macsheet = self.macbook.worksheets[0]
for data_rows in macsheet.iter_rows():
for data_cell in data_rows:
data_cell.value = None
for row in utsheet.iter_rows():
macsheet.append([cell.value for cell in row])
def save_sheet(self):
'''
Saves the Work Book.
'''
self.macbook.save(filename= 'UploadUntimed.xlsm')
def run_macro(self):
'''
Runs the Macro from the excel sheet.
'''
#Launch Excel and Open Wrkbook
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename="C:\\Users\\USERNAME\\Desktop\\Python_Project\\UploadUntimed.xlsm") #opens workbook in readonly mode.
#Run Macro
xl.Application.Run("UploadUntimed.xlsm!Module2.AddNew_SP")
#Save Document and Quit.
xl.Application.Save()
xl.Application.Quit()
#Cleanup the com reference.
del xl
def main():
x = TransferSheet()
x.transfer_report()
x.save_sheet()
x.run_macro()
print("Done!")
if __name__ == "__main__": main()
Итак, этот скрипт использует два файла в этом каталоге (Мой отчет с данными и Macroworkbook, и он перемещает необходимые данные с одного из листов в рабочую книгу макроса, а затем сам макрос включается и отправляет данные в мой список SharePoint. Скрипт VBA использует соединение для надежной аутентификации и последующей отправки данных (если бы можно было использовать python, я бы потратил несколько недель на изучение этого решения и определился с текущим доступом У меня есть и ресурсы в моем распоряжении, это было бы более эффективно, чтобы двигаться дальше и справиться с этим в будущем)
Option Explicit
Sub AddNew_SP()
Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim mySQL As String
Dim i As Integer
Dim LastRow As Integer
Set cnt = New ADODB.Connection
Set rst = New ADODB.Recordset
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
mySQL = "SELECT * FROM [1];"
'This uses ADO to open the SP and add data I based this solution off of the video below
'Youtube Link: https://youtu.be/1qu6u2x7Kms
'GUID : {-}
'Site : --
With cnt
.ConnectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=0;RetrieveIds=Yes;DATABASE=MYSITE;LIST={MYGUID};"
.Open
End With
rst.Open mySQL, cnt, adOpenDynamic, adLockOptimistic
For i = 2 To LastRow 'This sets the second rowa as i (not counting heading row) and makes loop to go from 2 to the LastRow.
With ActiveSheet.Rows(i) 'This is with the current sheet at row i
rst.AddNew
rst.Fields("Department") = .Cells(1).Value
rst.Fields("Machine#") = .Cells(2).Value
rst.Fields("Operation#") = .Cells(3).Value
rst.Fields("Part#") = .Cells(4).Value
rst.Fields("Program") = .Cells(12).Value
End With
rst.UpdateBatch
Next i 'changes rows by incrementing i.
If CBool(rst.State And adStateOpen) = True Then rst.Close
Set rst = Nothing
If CBool(cnt.State And adStateOpen) = True Then cnt.Close
Set cnt = Nothing
End Sub
Итак, моя проблема в том, что я хочу, чтобы скрипт загружал мои Данные, хотя я могу сказать, что он запускает определенные части моего кода к тому моменту, когда он пытается запустить макрос, который я получаю:
«Ошибка времени выполнения» -2147217885 (80040e23) ':
Дескриптор строки, относящийся к удаленной строке или строке, помеченной для удаления "
Я почему-то думаю, что моя книга Excel не проверяет данные внутри нее, и поэтому, когда он пытается запустить макрос, он работает не так, как будто нет данных для отправки. Но я знаю, что это должно произойти, потому что я запускаю функцию макроса в моем скрипте после того, как в рабочей книге переданы данные. Когда я нажимаю «debug», он указывает на rst.UpdateBatch в моем VBA-скрипте.