excel - ActiveSheet.Paste 的替代品以减少内存
问题描述
我正在尝试在工作中利用 VBA/宏功能。但是,我遇到了一个类似“错误”的问题;内存不足',在互联网上浏览了一番后,我意识到复制和粘贴通常会在 Excel 中占用大量空间,而我在工作场所的 Excel 只有 32 位。因此,有没有人知道 ActiveSheet.Paste 的任何好的替代品?
我的代码目前如下:
ActiveSheet.Range ("$A$!:$Y$1000").AutoFilter Field:=7, Criterial:=_banker
Range("A1").Select
Range(Selection, Selection.End(x1Down)).Select
Range(Selection, Selection.End(X1ToRight)).Select
Selection.Copy
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
ActiveSheet.Name= banker
i=i+1
Loop
End Sub
解决方案
您应该照原样复制您的代码,而不是编写它。这样,您将避免拼写错误(
Range ("$A$!:$Y$1000")
而不是"A1:...
,X1ToRight
而不是XlToRight
,“_banker”而不是“银行家”)。按照上面的建议,放在Option Explicit
模块顶部会有所帮助。一种过滤和复制过滤范围的方法,不涉及剪贴板应该是下一个代码。请测试它并发送一些反馈:
Sub testFilterCopyRange()
Dim sh As Worksheet, shNew As Worksheet, lastR As Long
Dim banker As String, rng As Range, rngF As Range, arr, i As Long
Dim maxIt As Long 'number of iterations
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.rows.count).End(xlUp).row 'last row
maxIt = 1 'set here the maximum number of necessary iterations
sh.AutoFilterMode = False 'eliminate the previous filter
Set rng = sh.Range("A1:H" & lastR) 'set the range to be processed
For i = 1 To maxIt
banker = "7" '"your dinamic criteria"
rng.AutoFilter field:=7, Criteria1:=banker 'filter the range according to above defined criteria
Set rngF = rng.SpecialCells(xlCellTypeVisible) 'set a range to keep the filtered cells in the range
arr = arrayFromDiscRange(rngF, False) 'header inclusive
Set shNew = Sheets.Add(After:=sh): shNew.Name = banker 'add a new sheet and name it
shNew.Range("A1").Resize(UBound(arr), UBound(arr, 2)).value = arr 'drop the array content at once
Next i
End Sub
'function able to transform a filtered (discontinue) range in an array:
Private Function arrayFromDiscRange(rngF As Range, Optional NoHeader As Boolean = False) As Variant
Dim arr, i As Long, j As Long, k As Long, A As Range, R As Range, iRows As Long
'count range rows
For Each A In rngF.Areas
iRows = iRows + A.rows.count
Next A
'Redim the array to keep the range
ReDim arr(1 To iRows - IIf(NoHeader, 1, 0), 1 To rngF.Columns.count): k = 1
For Each A In rngF.Areas 'iterate between the range areas:
For Each R In A.rows 'iterate between the area rows:
If NoHeader And k = 1 Then GoTo Later 'skip the first row, if no header wanted
For j = 1 To R.Columns.count 'iterate between the area row columns:
arr(k, j) = R.cells(1, j).value 'place each row cells value in the array row
Next j
k = k + 1 'intrement the array row to receive values
Later:
Next
Next A
arrayFromDiscRange = arr 'returning the created array
End Function
如果有不清楚的地方,即使我尝试评论所有可能在理解上有问题的代码行,请不要犹豫,要求澄清。
推荐阅读
- python-3.x - 当 Appium 不想要时调出键盘?
- node.js - NodeJS:如何将图像大小与 base64 图像一起使用?
- ubuntu - Ubuntu Preseed i386 UEFI PC 无法尝试安装 64 位 -> grub-efi-amd64-signed
- c# - 如何获得通过 Request.Form 收到的值
- javascript - AS/400 数据队列是否可以访问 node-jt400?(javascript)
- c++ - 是否可以在没有 ROS 的情况下在 Windows 中安装 kdl_parser
- mysql - 查询期间失去与 MySQL 服务器的连接 - 表大小有问题吗?
- python - 将混合字符串(ASCII、Unicode)输出到文件
- spinnaker - 来自 Helm Chart 的带有 Halyard 的 Spinnaker 缺少 aws cli
- java - 确定从循环内部调用递归函数的时间复杂度