Неожиданный конец строки / отмечен как ошибка удаления - PullRequest
0 голосов
/ 25 июня 2019

Итак, у меня есть скрипт 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-скрипте.

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