2017-07-05 120 views
0

我有一個程序利用openpyxl打開兩個現有的Excel文件。一種是簡單的工作表,其中需要將數據複製到另一個文件中,這是一個包含許多工作表的工作簿,以及使用此複製數據的VBA宏。但是,當VBA代碼運行時,會出現運行時錯誤6溢出。奇怪的是,如果我手動將所有必需的單元格複製到工作簿中,宏運行順利。但是當這個過程是自動的,即使單元格中的值是相同的,這個錯誤也會彈出來。以下是將數據從一張工作表轉錄到另一張工作表的代碼。OpenpyXL:運行時錯誤6溢出

def transcribe_client_data_to_workbooks(): 
    _active_sheet_index = 5 
    for client in set(cdict.values()): 
     report_path = r'C:\Program Files\Notepad++\reports' + '\\' + 
     string.replace(client,'/','-') + '_report.csv' 
     wb = openpyxl.load_workbook('Bucket-Asset Allocation Model.xlsm', 
      read_only = False, keep_vba = True) 
     ws = wb.active 
     with open(report_path, 'rU') as f: 
      reader = csv.reader(f) 
      for row_index, row in enumerate(reader): 
       for column_index, cell in enumerate(row): 
        column_letter = get_column_letter((column_index+1)) 
        ws[column_letter+str(row_index+1)] = cell 
      f.close() 
     wb.save('C:\\Program Files\\Notepad++\\workbooks\\' + 
     string.replace(client,'/','-') + '_workbook.xlsm') 

我不明白爲什麼我會收到此錯誤消息時自動複製此數據,但不是當我手動複製/粘貼時。每次迭代打開相同的工作簿模板,然後在複製適當的數據後將其保存爲新工作簿模板。作爲參考,這裏是發生錯誤的VBA代碼部分。

Do Until Sheets("Raw Data").Cells(crow, 1).Value = Empty 
       aNumber = Sheets("Raw Data").Cells(crow, 1).Value 
       ticker = Sheets("Raw Data").Cells(crow, 9).Value 
       security = Sheets("Raw Data").Cells(crow, 8).Value 
       mValue = Sheets("Raw Data").Cells(crow, 12).Value 
       bAmt = Sheets("Raw Data").Cells(crow, 18).Value 
       uGain = Sheets("Raw Data").Cells(crow, 20).Value 
        Do Until Sheets("Accounts").Cells(acrow, 1).Value = aNumber 
        acrow = acrow + 1 
        Loop 

具體來說它發生在該遞增線ACROW: ACROW = ACROW + 1 我試圖從一個整數改變ACROW到一個長期的,但只是導致程序無限期運行,直到我點擊或取消,在這一點我收到運行時錯誤'1004',應用程序定義或對象定義的錯誤,在行的增量之前的行。

任何幫助將不勝感激,謝謝!

+1

那麼,Python代碼運行時沒有例外嗎? –

+0

完全沒有。它會在目標文件夾中生成新的填充工作簿,而不會產生任何錯誤。它生成的工作簿與我加載的模板相同,除了附加數據。我將keep_vba設置爲true,但有可能工作簿的某些方面未被保留?讓我知道你是否需要更多的VBA代碼。 –

+0

此外,我剛剛注意到,工作簿模板本身是488 KB,而填充副本是〜180 KB。所有的宏似乎都被保留了下來,但是這是否表明我在加載和重新保存模板時會失去重要的功能? –

回答

0

John Coleman對於溢出的位置是正確的。問題在於我正在編寫一個字符串的數字,並且一個Number在VBA中聲明爲Variant類型,根據文檔可以表示除固定長度字符串之外的任何其他字符。我只是改變了我的策略,並將帳號編寫爲解決問題的整數。