ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7573|回复: 27

[求助] 数据量稍微一大就内存不够用 大神来助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-10-9 22:54 | 显示全部楼层 |阅读模式
小白辛苦写的 开始效率真的高很多 后来数据量大了很容易就内存溢出
8G内存 换了64位Excel仍然不能解决 很是无奈
可能原因是循环多 内存不能及时释放吧

主要功能就从一堆工作簿中找到特定位置复制粘贴到另一个指定工作簿 重复的打开关闭文件

望大神相助 搜索了很多仍没找到合适的解决办法

0vbadf.rar

11.21 KB, 下载次数: 41

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-9 22:56 | 显示全部楼层
本帖最后由 hexaking 于 2018-10-9 23:02 编辑
  1. Sub autodb()


  2.     Dim r As Integer
  3.     Dim w As Integer
  4.     Dim i As Integer
  5.     Dim q As Integer
  6.     Dim y As Workbook
  7.     Dim b As Workbook
  8.     Dim FD
  9.     Application.ScreenUpdating = False
  10.     Application.Calculation = xlCalculationManual
  11.     FD = ThisWorkbook.Sheets("Sheet1").Range("K3")
  12.     For w = 1 To ThisWorkbook.Sheets("Sheet1").Range("L3")
  13.     For r = 1 To 45
  14.     Set y = Workbooks.Open("D:\Program Files (x86)\Desktop\资料\F\test" & Format(FD, "yyyy-m-d") & ".xlsx") '引用值(不同日期需修改)
  15.     Set b = Workbooks.Open("D:\Program Files (x86)\Desktop\FC表\F\C" & r & ".xls")
  16.     i = Worksheets.Count
  17.     For q = 1 To i
  18.     If b.Worksheets(q).Range("E24") = "" Then
  19.     b.Worksheets(q).Activate
  20.     Exit For
  21.     Else
  22.     End If
  23.     Next q
  24.     If r < 23 Then
  25.     If ActiveSheet.Range("A24") = "" Then
  26.     y.Sheets("C ").Cells(5, 2).Copy
  27.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  28.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("C ").Cells(10 + r, 3) * 1000 '本次测值(不同日期需修改)
  29.     y.Close 0
  30.     Else
  31.     y.Sheets("C ").Cells(5, 2).Copy
  32.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  33.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("C ").Cells(10 + r, 3) * 1000 '本次测值(不同日期需修改)
  34.     y.Close 0
  35.     End If
  36.     Else
  37.     If ActiveSheet.Range("A24") = "" Then
  38.     y.Sheets("C ").Cells(5, 2).Copy
  39.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  40.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("C ").Cells(35 + r, 3) * 1000 '本次测值(不同日期需修改)
  41.     y.Close 0
  42.     Else
  43.     y.Sheets("C ").Cells(5, 2).Copy
  44.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  45.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("C ").Cells(35 + r, 3) * 1000 '本次测值(不同日期需修改)
  46.     y.Close 0
  47.     End If
  48.     End If
  49.     b.Close 1
  50.     Next r
  51.     FD = DateAdd("d", ThisWorkbook.Sheets("Sheet1").Range("M3"), FD)
  52.     Next w
  53.     Application.ScreenUpdating = True
  54.     Application.Calculation = xlCalculationAutomatic
  55. End Sub
  56. Sub autopc()


  57.     Dim r As Integer
  58.     Dim w As Integer
  59.     Dim i As Integer
  60.     Dim q As Integer
  61.     Dim y As Workbook
  62.     Dim b As Workbook
  63.     Dim FD
  64.     Application.ScreenUpdating = False
  65.     Application.Calculation = xlCalculationManual
  66.     FD = ThisWorkbook.Sheets("Sheet1").Range("K3")
  67.     For w = 1 To ThisWorkbook.Sheets("Sheet1").Range("L3")
  68.     For r = 1 To 30
  69.     Set y = Workbooks.Open("D:\Program Files (x86)\Desktop\资料\F\test" & Format(FD, "yyyy-m-d") & ".xlsx") '引用值(不同日期需修改)
  70.     Set b = Workbooks.Open("D:\Program Files (x86)\Desktop\FC表\F\PC" & r & ".xls")
  71.     i = Worksheets.Count
  72.     For q = 1 To i
  73.     If b.Worksheets(q).Range("E24") = "" Then
  74.     b.Worksheets(q).Activate
  75.     Exit For
  76.     Else
  77.     End If
  78.     Next q
  79.     If r < 23 Then
  80.     If ActiveSheet.Range("A24") = "" Then
  81.     y.Sheets("PC").Cells(5, 2).Copy
  82.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  83.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("PC").Cells(10 + r, 3) * 1000 '本次测值(不同日期需修改)
  84.     y.Close 0
  85.     Else
  86.     y.Sheets("PC").Cells(5, 2).Copy
  87.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  88.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("PC").Cells(10 + r, 3) * 1000 '本次测值(不同日期需修改)
  89.     y.Close 0
  90.     End If
  91.     Else
  92.     If ActiveSheet.Range("A24") = "" Then
  93.     y.Sheets("PC").Cells(5, 2).Copy
  94.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  95.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("PC").Cells(35 + r, 3) * 1000 '本次测值(不同日期需修改)
  96.     y.Close 0
  97.     Else
  98.     y.Sheets("PC").Cells(5, 2).Copy
  99.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  100.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("PC").Cells(35 + r, 3) * 1000 '本次测值(不同日期需修改)
  101.     y.Close 0
  102.     End If
  103.     End If
  104.     b.Close 1
  105.     Next r
  106.     FD = DateAdd("d", ThisWorkbook.Sheets("Sheet1").Range("M3"), FD)
  107.     Next w
  108.     Application.ScreenUpdating = True
  109.     Application.Calculation = xlCalculationAutomatic
  110. End Sub
  111. Sub autops()


  112.     Dim r As Integer
  113.     Dim w As Integer
  114.     Dim i As Integer
  115.     Dim q As Integer
  116.     Dim y As Workbook
  117.     Dim b As Workbook
  118.     Dim FD
  119.     Application.ScreenUpdating = False
  120.     Application.Calculation = xlCalculationManual
  121.     FD = ThisWorkbook.Sheets("Sheet1").Range("K3")
  122.     For w = 1 To ThisWorkbook.Sheets("Sheet1").Range("L3")
  123.     For r = 1 To 30
  124.     Set y = Workbooks.Open("D:\Program Files (x86)\Desktop\资料\F\test" & Format(FD, "yyyy-m-d") & ".xlsx") '引用值(不同日期需修改)
  125.     Set b = Workbooks.Open("D:\Program Files (x86)\Desktop\FC表\F\SY" & r & ".xls")
  126.     i = Worksheets.Count
  127.     For q = 1 To i
  128.     If b.Worksheets(q).Range("E24") = "" Then
  129.     b.Worksheets(q).Activate
  130.     Exit For
  131.     Else
  132.     End If
  133.     Next q
  134.     If r < 23 Then
  135.     If ActiveSheet.Range("A24") = "" Then
  136.     y.Sheets("PSY").Cells(5, 2).Copy
  137.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  138.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("PSY").Cells(10 + r, 4) * 1000 '本次测值(不同日期需修改)
  139.     y.Close 0
  140.     Else
  141.     y.Sheets("PSY").Cells(5, 2).Copy
  142.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  143.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("PSY").Cells(10 + r, 4) * 1000 '本次测值(不同日期需修改)
  144.     y.Close 0
  145.     End If
  146.     Else
  147.     If ActiveSheet.Range("A24") = "" Then
  148.     y.Sheets("PSY").Cells(5, 2).Copy
  149.     ActiveSheet.Range("A25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  150.     ActiveSheet.Range("B25").End(xlUp).Offset(1, 0) = y.Sheets("PSY").Cells(35 + r, 4) * 1000 '本次测值(不同日期需修改)
  151.     y.Close 0
  152.     Else
  153.     y.Sheets("PSY").Cells(5, 2).Copy
  154.     ActiveSheet.Range("E25").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues '日期(不同日期需修改)
  155.     ActiveSheet.Range("F25").End(xlUp).Offset(1, 0) = y.Sheets("PSY").Cells(35 + r, 4) * 1000 '本次测值(不同日期需修改)
  156.     y.Close 0
  157.     End If
  158.     End If
  159.     b.Close 1
  160.     Next r
  161.     FD = DateAdd("d", ThisWorkbook.Sheets("Sheet1").Range("M3"), FD)
  162.     Next w
  163.     ThisWorkbook.Sheets("Sheet1").Range("K3") = Format(FD, "yyyy-m-d")
  164.     Application.ScreenUpdating = True
  165.     Application.Calculation = xlCalculationAutomatic
  166. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-10-9 23:58 来自手机 | 显示全部楼层
哇你这好复杂,代码看的头晕,可以考虑一下用数组提高运行速度。

TA的精华主题

TA的得分主题

发表于 2018-10-10 01:49 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-10 07:44 | 显示全部楼层
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-10-10 07:44 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-10 11:31 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
朱荣兴 发表于 2018-10-10 07:44
从未见过如此之长的代码,太多循环,效率肯定低

对呀 请教如何简化以提高效率
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-10-10 12:27 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-10-10 12:27 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-10 14:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
朱荣兴 发表于 2018-10-10 12:27
同时修改代码还不如自己写代码但是又不明白你具体的需求

大致是这样的,同附件:源数据每天会产生一组数据,我的目的是把源数据的A1~A5的测值按照时间顺序分别堆积到"归档"中的对应工作簿中(主要功能就是复制粘贴),例如A1.XLSX三天的整理结果如图,主要问题是数据量一大的话、、、可能从A1~A100个类别,且同时需要处理20天或者一个月的数据!
QQ截图20181010144152.png

数据整理.rar

1.57 MB, 下载次数: 27

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-17 03:10 , Processed in 0.027608 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表