Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: ugeso

[已解决]arr内存溢出

[复制链接]
发表于 2014-2-4 22:07 | 显示全部楼层
bbwsj 发表于 2014-2-4 21:38
你的表不会有65536行吧,弱弱的说,你的表真有数据达到10000多行了,就不适合用EXCEL了,改用数据库吧
...

用这个代码,逐列计算、转换即可:
  1. Sub test1()
  2.     Dim i&, j&, m&, tms#
  3.     tms = Timer
  4.     For j = 1 To 240 '遍历A to IF 共240列
  5.         m = Cells(1, j).End(xlDown).Row '该列数据最大行数m (要求数据连续)
  6.         arr = Cells(1, j).Resize(m) '该列数据读入数组arr
  7.         For i = 1 To m
  8.             arr(i, 1) = Chr(64 + arr(i, 1)) '把数值转换为英文字符
  9.         Next
  10.         Cells(1, j).Resize(m) = arr '输出结果到工作表对应列
  11.     Next
  12.     MsgBox Format(Timer - tms, "0.000s")
  13. End Sub
复制代码
试了一下你的置换法,实际要多好几倍,不合算。
Sub test2()
    Dim i&, j&, m&, tms#
    tms = Timer
    For j = 1 To 240 '遍历A to IF 共240列
        m = Cells(1, j).End(xlDown).Row '该列数据最大行数m (要求数据连续)
        For i = 1 To 5
            Cells(1, j).Resize(m).Replace What:=i, Replacement:=Chr(64 + i) '对该列数据进行置换
        Next
    Next
    MsgBox Format(Timer - tms, "0.000s")
End Sub


Sub test3()
    Dim i&, j&, m&, tms#
    tms = Timer
    m = Cells(1, 1).End(xlDown).Row '该列数据最大行数m (要求数据连续)
    For i = 1 To 5
        Cells(1, 1).Resize(m, 240).Replace What:=i, Replacement:=Chr(64 + i) '对整个区域进行直接置换
    Next
    MsgBox Format(Timer - tms, "0.000s")
End Sub
这个代码尤其危险……可能会直接死机(我只测试了5列)


回复

使用道具 举报

发表于 2014-2-4 22:18 | 显示全部楼层
本帖最后由 bbwsj 于 2014-2-4 22:24 编辑
香川群子 发表于 2014-2-4 22:07
用这个代码,逐列计算、转换即可:试了一下你的置换法,实际要多好几倍,不合算。
Sub test2()
    Dim  ...


E没有什么最好的方法,只有某种情况下最适合的方法
回复

使用道具 举报

 楼主| 发表于 2014-2-4 22:28 | 显示全部楼层
香川群子 发表于 2014-2-4 22:07
用这个代码,逐列计算、转换即可:试了一下你的置换法,实际要多好几倍,不合算。
Sub test2()
    Dim  ...

这个是可以实现。但我的数据中,a 到 if 列中,偶数列是没有数据的,能否设置成只对奇数列替换,跳过偶数列?无论怎么,先谢谢了,指了一条明路呀。
回复

使用道具 举报

发表于 2014-2-4 22:31 | 显示全部楼层
我想问:每次运算的数据有多少(应该不是所有占用吧)?如果是这样的话,只处理用到的数据。
回复

使用道具 举报

 楼主| 发表于 2014-2-4 22:38 | 显示全部楼层
759857387 发表于 2014-2-4 22:31
我想问:每次运算的数据有多少(应该不是所有占用吧)?如果是这样的话,只处理用到的数据。

不是所有 的,a2:if65536 中,只有偶数行是要替换的,奇数列是空白的。
回复

使用道具 举报

发表于 2014-2-4 22:45 | 显示全部楼层
ugeso 发表于 2014-2-4 22:38
不是所有 的,a2:if65536 中,只有偶数行是要替换的,奇数列是空白的。

即便这样依然太大,这偶数行里你又用多少数据(我是指你每次用到的数据)?如果最终用到超过5000行数据,建议不要用excel了,去找专业大型数据库吧。
回复

使用道具 举报

 楼主| 发表于 2014-2-4 22:54 | 显示全部楼层
759857387 发表于 2014-2-4 22:45
即便这样依然太大,这偶数行里你又用多少数据(我是指你每次用到的数据)?如果最终用到超过5000行数据, ...

超过5000的,直接用到了65535,数据库真的好牛呀,有时间去学习一下。
回复

使用道具 举报

发表于 2014-2-4 23:01 | 显示全部楼层
几万行数据,安了excel,就用他的同胞兄弟access吧,也很好入门的。
11楼群子的代码,对于你隔列有值,可将循环步长写成2就成了呀
回复

使用道具 举报

发表于 2014-2-4 23:07 | 显示全部楼层    本楼为最佳答案   
ugeso 发表于 2014-2-4 22:38
不是所有 的,a2:if65536 中,只有偶数行是要替换的,奇数列是空白的。

For j = 1 To 240 Step 2

2步一跳的遍历
回复

使用道具 举报

发表于 2014-2-5 11:57 | 显示全部楼层
学习
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 02:58 , Processed in 0.250019 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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