返回列表 上一主題 發帖

[發問] 選擇檔案轉成文字檔問題.

回復 20# 准提部林
感謝:准提部林,指導.代碼給初學者更清楚學習,感恩.
杜小平

TOP

本帖最後由 Andy2483 於 2023-11-3 07:20 編輯

回復 20# 准提部林


    謝謝論壇,謝謝前輩指導
以下是懵懂的心得註解,請前輩再指導

Sub Test_a1()
Dim xFile$, T1$, T2$, BN$, SN$, P$, PP$, Sx%, Cn, Arr, i&
'↑宣告變數:(xFile,T1,T2,BN,SN,P,PP)是字串變數,Sx是短整數變數,
'(Cn,Arr)是通用型變數,i是長整數變數

ChDir ThisWorkbook.Path
'↑ChDir "D:\"  '指定開啟檔案的路徑
xFile = Application.GetOpenFilename("Excel檔,*.XLS*")
'↑令xFile這字串變數是 顯示標準的 [開啟舊檔] 對話方塊,從使用者取得檔案的名稱
If xFile = "False" Then Exit Sub
'↑如果xFile變數是字串"False",代表沒有選取檔案,結束程序執行
T1 = [b1] & Mid([b2], 2, 6) & [b3] & [b4]
'↑令mcs1這字串變數是 [b1]儲存格值,連接[b2]儲存格值取第2字元開始的6字元字串,
'再連接[b3]儲存格值,最後連接[b4]儲存格值,組合成的字串 (文字串前碼)

T2 = [b5]
'↑令T2這字串變數是[b5]儲存格值 (存提款代號)
Sx = Val([b7])
'↑令Sx這字串變數是 [b7]儲存格值轉化的整數值 (指定第?張工作表(依左而右順序))
Cn = Split([b6], ",")
'↑令Cn這通用型變數是 [b6]儲存格以 逗號分割成的一維陣列 (指定欄位)
'---------------------------------

On Error Resume Next
'↑令程序執行不偵錯
With GetObject(xFile)
'↑以下是關於以xFile變數用GetObject函式 回傳物件(活頁簿)的程序
'謝謝 前輩指導這函式的用法
'執行到這裡並沒有看到開啟活頁簿,很神奇!後來查看到活頁簿視窗被隱藏起來了


'如果該活頁簿原本就被開啟會直接指向此活頁簿,不會再重新開啟一次
https://learn.microsoft.com/zh-t ... /getobject-function
     BN = Split(.Name, ".")(0)
     '↑令BN這字串變數是 活頁簿檔名(去除副檔名)
     '(去除副檔名方法:以"."符號分割活頁簿名稱,取0索引號陣列值)

     SN = .Sheets(Sx).Name
     '↑令SN這字串變數是活頁簿裡第Sx變數索引號工作表名稱
     Arr = Range(.Sheets(Sx).[g1], .Sheets(Sx).UsedRange) '資料範圍(含G欄)
     '↑令Arr這通用型變數是二維陣列,以已使用儲存格(含G欄)範圍儲存格值帶入
     .Close 0
     '↑令活頁簿關閉(不儲存)
End With
On Error GoTo 0
'↑令程序恢復偵錯
If SN = "" Then MsgBox "指定工作表不存在!  ": Exit Sub
'↑如果SN變數是 空的!就跳出提視窗~~~ ,結束程序執行
'----------------------------------

For i = 2 To UBound(Arr)
'↑設順迴圈!i從2 到Arr陣列縱向最大索引列號
    P = T1 & Arr(i, Cn(0))
    '↑令P這字串變數是 T1變數連接 i迴圈列(0索引號Cn陣列值)欄Arr陣列值
    P = P & Format(Arr(i, Cn(1)), "00000000000;;#") & "00" & T2
    '↑令P變數再連接 i迴圈列(1索引號Cn陣列值)欄Arr陣列值以Format函式回傳字串,
    '再連接 "00",續連接T2變數
    '這;;#分區段現在還不能理解,需要更多學習

    https://learn.microsoft.com/zh-t ... ic-for-applications
    P = P & Left(Arr(i, Cn(2)) & String(29, " "), 29)
    '↑令P變數再連接 29個字元的字串:
    'i迴圈列(2索引號Cn陣列值)欄Arr陣列值 連接29個空白字元,所組成的新字串,取左側29個字元

    If Len(P) = 80 Then PP = PP & IIf(PP = "", "", vbCrLf) & P
    '↑如果P變數字元數是80!就令PP這字串變數累增加字串(歸位字元換行組合)間隔
    '文字檔(.Txt)檔需要vbCrLf = CHR(13)+CHR(10) 才會換行

    https://learn.microsoft.com/zh-t ... ellaneous-constants
i01: Next i
If PP = "" Then MsgBox "指定工作表無符合資料!  ": Exit Sub
'↑如果PP變數是空的!就跳出提視窗~~~ ,結束程序執行
'----------------------------------

xFile = ThisWorkbook.Path & "\" & BN & "-Sheets(" & Sx & ").TXT"
Open xFile For Output As #1  'Output覆蓋舊資料
'↑以順序輸入模式開啟 檔案
https://learn.microsoft.com/en-u ... help/open-statement
Print #1, PP
'↑將顯示格式化資料 覆蓋舊資料寫入檔案
https://learn.microsoft.com/zh-t ... help/printstatement
Close #1
'↑關閉檔案
MsgBox "文字檔已建立:" & xFile
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 20# 准提部林


    請教前輩
1.Format(Arr(i, Cn(1)), "00000000000;;#")是指  [正數;負數;0;本文]
1.1.如果Arr(i, Cn(1))值是正數就以11位數呈現(不足部分用0填充在左側)
1.2.如果Arr(i, Cn(1))值是負數就以空格呈現
是這樣的意義嗎?

2.請教前輩這最後的  ;# 是什麼意思?

謝謝前輩
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 23# Andy2483

只對"正數"及"零值"做規範, 零值為"空", 試試儲存格設為"#", 再輸入0
若也要將"負數"變成空字串
MsgBox Format(-1500, "00000000000;"""";#")
但對第四參數"文字"的顯示方式無法變更,
最理想還是用APPLICATION.TEXT(數字或文字, "正;負;0;文字")

TOP

本帖最後由 Andy2483 於 2023-11-3 07:27 編輯

回復 24# 准提部林


    謝謝前輩,請前輩再指導
1. 後學學到的是 ;; 兩個分號代表的是跳過負數的判斷,直接判斷是不是0
2.後學對 # 符號在Format()裡的意義不了解
例如:Format(Arr(i, Cn(1)), "00000000000;;""""") 與
Format(Arr(i, Cn(1)), "00000000000;;#")
這兩個有何不同?

'==========================================
學習補充:
(#)數字預留位置。 會顯示數字或不顯示任何項目。 如果運算式有數字位在格式字串中出現 # 的位置,
則顯示該字元;否則在該位置不顯示任何項目。 此符號的作用就像 0 數字預留位置,不同之處在於,
如果在格式運算式中,數字在小數分隔符號任一邊的位數,與 # 字元的位數相同或更少,
則不會顯示前置零或行尾零。
https://learn.microsoft.com/zh-t ... ic-for-applications

謝謝論壇,謝謝各位前輩
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2023-11-3 09:18 編輯

回復 24# 准提部林


    謝謝前輩指導,以下Application.Text()學習心得如下,請前輩再指導

Option Explicit
'最理想還是用APPLICATION.TEXT(數字或文字,"正;負;0;文字")
'VBA中呼叫工作表中的TEXT函數

Sub TEST_Text_1區段()
MsgBox Application.Text(10, "0000")
MsgBox Application.Text(-1.2, "0000")
MsgBox Application.Text(0, "0000")
End Sub

Sub TEST_Text_2區段()
MsgBox Application.Text(0, "000;-0.00")
MsgBox Application.Text(10, "000;-0.00")
MsgBox Application.Text(9999, "000;-0.00")
MsgBox Application.Text(-1, "000;-0.00")
MsgBox Application.Text(-10.1111, "000;-0.00")
End Sub

Sub TEST_Text_3區段()
MsgBox Application.Text(0, "000;-0.00;0")
MsgBox Application.Text(10, "000;-0.00;0")
MsgBox Application.Text(9999, "000;-0.00;0")
MsgBox Application.Text(-1, "000;-0.00;0")
MsgBox Application.Text(-10.1111, "000;-0.00;0")
MsgBox Application.Text(-10.1111, "000;倒扣了;0")
End Sub
Sub TEST_Text_4區段()
MsgBox Application.Text(0, "0000;-0.00;零;輸入錯誤")
MsgBox Application.Text(10, "0000;-0.00;零;輸入錯誤")
MsgBox Application.Text(9999, "0000;-0.00;零;輸入錯誤")
MsgBox Application.Text(-1, "0000;-0.00;零;輸入錯誤")
MsgBox Application.Text(-10.1111, "0000;-0.00;零;輸入錯誤")
End Sub

Sub TEST_Text_4區段_0()
MsgBox Application.Text(0, "0000;-0.00;;輸入錯誤")
MsgBox Application.Text(0, "0000;-0.00;0;輸入錯誤")
MsgBox Application.Text(0, "0000;-0.00;#;輸入錯誤")
MsgBox Application.Text(0, "0000;-0.00;取消;輸入錯誤")
MsgBox Application.Text("0o", "0000;-0.00;零;輸入錯誤")
'↑APPLICATION.TEXT(數字或文字,"正值格式;負值格式;想要的文字格式1;想要的文字格式2")
'如果 數字或文字是正數 ,令以正值格式回傳
'否則如果 數字或文字是負數,令負值格式回傳
'否則如果 數字或文字是0,令以想要的文字格式1回傳
'否則如果前面3個條件都不成立,令以想要的文字格式2回傳

End Sub

==============================================
在儲存格格式應用的方式如下:
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 忘功不忘過,忘怨不忘恩。
返回列表 上一主題