Board logo

標題: [發問]請問輸出成.TXT檔時可以指定在TXT檔中的位置嗎? [打印本頁]

作者: asus103    時間: 2011-1-17 14:20     標題: [發問]請問輸出成.TXT檔時可以指定在TXT檔中的位置嗎?

請問格為大大:
EXCEL輸出成.TXT檔時,可以指定每一欄的資料開頭從哪一個位置開始嗎?

因為輸出報表需求,所有資料列中,每一欄的資料開頭的位置必須一致
因資料長短不一,又夾雜中、英文與數字
所以不管我用Len、LenB去算同一蘭的最大長度,其餘補空白的方式皆無法圓滿
所以想請問各位大大能否直接指定起始位置?
或還有其他解決方式?

感恩
作者: hugh0620    時間: 2011-1-18 11:20

本帖最後由 hugh0620 於 2011-1-18 11:45 編輯

回復 1# asus103


    我是一個新手~ 但是有笨方法可以勉強解決這個問題
   
   如附件[attach]4444[/attach] 執行後~ 再存成文字檔(tab字元分隔)

    其他大大也許有更好的處理方式

   PS. 另一種方式可是試著在ACCESS中 將每個欄位設成同樣的大小,再匯出成TEXT檔,也一樣可以達到這樣的效果
       不過這個我沒試過,妳可以試一下
作者: asus103    時間: 2011-1-18 11:45

回復 2# hugh0620
hugh0620大大您好
感謝您的熱心協助
其實讓我傷腦筋的是中英文混雜
因為全形、半形計算長度並不相同

再次感謝您
作者: hugh0620    時間: 2011-1-18 15:31

本帖最後由 hugh0620 於 2011-1-18 15:37 編輯

回復 3# asus103


    樓主~ 再看看~ 附件~[attach]4447[/attach]

    應該可以符合妳的需求~ 不過寫的很爛倒是真的~
    如果適合~我相信妳只要改回圈就可以了~
    我測試過LEN與LENB在EXCEL函數中與VBA中求出來的值是不一樣~
    所以~ 有加一頁用函數是先取得LENB的值,再帶到VB中使用~
    我只會用笨方法~  所以就不要太嫌棄了~ 等大大們用更好的寫法~ 妳就不會看不懂了~
    其實我的思考邏輯很簡單~
    1.全型中英文都是兩個字元,所以我在EXCEL用函數LENB把字元求出~
    2.再用LEN求出不管是全型或半型都是一個字算一個字元~
    3. lenb值減LEN的值就知道有幾個字是全型,幾個字是半型
   4.再後最用觀念去判斷程式的寫法
作者: asus103    時間: 2011-1-18 16:41

[attach]4448[/attach]
上傳我的例子
內含標準輸出的TXT
有勞各位費心協助
感恩再感恩
作者: asus103    時間: 2011-1-18 16:49

回復 4# hugh0620
"VBA向前衝"大大感謝您
我也會再好好研究您的程式碼的
謝謝
作者: hugh0620    時間: 2011-1-18 17:39

本帖最後由 hugh0620 於 2011-1-18 17:49 編輯

回復 5# asus103


    我有做了一些調整~  不過還是有些地方有點錯誤    請查閱附檔~ [attach]4449[/attach]
作者: Hsieh    時間: 2011-1-19 13:16

回復 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
複製代碼

作者: hugh0620    時間: 2011-1-19 13:40

回復 8# Hsieh


    大大真是厲害~
作者: asus103    時間: 2011-1-19 14:55

回復 8# Hsieh
Hsieh大大您好:
您的程式碼真是神乎其技阿
感恩

程式碼中許多事並不明白,還請指教
1.For Each A In [A1:D1]
  ad = Range(A, Cells(Cells.Rows.Count, A.Column).End(xlUp)).Address
  ad不是A1:D11嗎?為何每一次移動一欄而不是一個儲存格
2.Ar(s) = Evaluate("MAX(LENb(" & ad & "))")
   感覺上像EXCEL中陣列的用法,但實在掌握不住竅門所在,能解釋一下這個用法嗎?
3.Evaluate("LenB(""" & test & """)") 的用法也看不懂
  我把它改成 LenB( test) 後逐行執行時還OK,但最後似乎變成無線迴圈跳不出來
  Evaluate()已大大的用法似乎代表函數是嗎?但說明中只有它是"方法"的用法
4.我用lenb()在程式中得到的第2欄最大值為26,為何大大能得正確的22

是我程度太差了,這麼多看不懂的地方
還請大大多加提點
感謝再感謝
作者: Hsieh    時間: 2011-1-19 16:03

回復 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範例說明
作者: asus103    時間: 2011-1-19 16:30

本帖最後由 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中使用陣列公式的使用說明
煩請告知,我會再多加努力的
作者: Hsieh    時間: 2011-1-19 17:05

回復 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有更深認識的前輩幫忙解釋吧
作者: asus103    時間: 2011-1-19 17:18

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




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)