Board logo

標題: [發問] 工作表選取 VBA語法 [打印本頁]

作者: PJChen    時間: 2019-5-23 00:13     標題: 工作表選取 VBA語法

各位先進好,

我在許多範例中看到的,都是從第N個工作表開始起算至最後一個,不知是否有以下的方式可用的語法?
2種選取的類型的語法,要如何寫法?
1. 從Sheets("2")的工作表名稱(不是從第2個工作表開始數),一直到最後一個工作表選取起來
2. 從Sheets("2")開始至Sheet("總表")結束,之間的起迄範圍工作表選取起來
然後將Range(B2:C3)值化(讓公式變成值)
作者: GBKEE    時間: 2019-5-23 08:11

試試看
  1. Option Explicit
  2. Sub EX() '**1. 從Sheets("2")的工作表名稱(不是從第2個工作表開始數),一直到最後一個工作表選取起來
  3.     Dim Sh As Worksheet, Ar, M As String
  4.     For Each Sh In Sheets
  5.         If Sh.Name = "2" Then
  6.             M = Sh.Name
  7.         ElseIf M <> "" Then
  8.             M = M & "," & Sh.Name
  9.         End If
  10.         '**Range(B2:C3)值化(讓公式變成值)
  11.         If M <> "" Then Sh.Range("B2:C3") = Sh.Range("B2:C3").Value
  12.     Next
  13.     Ar = Split(M, ",")
  14.     Sheets(Ar).Select
  15. End Sub

  16. Sub EX1() '**2. 從Sheets("2")開始至Sheet("總表")結束,之間的起迄範圍工作表選取起來
  17.     Dim Sh As Worksheet, Ar, M As String
  18.     For Each Sh In Sheets
  19.         If Sh.Name = "2" Then
  20.             M = Sh.Name
  21.         ElseIf M <> "" Then
  22.             M = M & "," & Sh.Name
  23.         End If
  24.         '**Range(B2:C3)值化(讓公式變成值)
  25.         If M <> "" Then Sh.Range("B2:C3") = Sh.Range("B2:C3").Value
  26.         If Sh.Name = "總表" Then Exit For
  27.     Next
  28.     Ar = Split(M, ",")
  29.     Sheets(Ar).Select
  30. End Sub
複製代碼
回復 1# PJChen
作者: PJChen    時間: 2019-5-26 21:38

回復 2# GBKEE

G大好,
目前我先測試第一個程式,從工作表2一直到最後一個工作表的選取,並且加上一些我需要的功能:
1. 工作表以數字命名的為1~31,但其中也有用文字命名的,我需要讓程式自動判讀數字命名的工作表,當月份沒有31日(or 例如2月沒有29~31時),可以先將多餘的工作表刪除(但要略過文字命名的工作表)
2. 再將指定的範圍值化
但執行時出現"執行階段錯誤13,型態不符合",請問我需要修改什麼地方?
  1. Sub 選取工作表() '**1. 從Sheets("2")的工作表名稱(不是從第2個工作表開始數),一直到最後一個工作表選取起來
  2.     Dim W As Workbook, xSh As Worksheet, Sh As Worksheet, Ar, M As String
  3.     Set W = Workbooks("Bifido_八堵 _6月.xlsx")
  4.     Set xSh = W.Sheets("31")
  5.     xSh.Delete
  6.     For Each Sh In Sheets
  7.         If Sh.Name = "2" Then
  8.             M = Sh.Name
  9.         ElseIf M <> "" Then
  10.             M = M & "," & Sh.Name
  11.         End If
  12.         '**Range(B2:C3)值化(讓公式變成值)
  13.         If M <> "" Then Sh.Range("B2") = Sh.Range("B2").Value
  14.     Next
  15.     Ar = Split(M, ",")
  16.     Sheets(Ar).Select
  17. End Sub
複製代碼

作者: GBKEE    時間: 2019-5-27 09:07

回復 3# PJChen


試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sh As Worksheet, xday(1 To 2) As Integer, Msg As Boolean, Ar
  4.     xday(1) = 4            '**指定開始日
  5.     xday(2) = Day(DateSerial(Year(Date), Month(Date) + 1, 0))  '**月底日
  6.     Application.DisplayAlerts = False
  7.     For Each Sh In Sheets
  8.         Msg = True
  9.         If IsNumeric(Sh.Name) And Val(Sh.Name) > xday(2) Then
  10.             Msg = False
  11.             Sh.Delete
  12.         ElseIf IsNumeric(Sh.Name) And Val(Sh.Name) < xday(1) Then
  13.             Msg = False
  14.         End If
  15.         If Msg Then Ar = Ar & "," & Sh.Name: Sh.[B2] = Sh.[B2].Value
  16.     Next
  17.     Ar = Split(Mid(Ar, 2), ",")
  18.     Sheets(Ar).Select
  19.     Application.DisplayAlerts = True
  20. End Sub
複製代碼

作者: PJChen    時間: 2019-5-27 18:27

回復 4# GBKEE

G大好,

程式測試結果:
1.可以將B2值化,但無法將多餘工作表刪除
2. 另外,每月會提前做下個月的工作表(例如:現在就要預做6月份),所以我修改以下,並同時測試,Month(6) + 1無論有無加1,都同樣結果,無法將多餘工作表刪除
請再幫忙看下程式,感謝....
    xday(2) = Day(DateSerial(Year(Date), Month(6) + 1, 0))   '**指定月,月底日

[attach]30683[/attach]
作者: PJChen    時間: 2019-5-28 15:45

回復 5# PJChen


G大好,
我將路徑的資料夾+程式檔 已附上[attach]30700[/attach]




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