返回列表 上一主題 發帖

[發問]請問輸出成.TXT檔時可以指定在TXT檔中的位置嗎?

回復 10# asus103
程式碼中許多事並不明白,還請指教
1.For Each A In [A1:D1]
  ad = Range(A, Cells(Cells.Rows.Count, A.Column).End(xlUp)).Address
  ad不是A1:D11嗎?為何每一次移動一欄而不是一個儲存格
ans:我使用第一列作迴圈,所以ad字串是傳回該列資料範圍的位址

2.Ar(s) = Evaluate("MAX(LENb(" & ad & "))")
   感覺上像EXCEL中陣列的用法,但實在掌握不住竅門所在,能解釋一下這個用法嗎?
ans:這是陣列用法沒錯,這等於在儲存格內填入陣列公式,假設ad變數的值等於"$A$1:$A$11"
就等同在儲存格內輸入陣列公式{=MAX(LENB($A$1:$A$11))}所得到的值一樣

3.Evaluate("LenB(""" & test & """)") 的用法也看不懂
  我把它改成 LenB( test) 後逐行執行時還OK,但最後似乎變成無線迴圈跳不出來
  Evaluate()已大大的用法似乎代表函數是嗎?但說明中只有它是"方法"的用法
4.我用lenb()在程式中得到的第2欄最大值為26,為何大大能得正確的22
ans3、4:Evaluate名稱轉換成物件或者值
所以他就是一個物件包裝方法,將字串描述轉換成敘述所得之值
這邊值得注意的是vba的LENB函數跟工作表函數LENB有所差異
使用Evaluate方法中等同是工作表函數運算
工作表函數LENB會依照每個字的位元數計算
vba的LENB函數則每個字元都視為2個位元
此差異性請參閱VBA的LENB範例說明
學海無涯_不恥下問

TOP

本帖最後由 asus103 於 2011-1-19 16:52 編輯

回復 11# Hsieh
感謝Hsieh大大的解說
我可以繼續請教嗎?

1.For Each A In [A1:D1]
  ad = Range(A, Cells(Cells.Rows.Count, A.Column).End(xlUp)).Address
  ad不是A1:D11嗎?為何每一次移動一欄而不是一個儲存格
ans:我使用第一列作迴圈,所以ad字串是傳回該列資料範圍的位址
不好意思,我還是不懂是如何告訴VBA是列作迴圈的
2.Ar(s) = Evaluate("MAX(LENb(" & ad & "))")
上式之所以是陣列公式是因為" & ad & "還是 Evaluate
換言之,若要在VBA中使用陣列公式要注意甚麼
如果說:
陣列公式中的{}用Evaluate()取代,EXCEL的函數所需引數放入字串中並用" &     & "來帶入
這樣對嗎?

3.Evaluate的用法我還須多加琢磨,只是
"使用Evaluate方法中等同是工作表函數運算"為何不是使用application.---
其實我也試過用application.LenB()只是編譯階段就出錯了


不好意思,繼續找您麻煩
如果有其他地方有Evaluate的用法或是VBA中使用陣列公式的使用說明
煩請告知,我會再多加努力的
ASUS

TOP

回復 12# asus103


    For Each A in [A1:D1]
所以變數A依序為A1,B1,C1,D1
ad變數是變數A到A所在欄位資料尾範圍的位址字串
當A=[A1]時,ad="$A$1:$A$11"
當A=[B1]時,ad="$B$1:$B$11"
以此類推

Evaluate就是計算括號內字串敘述
因為LEN函數同時為工作表函數與VBA函數,所以使用worksheetfunction無法正確引用,會出錯,故採用Evaluate
至於是為何能達到陣列計算效果,端賴括號內字串敘述,非Evaluate所致,Evaluate方法會依照描述運算,所以此例是因為ad字串是代表一個範圍,所以會有陣列效果產生

Evaluate在說明中已經明白指出,此方法是把名稱轉換成物件或者值
所謂名稱就是字串敘述
重點是字串敘述而不是Evaluate的解釋,Evaluate就像是個函數名稱
那麼它的功用就是把字串敘述轉成運算,如此而已。
若還不明白,我就不知該如何解釋了。請對Evaluate有更深認識的前輩幫忙解釋吧
學海無涯_不恥下問

TOP

回復 13# Hsieh
感謝Hsieh大大
我大概有七、八成懂了
我會試著用這些概念來寫一個函數,已徹底了解其用法
感謝您
這真是個豐收的一天
ASUS

TOP

        靜思自在 : 道德是提昇自我的明燈,不該是呵斥別人的鞭子。
返回列表 上一主題