2016-12-30 58 views
0

我有一個工作簿,每年使用每年更改一年,例如工作表爲1月1日,1月15日,1月29日,2月12日等,明年有1月2日,1月16日,1月30日,2月13日等工作表。那麼每年在每年年底,我都需要刪除這些工作表,然後從模板工作表中複製新的工作表。因此,您可以每年更改工作表的名稱,我希望一次刪除所有工作表,而不會留下任何錯誤空間。所以我錄製了一個vba腳本,但我找不到一種方法來刪除所有Jan *,Feb *,Mar *,Apr *等工作表。下面是我有的但不起作用的例子。Excel 2016刪除多個選項卡,根據年份更改更改名稱

Sub Macro1() 
' 
' Macro1 Macro 
' 
    Sheets(Array("Jan 16", "Jan 30", "Feb 13", "Feb 27", "Mar 12", "Mar 26", "Apr 9", _ 
     "Apr 23", "May 7", "May 21", "Jun 4", "Jun 18", "Jul 2", "Jul 16", "Jul 30", "Aug 13", _ 
     "Aug 27", "Sep 10", "Sep 24", "Oct 8", "Oct 22", "Nov 5", "Nov 19", "Dec 3", "Dec 31")) _ 
     .Select 
    Sheets("Dec 31").Activate 
    Sheets("Dec 17").Select Replace:=False 
    ActiveWindow.SelectedSheets.Delete 
End Sub 
+0

那麼,爲什麼不用數字指標呢?僞代碼:'雖然Sheets.Count> 0刪除表格[0]'應該可以工作。 –

+0

@Brad Tostenson你會給你一些答案嗎?他們中的一個(或全部)是否幫助過你? –

+0

對於延誤,我很抱歉,假期和所有我無法及時到達這裏看到所有的解決方案。到目前爲止,他們都有工作,除了喜歡最後一個,因爲它的優雅和速度,他們都完成了任務。非常感謝你。 –

回答

1

這裏有一個循環,一個delete語句一去(這將加快代碼):

Sub DeleteSheets() 

Dim sMonList As String 
sMonList = "JanFebMarAprMayJunJulAugSepOctNovDec" 

Dim ws As Worksheet 
For Each ws In ThisWorkbook.Worksheets 
    Dim sNames As String 
    If InStr(sMonList, Left(ws.Name, 3)) Then sNames = sNames & "," & ws.Name 
Next 

Dim vSheets As Variant 
vSheets = Split(Mid(sNames, 2), ",") 

Application.DisplayAlerts = False 
Worksheets(vSheets).Delete 
Application.DisplayAlerts = True 

End Sub 

注: - 如果您有其他工作表名稱在sMonList中有左3個字母,但這可能會失敗,但我相信您可以根據需要進行調整。

+0

這工作得很好,因爲我沒有任何其他工作表中的月份名稱,使用此代碼沒有問題。 –

1

這將根據表單名稱的前三個字符刪除所有表單。

Sub deleteshts() 
Dim sht As Worksheet 
Dim monArr(), mon 

monArr = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") 

For Each sht In ThisWorkbook.Worksheets 
    For Each mon In monArr 
     If Left(sht.name, 3) = mon Then 
      Application.DisplayAlerts = False 
      sht.Delete 
      Application.DisplayAlerts = True 
      Exit For 
     End If 
    Next mon 
Next sht 
End Sub 
+1

斯科特,我覺得你很累,'對於每個人來說都很難過?此外,您需要保留''Dec 31「'工作表,否則刪除所有工作表將會引發運行時錯誤 –

+0

@ShaiRado我猜想在刪除所有工作表後,仍然存在一個模板工作表。來自這個模板的是下一年的人口。 –

+0

斯科特你是正確的有一個模板表。這個解決方案也適用於我。 –

4

通過所有片材下面將循環的代碼,並檢查是Sheet.Name前3個字母等於內部MonthsArr陣列的月份中的一個。使用Match函數比較沒有循環。

注意:我保持「12月31日」片,否則刪除所有表將引發運行時錯誤。如果還有其他工作表,可以刪除If sht.Name <> "Dec 31" Then的零件。

代碼

Option Explicit 

Sub DelAllSheets() 

Dim sht As Worksheet 
Dim MonthsArr As Variant 

MonthsArr = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") 

Application.DisplayAlerts = False 
For Each sht In Worksheets 

    ' use Match function to see if first 3 letters are inside the Month Array 
    If Not IsError(Application.Match(Left(sht.Name, 3), MonthsArr, 0)) Then 
     ' don't delete the last date sheet, deleting all sheets in the workbook will raise a run-time error 
     If sht.Name <> "Dec 31" Then     
      sht.Delete 
     End If 
    End If 

Next sht 
Application.DisplayAlerts = True 

End Sub 
+2

而不是使用GoTo你可以使用'如果sht.Name <>「Dec 31」那麼sht.Delete'如果它被命名爲'Dec 31',將會有效地跳過表單 –

+0

你說得對,我也很累: ) –