返回列表 上一主題 發帖

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

回復 6# asus103
  1. Sub ex()
  2. Dim Ar()
  3. For Each A In [A1:D1]
  4. ad = Range(A, Cells(Cells.Rows.Count, A.Column).End(xlUp)).Address
  5.   ReDim Preserve Ar(s)
  6.   Ar(s) = Evaluate("MAX(LENb(" & ad & "))") '紀錄各欄的最大字元長度
  7.   s = s + 1
  8. Next
  9. Open "ToText.txt" For Output As #1
  10. For r = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row
  11.    For i = 0 To 3
  12.      test = Cells(r, i + 1)
  13.      '進行加入空白字元,直到字元長度符合
  14.      Do Until Evaluate("LenB(""" & test & """)") = Ar(i) + 4 '4為欄位空白間隔
  15.      test = test & " "
  16.      Loop
  17.      mystr = mystr & test
  18.    Next
  19. Print #1, mystr
  20. mystr = ""
  21. Next
  22. Close #1
  23. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 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

回復 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

        靜思自在 : 甘願做、歡喜受。
返回列表 上一主題