使用VBA的大文件大小复制范围

使用VBA的大文件大小复制范围,vba,excel,excel-2007,Vba,Excel,Excel 2007,我有一个例程,通过生成对旧工作表的单元格引用来复制工作表。我的问题是,当我在一个280KB大小的工作簿中的三张纸上运行这个例程时,它会膨胀到80MB。如果复制并粘贴工作表值以删除公式,工作簿的大小将保持不变。如果我删除图纸并保存,它将恢复为原始大小。VBA处理内存的方式中是否缺少导致此问题的内容?我已经尝试在例程结束时将所有变量设置为零 Public Sub CopySheetFormulas(inputSheet As Worksheet, outputSheet As Worksheet)

我有一个例程,通过生成对旧工作表的单元格引用来复制工作表。我的问题是,当我在一个280KB大小的工作簿中的三张纸上运行这个例程时,它会膨胀到80MB。如果复制并粘贴工作表值以删除公式,工作簿的大小将保持不变。如果我删除图纸并保存,它将恢复为原始大小。VBA处理内存的方式中是否缺少导致此问题的内容?我已经尝试在例程结束时将所有变量设置为零

Public Sub CopySheetFormulas(inputSheet As Worksheet, outputSheet As Worksheet)
Dim rowCounter As Long
Dim columnCounter As Long
Dim maxRow As Long
Dim maxColumn As Long

maxColumn = inputSheet.Cells.Find(What:="*", After:=inputSheet.Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column

Debug.Print "Max Column: " & maxColumn

maxRow = inputSheet.Cells.Find(What:="*", After:=inputSheet.Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row

Debug.Print "Max Row: " & maxRow

inputSheet.Range("A1").Resize(maxRow, maxColumn).Copy

With outputSheet
    .Activate
    .Range("A1").Select
    .Paste Link:=True
End With

End Sub

XLSX文件将单元格内容存储为字符串。但是他们自己打扫得不好。因此,如果删除某些内容,它并不总是会减小文件大小

如果只是复制工作表,它就不会像生成指向所有单元格的链接那样大。这是因为每个链接都存储为单独的字符串


很可能原始工作表的某些修改一直延伸到最后一行。然后,当你把它复制成链接时,它会变得疯狂,因为它正在生成数以百万计的链接。检查maxColumns和maxRows的值。

如果要减小文件大小,需要从工作表中删除额外的行或列, 然后保存它。文件大小将减小

例如,在快照下面,以前我有22条记录,虽然我删除了一些记录,但空单元格仍然影响文件大小。 如何知道它,CTRL+End,它停止的单元格会告诉你

删除这些空行或空列将减少文件大小


尝试此
outputSheet.Range(“A1”).Resize(maxRow,maxColumn)。Value=inputSheet.Range(“A1”).Resize(maxRow,maxColumn)
,以代替代码的最后6行。maxColumn和maxRow的值是什么?它们是您期望的值吗?文件为二进制格式。我来看看那个链接,明白了!原始文件有4 x 10000个单元格中的数据,但工作表认为有10000 x 10000中的数据。但很奇怪,空单元格会占用这么多内存。每个被修改的单元格都必须在文件结构中描述;这会使文件变大。但是当你生成一个链接到每个单元格时,每个链接都会占用更多的空间。所以你得到了一个膨胀的文件。