2016-12-30 29 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

你说得对,我也很累: ) –