【发布时间】: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。但你是对的,它似乎没有终止并导致溢出。看起来它会继续循环,直到遇到相同的帐号,或者直到遇到一个空单元格。我只是不明白为什么当我手动输入数据时它会终止,但当自动输入相同的数据时它不会终止..