whoistop 发表于 2012-5-23 23:40:30

回复 15# kevinch
看来也只能这样了,谢谢!
这个帖子可以结了。

xowen 发表于 2012-5-30 23:12:40

回复 9# whoistop
Thanks

kk_lee69 发表于 2012-12-4 16:37:22

回复 12# kevinch

老大可以改寫這個VBA 變成 AU3可以使用的嗎.....剛好遇到這個需求...可惜小弟功力不夠 改寫不出來
可以改成函數的方式可以引用嗎??

kevinch 发表于 2012-12-4 19:17:44

回复 18# kk_lee69
没明白你的意思,你指的是哪个修改?

kk_lee69 发表于 2012-12-5 12:05:18

回复 19# kevinch

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

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

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

能把這段 取代的 變成AU3 可以用的嗎??

kevinch 发表于 2012-12-5 19:09:17

回复 20# kk_lee69
可以,但是我要知道你打算怎么实现,因为写成func需要有一个大体的思路:
func _ReplaceExcelArea($area,????????)
    固定处理还是通过参数?对应关系
endfunc

kk_lee69 发表于 2012-12-6 00:14:57

回复 21# kevinch

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

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

不知道這樣是否表達清楚....感謝您的幫忙^^

kevinch 发表于 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这个可以试一下,不会替换有公式的单元格有风险,还是要慎重使用

kevinch 发表于 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

kk_lee69 发表于 2012-12-6 13:15:45

回复 23# kevinch

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

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

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

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

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

可是後來想想自己的邏輯 還是有點怪怪的 說不通.....純粹請教觀念而已.... 感謝幫忙

kevinch 发表于 2012-12-6 20:08:50

本帖最后由 kevinch 于 2012-12-6 20:54 编辑

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