- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
22#
發表於 2023-11-2 11:38
| 只看該作者
本帖最後由 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 |
|