Vba Excel 2016删除随着年份变化而更改名称的多个选项卡

Vba Excel 2016删除随着年份变化而更改名称的多个选项卡,vba,excel,Vba,Excel,我有一个每年使用的工作簿,每年都会更改。例如,一年的工作表是1月1日、1月15日、1月29日、2月12日等等,明年的工作表是1月2日、1月16日、1月30日、2月13日等等。每年年底,我需要删除这些工作表,然后从模板工作表中复制新的工作表。因此,正如您所知,工作表的名称每年都在变化,我希望一次删除所有工作表,而不是留下错误的空间。所以我录制了一个vba脚本,但是我找不到一种方法来删除所有的工作表,这些工作表是一月*、二月*、三月*、四月*等等。下面是一个例子,我有什么,但不工作 Sub Macr

我有一个每年使用的工作簿,每年都会更改。例如,一年的工作表是1月1日、1月15日、1月29日、2月12日等等,明年的工作表是1月2日、1月16日、1月30日、2月13日等等。每年年底,我需要删除这些工作表,然后从模板工作表中复制新的工作表。因此,正如您所知,工作表的名称每年都在变化,我希望一次删除所有工作表,而不是留下错误的空间。所以我录制了一个vba脚本,但是我找不到一种方法来删除所有的工作表,这些工作表是一月*、二月*、三月*、四月*等等。下面是一个例子,我有什么,但不工作

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

这将根据图纸名称的前三个字符删除所有图纸

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

这将根据图纸名称的前三个字符删除所有图纸

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

下面的代码将在所有工作表中循环,选中的是
工作表。Name
前3个字母等于
MonthsArr
数组中的一个月。使用
Match
功能,在没有循环的情况下进行比较

注意:我保留“Dec 31”工作表,否则删除所有工作表将导致运行时错误。如果有其他图纸,则可以删除带有
的零件,如果图纸名称为“Dec 31”,则可以删除

代码

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
选项显式
子数据表()
将sht变暗为工作表
Dim MonthsArr作为变体
MonthSAR=数组(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”)
Application.DisplayAlerts=False
对于工作表中的每个sht
'使用匹配函数查看前3个字母是否在月份数组中
如果不是IsError(Application.Match(左(sht.Name,3),MonthsArr,0)),则
'不要删除最后一个日期表,删除工作簿中的所有工作表将引发运行时错误
如果短名称为“12月31日”,则
删去
如果结束
如果结束
下一步
Application.DisplayAlerts=True
端接头

下面的代码将在所有工作表中循环,选中的是
工作表。Name
前3个字母等于
MonthsArr
数组中的一个月。使用
Match
功能,在没有循环的情况下进行比较

注意:我保留“Dec 31”工作表,否则删除所有工作表将导致运行时错误。如果有其他图纸,则可以删除带有
的零件,如果图纸名称为“Dec 31”,则可以删除

代码

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
选项显式
子数据表()
将sht变暗为工作表
Dim MonthsArr作为变体
MonthSAR=数组(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”)
Application.DisplayAlerts=False
对于工作表中的每个sht
'使用匹配函数查看前3个字母是否在月份数组中
如果不是IsError(Application.Match(左(sht.Name,3),MonthsArr,0)),则
'不要删除最后一个日期表,删除工作簿中的所有工作表将引发运行时错误
如果短名称为“12月31日”,则
删去
如果结束
如果结束
下一步
Application.DisplayAlerts=True
端接头

这里有一个go-in-one-loop和一个delete语句(可以加快代码的速度):


注意-如果您的另一个工作表名称在
sMonList
中有左3个字母,则此操作可能会失败,但我相信您可以根据需要进行调整。

这里有一个go-in-one-loop和一个delete语句(可加快代码速度):


注意-如果您的另一个工作表名称在
sMonList
中有左3个字母,则此操作可能会失败,但我相信您可以根据需要进行调整。

那么为什么不改为使用数字索引呢?伪代码:
While Sheets.Count>0删除工作表[0]
应该可以。@Brad Tostenson你会对你在这里得到的答案给出一些反馈吗?他们中的一个(或全部)帮助过你吗?我很抱歉耽搁了你,因为假期和所有的事情,我不能及时赶到这里,看看所有的解决办法。到目前为止,他们都工作过,除了喜欢最后一个的优雅和速度外,他们都完成了任务。非常感谢大家。为什么不用数字索引来代替呢?伪代码:
While Sheets.Count>0删除工作表[0]
应该可以。@Brad Tostenson你会对你在这里得到的答案给出一些反馈吗?他们中的一个(或全部)帮助过你吗?我很抱歉耽搁了你,因为假期和所有的事情,我不能及时赶到这里,看看所有的解决办法。到目前为止,他们都工作过,除了喜欢最后一个的优雅和速度外,他们都完成了任务。非常感谢大家。斯科特,我想你们累了,
在sht中的每一个sht
?此外,您需要保留
“Dec 31”
工作表,否则删除所有工作表将引发运行时问题error@ShaiRado我的猜测是,删除所有工作表后,会留下一个模板工作表。正是从这个模板中填充了下一年。Scott您是对的,这里有一个模板表。这个解决方案对我也很管用。斯科特,我想你累了,
对于sht中的每个sht
?此外,您需要保留
“Dec 31”
工作表,否则删除所有工作表将引发运行时问题error@ShaiRado我的猜测是,删除所有工作表后,会留下一个模板工作表。正是从这个模板中填充了下一年。Scott您是对的,这里有一个模板表。这个解决方案对我也很有效。不用GoTo,你可以只使用
如果sht.Name“Dec 31”,然后使用sht.Delete
,如果它被命名为
Dec 31
,你可以只使用
如果sht.Name“Dec 31”,然后使用sht.Delete
,这将有效地跳过工作表