Board logo

標題: [發問] 激活工作表的問題 [打印本頁]

作者: dou10801    時間: 2023-5-29 13:52     標題: 激活工作表的問題

範本中如無此工作表就新增,如已存在的工作表就將擷取數據傳至[存在工作表],為何不行.
ms1="銷匯3月"
WORKSHEETS(MS1)............這個不行.
作者: Andy2483    時間: 2023-5-29 16:09

回復 1# dou10801


    謝謝論壇,謝謝前輩發表此主題與範例
後學藉此帖練習陣列,學習方案如下,請前輩參考


Option Explicit
Sub TEST()
Application.DisplayAlerts = False
Dim Brr, R&, i&, j&, Nsht$, Sht, M
Sht = Application.InputBox("請輸入銷匯或進匯", "工作表名稱", "銷匯", , , , , 2)
If InStr("銷匯/進匯", Sht) = 0 Then Exit Sub Else Nsht = Sht: Set Sht = Sheets(Sht)
M = Application.InputBox("請輸入月份", "工作表名稱", 3, , , , , 2)
If Val(M) = 0 Then Exit Sub Else Nsht = Nsht & M & "月"
Brr = Range(Sht.[P1], Sht.[A65536].End(3))
For i = 1 To UBound(Brr)
   If Format(Brr(i, 2), "M") <> Val(M) And i <> 1 Then GoTo i01
   R = R + 1: For j = 1 To 16: Brr(R, j) = Brr(i, j): Next
i01: Next
On Error Resume Next
Sheets(Nsht).Delete
With Worksheets.Add(after:=Worksheets(Sheets.Count))
   .Name = Nsht
   .[A1].Resize(R, 16) = Brr
   .Columns(2).NumberFormatLocal = "yyyy-m-d"
   .EntireColumn.AutoFit
End With
Erase Brr: Set Sht = Nothing
End Sub
作者: Andy2483    時間: 2023-5-30 07:38

本帖最後由 Andy2483 於 2024-1-17 20:06 編輯

謝謝論壇,謝謝各位前輩
後學藉此帖複習昨天的方案,方案學習心得註解如下,請各位前輩指教

Option Explicit
Sub TEST()
Application.DisplayAlerts = False
'↑令不要再跳出詢問窗(問真的要刪除工作表嗎?),直接刪了!
Dim Brr, R&, i&, j&, Nsht$, Sht, M
'↑宣告變數
Sht = Application.InputBox("請輸入銷匯或進匯", "工作表名稱", "銷匯", , , , , 2)
'↑令Sht變數是 輸入窗的回傳結果
If InStr("銷匯/進匯", Sht) = 0 Then Exit Sub Else Nsht = Sht: Set Sht = Sheets(Sht)
'↑如果InStr()回傳 Sht變數不包含在字串裡!就結束程式,否則
'否則就令Nsht變數(字串)是 sht變數值,令Sht變數是名為 Sht變數的工作表
M = Application.InputBox("請輸入月份", "工作表名稱", 3, , , , , 2)
'↑令M變數是 輸入窗的回傳結果
If Val(M) = 0 Then Exit Sub Else Nsht = Nsht & M & "月"
'↑如果InStr()回傳值轉化為數值後是 0!就結束程式,否則
'否則令Nsht變數後面再連接 M變數,再連接 "月",成為新字串

Brr = Range(Sht.[P1], Sht.[A65536].End(3))
'↑令Brr變數是 二維陣列,以Sht變數(工作表)的A~P欄儲存格值帶入陣列中
For i = 1 To UBound(Brr)
'↑設順迴圈!
   If Format(Brr(i, 2), "M") <> Val(M) And i <> 1 Then GoTo i01
   '↑如果第2欄陣列值(日期)月份 不同於M變數轉化為的數值,
   '而且i變數不是1,就跳到標示i01的位置繼續執行

   R = R + 1: For j = 1 To 16: Brr(R, j) = Brr(i, j): Next
   '↑令R變數記錄結果資料要放在第幾列,
   '設順迴圈,將結果資料覆蓋掉原陣列資料,寫入符合條件的資料

i01: Next
On Error Resume Next
'↑令程序遇到錯誤不停下來,繼續進行下個程序
Sheets(Nsht).Delete
'↑令刪除名為 Nsht變數的工作表(如果沒有此工作表可刪除,會跳過)
With Worksheets.Add(after:=Worksheets(Sheets.Count))
'↑以下是關於在索引最後新增一個工作表的程序
   .Name = Nsht
   '↑令工作表名字是 Nsht變數所帶的字串
   .[A1].Resize(R, 16) = Brr
   '↑令[A1]儲存格擴展適當範圍寫入Brr陣列值,超過此範圍的陣列值忽略
   .Columns(2).NumberFormatLocal = "yyyy-m-d"
   '↑令B欄格式依照設定方式顯示
   .EntireColumn.AutoFit
   '↑令這範圍欄位自動調整欄寬
End With
Erase Brr: Set Sht = Nothing
'↑令釋放變數
End Sub
作者: dou10801    時間: 2023-6-2 09:16

回復 3# Andy2483
感謝 Andy2483 收下學習.




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