我们在面向客户的数据库上运行报告。我们在各种其他报告中使用这些报告中的数据,所有这些都是通过 Excel 和宏完成的。
这些报告已经持续了大约两年,直到上周六我们开始得到:
运行时错误“7”:
从另一个工作簿复制数据时内存不足
一位客户在任何文本之前添加了三个等号 (===) 的条目,我的假设是 Excel 正在尝试求解方程而不是复制数据。
如果我将数据削减到仅该行,就会发生这种情况。
我想构建一些东西来解决这个问题。
调用的代码。
With ActiveWorkbook.Sheets(1).UsedRange
RawDataMR.Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value
End With
我尝试将计算设置为手动。
我尝试关闭该特定工作表的计算。
我希望有一种方法可以阻止它尝试将其读取为公式。
我唯一的另一个想法是建立一个例程,检查每个单元格的内容并删除字母数字字符以外的任何字符,但这似乎有问题,因为通常有 7k 行,而且我很确定它在遇到问题时仍然会打嗝那个细胞。
这是一个更有针对性的方法。 在
arr
上循环比在源范围内逐个单元格循环要快得多。
'example usage
Sub Tester()
'...
'...
TransferClean ActiveWorkbook.sheets(1).UsedRange, RawDataMR.Range("A1")
'...
End Sub
Sub TransferClean(rngSrc As Range, rngDest As Range)
Dim arr, r As Long, c As Long, v
arr = rngSrc.Value
For r = 1 To UBound(arr, 1)
For c = 1 To UBound(arr, 2)
v = arr(r, c)
'if it looks like a formula, make it Text
If v Like "=*" Then arr(r, c) = "'" & v
Next c
Next r
rngDest.Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
看起来问题正在发生,因为 Excel 正在尝试处理任何 以 === 开头的单元格作为公式,这导致了错误
您可以循环遍历单元格并检查它们是否以 = 开头(其中 包括 ===),然后在开头添加撇号 (') 以确保 Excel 将其视为纯文本而不是公式
我正在寻找的修复比我希望的更简单。感谢 BigBen 的回复。
RawDataMR.Range("A1").Resize(.Rows.Count, .Columns.Count).NumberFormat = "@"
,在传输值之前。 – 大本钟