【问题标题】:OpenpyXL: Runtime Error 6 OverflowOpenpyXL:运行时错误 6 溢出
【发布时间】:2017-07-06 20:58:42
【问题描述】:

我有一个使用 openpyxl 的程序,可以打开两个现有的 Excel 文件。一个是一个简单的工作表,其中包含需要复制到另一个文件中的数据,该文件是一个包含许多工作表和使用此复制数据的 VBA 宏的工作簿。但是,当 VBA 代码运行时,我得到了运行时错误 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 的行上: 乌鸦 = 乌鸦 + 1 我尝试将 acrow 从整数更改为长整数,但这只会导致程序无限期运行,直到我单击或取消它,此时我收到运行时错误“1004”,应用程序定义或对象定义错误,直接在 arow 增量之前的行。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 那么,Python代码运行时没有异常?
  • 一点也不。它会在目标文件夹中生成新的填充工作簿,而不会引发任何错误。它生成的工作簿与我加载的模板相同,除了附加数据。我已将 keep_vba ​​设置为 true,但是否可能没有保留工作簿的某些方面?如果您需要更多 VBA 代码,请告诉我。
  • 另外,我刚刚注意到工作簿模板本身为 488 KB,而填充的副本约为 180 KB。所有的宏似乎都被保留了,但这是否表明我在加载和重新保存模板时失去了重要的功能?
  • acrow 在哪里初始化? Sheets("Accounts").Cells(acrow, 1).Value = aNumber 似乎总是错误的,因此你有一个无限循环。无论如何,对列中的值进行 VBA 线性搜索是较差的 VBA。最好使用Range 对象的Find 方法。这可以显着改善运行时间。
  • acrow 被初始化为一个整数,从 2 开始。我没有写 VBA 方面的东西,所以我不完全确定该循环应该做什么,更不用说我了m 不懂 VBA。但你是对的,它似乎没有终止并导致溢出。看起来它会继续循环,直到遇到相同的帐号,或者直到遇到一个空单元格。我只是不明白为什么当我手动输入数据时它会终止,但当自动输入相同的数据时它不会终止..

标签: vba excel openpyxl


【解决方案1】:

John Coleman 关于溢出的位置是正确的。问题是我将 aNumber 编写为字符串,并且在 VBA 中将 aNumber 声明为 Variant 类型,根据文档,它可以表示固定长度字符串以外的任何内容。我只是改变了我的策略并将帐号写为整数,从而解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2013-09-11
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多