Excel VBA内存使用情况

我试图复制大量的行(20k到65k)到新的工作簿,由于某种原因,分配我正在复制的范围的值使用更多的内存比使用复制/粘贴缓冲区,它不对我有意义,除非我以某种方式做错了。

这是原始的代码:

Public Const FIRSTSHEETTAB As String = "Sheet1" ' <snip> Dim last_row As Long Dim num_files As Long Dim ps_rng As Range ' <snip> Dim i As Long Dim new_book As Workbook Dim start_row As Long Dim end_row start_row = 2 For i = 1 To num_files Set new_book = Workbooks.Add end_row = start_row + max_lines - 1 If end_row > last_row Then end_row = last_row End If With new_book .Windows(1).Caption = "PS Upload " & i With .Worksheets(FIRSTSHEETTAB) .Range("1:1").Value2 = ps_rng.Range("1:1").Value2 .Range("2:" & max_lines).Value2 = ps_rng.Range(CStr(start_row) & ":" & CStr(end_row)).Value2 End With End With start_row = end_row + 1 Next i 

我需要做的是改变.Range("2:" & max_lines).Value2 = ps_rng.Range(CStr(start_row) & ":" & CStr(end_row)).Value2如下:

 ps_rng.Range(CStr(start_row) & ":" & CStr(end_row)).Copy .Range("2:" & max_lines).PasteSpecial 

我不明白为什么这个工作原来的代码用完了内存。 我宁可不必覆盖复制/粘贴缓冲区中的任何内容,只要我能帮上忙。

什么导致只是简单的任务内存不足?

因为您同时指定了16.384 x 65.000 = 1.064.960.000个单元格的值,这对于Excel来说是非常困难的。

一个更好的方法是限制所需的范围,使用具有值的最后一列进行复制。 我不推荐使用UsedRange属性,因为它有时会在远处编辑某个单元格时产生不需要的结果。

下面是一个代码示例:

 Public Const FIRSTSHEETTAB As String = "Sheet1" ' <snip> Dim last_row As Long Dim num_files As Long Dim ps_rng As Range ' <snip> Dim i As Long Dim new_book As Workbook Dim start_row As Long Dim end_row start_row = 2 'Obtaining last column of the desired range lastColumn = ps_rng.Cells(1, ps_rng.Columns.Count).End(xlToLeft).Column For i = 1 To num_files Set new_book = Workbooks.Add end_row = start_row + max_lines - 1 If end_row > last_row Then end_row = last_row End If With new_book .Windows(1).Caption = "PS Upload " & i With .Worksheets(FIRSTSHEETTAB) .Range(.Cells(1, 1), .Cells(1, lastColumn)).Value2 = ps_rng.Range(ps_rng.Cells(1, 1), ps_rng.Cells(1, lastColumn)).Value2 .Range(.Cells(2, 1), .Cells(max_lines, lastColumn)).Value2 = ps_rng.Range(ps_rng.Cells(start_row, 1), ps_rng.Cells(end_row, lastColumn)).Value2 End With End With start_row = end_row + 1 Next i 

在使用Copy ,Excel足够聪明,只能复制复制范围的已用部分。

例如。 看到下面:这是看在剪贴板上的“文本”版本,但这几乎是你得到什么时,你PasteSpecial

 Sub Tester() ActiveSheet.Cells.ClearContents ActiveSheet.UsedRange 'reset sheet CheckCopy '>> 1 ActiveSheet.Range("A1:J1").Value = "x" CheckCopy '>> 10 ActiveSheet.Range("XFD1").Value = "x" CheckCopy '>> 16384 ActiveSheet.Range("XFD1").ClearContents CheckCopy '>> 16384 ActiveSheet.UsedRange 'reset sheet CheckCopy '>> 10 End Sub Sub CheckCopy() Dim d As New DataObject, s As String ActiveSheet.Rows(1).Copy d.GetFromClipboard s = d.GetText Debug.Print "#Cols: " & IIf(Len(s) = 0, 0, UBound(Split(s, vbTab)) + 1) End Sub 

当您直接在两个大范围之间分配Value时,您不会获得此优化。