找回密码
 加入
搜索
楼主: whoistop

[效率算法] [已解决]需要批量替换excel中某一列的数据,replace效率太低,求解决办法

 火.. [复制链接]
 楼主| 发表于 2012-5-23 23:40:30 | 显示全部楼层
回复 15# kevinch
看来也只能这样了,谢谢!
这个帖子可以结了。
发表于 2012-5-30 23:12:40 | 显示全部楼层
回复 9# whoistop
Thanks
发表于 2012-12-4 16:37:22 | 显示全部楼层
回复 12# kevinch

老大  可以改寫這個VBA 變成 AU3可以使用的嗎.....剛好遇到這個需求...可惜小弟功力不夠 改寫不出來
可以改成函數的方式可以引用嗎??
发表于 2012-12-4 19:17:44 | 显示全部楼层
回复 18# kk_lee69
没明白你的意思,你指的是哪个修改?
发表于 2012-12-5 12:05:18 | 显示全部楼层
回复 19# kevinch

第12樓....... 那個 你舉的範例  其中 最快的應該是 先讀取陣列 利用變數取代 然後再回寫....

不過有個疑問想請教一下.....
理論上 VBA 在EXCEL 跑會是最快  所以 VBA 的陣列再跑應該會比 用AU3的陣列再跑來的快....
我本來是想 拿你的範本 直接改...可是突然發現的是 陣列那段 不知道怎麼寫成....AU3的

我最初的想法是  利用 VBA 本身的陣列 跟取代函數  本來只是想利用AU3 把 變數 傳送到VBA
但是 後來 又發現 那麼 EXCEL 怎麼知道這段 VBA 程式呢??  所以一直搞不懂

能把這段 取代的 變成AU3 可以用的嗎??
发表于 2012-12-5 19:09:17 | 显示全部楼层
回复 20# kk_lee69
可以,但是我要知道你打算怎么实现,因为写成func需要有一个大体的思路:
func _ReplaceExcelArea($area,????????)
    固定处理还是通过参数?对应关系
endfunc
发表于 2012-12-6 00:14:57 | 显示全部楼层
回复 21# kevinch

func _ReplaceExcelArea($area,????????)
    固定处理还是通过参数?对应关系
endfunc
   
當然是通過參數處理
第一個 應該是  $oExcel 這個吧
第二個 $area  應該是範圍吧 ==> 最好是 可以以 A1:Z10000 這樣地表示法
參數3 應該是 尋找的字串
參數4 應該是  取代的字串

參數5  不知道能否實現  就是 可以定義 要不要 排除  存有公式的儲存格....
因為有些欄位是公式 但是通常取代只會希望 取代掉文字的部份 ...當然不希望 取代破壞掉原來的公式

不知道這樣是否表達清楚....感謝您的幫忙^^
发表于 2012-12-6 08:51:41 | 显示全部楼层
回复 22# kk_lee69
Func _ReplaceExcelArea($oexcel,$range="A1",$lookupvalue="",$replacevalue="",$skipformulacell=1)
        Dim $arr,$n,$i
        With $oexcel.range($range)
                $arr=.formula
                For $n=0 To UBound($arr)-1
                        For $i=0 To UBound($arr,2)-1
                                If $skipformulacell=0 Or StringLeft($arr[$n][$i],1)<>"=" Then $arr[$n][$i]=StringReplace($arr[$n][$i],$lookupvalue,$replacevalue)
                        Next
                Next
                .formula=$arr
        EndWith
EndFunc
这个可以试一下,不会替换有公式的单元格有风险,还是要慎重使用
发表于 2012-12-6 08:52:23 | 显示全部楼层
附上我的完整测试代码
$excel=ObjCreate("excel.application")
$excel.visible=False
$wb=$excel.workbooks.open(@ScriptDir&"\1.xlsx")
_ReplaceExcelArea($wb.activesheet,"a1:l18","1","-")
$wb.save
$wb.close
$excel.quit
MsgBox(0,"","OK")


Func _ReplaceExcelArea($oexcel,$range="A1",$lookupvalue="",$replacevalue="",$skipformulacell=1)
        Dim $arr,$n,$i
        With $oexcel.range($range)
                $arr=.formula
                For $n=0 To UBound($arr)-1
                        For $i=0 To UBound($arr,2)-1
                                If $skipformulacell=0 Or StringLeft($arr[$n][$i],1)<>"=" Then $arr[$n][$i]=StringReplace($arr[$n][$i],$lookupvalue,$replacevalue)
                        Next
                Next
                .formula=$arr
        EndWith
EndFunc
发表于 2012-12-6 13:15:45 | 显示全部楼层
回复 23# kevinch

OK!! 太感謝了  這樣就可以解決我的問題了....

另外再跟您請教個觀念.......其實上面的 函數中  陣列的部分 是使用AU3的陣列對吧.....

有沒有方式 是可以使用 VBA 本身的陣列(就是 數組)......我原本的想法是有點類似
   http://www.autoitx.com/forum.php ... ight=EXCEL%2B%BA%EA
這篇文章中提到的....不過這篇文章中的前提條件是....宏 本身就存在於 EXCEL.....

如果 EXCEL 本身沒有宏....用AU3 把宏加進去跑  
P.S 這邊要解釋一下  用AU3把宏加進去跑... 不是 先寫個宏的字串語法....利用AU3建立宏...在RUN宏...
如果是這樣  我覺得理論上 可以做到....

但是我想的是 AU3 跟宏的語法是混和的.....就是不再EXCEL中建立宏....但是 是用宏的 語法再跑....這樣可以做到嗎??

可是後來想想自己的邏輯 還是有點怪怪的 說不通.....純粹請教觀念而已.... 感謝幫忙
发表于 2012-12-6 20:08:50 | 显示全部楼层
本帖最后由 kevinch 于 2012-12-6 20:54 编辑

回复 25# kk_lee69
au3是可以这样做的,不过并不是简单的就能写入
首先,要判断是否禁用了宏,至少要将宏安全性设置为中或者中以下才能在excel中运行宏,还要设置“信任对vb模块的访问”才能写入宏代码到文件,这引起都可以通过修改注册表实现
其次是写入宏代码,这个以前曾经帮人写过一个小程序,利用一个固定的文本文件装载写好的vba代码,类似一个“容器”,然后用au3在执行的过程中读取容器中的代码写入excel,执行完毕后再删除
不过所有这些操作都有可能被杀毒软件报毒,因为与宏病毒的原理基本一致
其实与其这样,不如尝试下看能不能找到一种方法,可以直接将vba代码转换为au3代码,感觉上有此可能,有空时研究一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-11 19:41 , Processed in 0.075926 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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