VBA 根据工作表名称的一部分调用不同宏的代码
VBA code to call different macro depending on part of Worksheet name
我正在开发一个宏,它将循环浏览活动工作簿中的所有工作表,然后根据工作表名称中是否包含相关关键字之一来清除特定工作表的特定部分。在每种情况下,工作表名称都会不同,但我要清除的任何工作表名称都将包含以下关键字之一。
我已经设置了一个单独的宏来清除每种情况下的单元格范围。如果工作表名称不包含任何关键字,我希望宏移动到下一个工作表。
我的最终目标是能够将其应用于许多不同的工作簿,因为我正在处理的项目按地区划分,每个地区有一个单独的 Excel 文件。
我一直在尝试的代码如下。当我 运行 代码时没有出现错误,代码似乎也没有 运行,实际上什么都没有发生!
任何指导或建议将不胜感激。
Sub Loop_Customer_Sheets()
Dim ws As Integer
Dim i As Integer
ws = ActiveWorkbook.Worksheets.Count
For i = 1 To ws
If ActiveSheet.Name Like "*ABC*" Then
Call ABCInfoClear
ElseIf ActiveSheet.Name Like "*DEF*" Then
Call DEFInfoClear
ElseIf ActiveSheet.Name Like "*GHI*" Then
Call GHIInfoClear
Else:
End If
Next i
End Sub
“什么都没有发生”- 用您的代码修复问题:
您的问题是您正在循环 sheet 的 号 ,但您只检查 ActiveSheet
,它永远不会改变!将您的代码替换为
ws = ActiveWorkbook.Worksheets.Count
For i = 1 To ws
With ActiveWorkbook.WorkSheets(i)
If .Name Like "*ABC*" Then
ABCInfoClear
ElseIf .Name Like "*DEF*" Then
DEFInfoClear
ElseIf ActiveSheet.Name Like "*GHI*" Then
GHIInfoClear
End If
End With
Next i
注意:您不需要 Call
关键字,您可以像上面介绍的那样调用 subs。
替代解决方案
比拥有大量宏更好的选择可能是创建一个通用子类
Sub ClearRangeInSheet(rangeAddress As String, sh As WorkSheet)
Dim myRange As Range
Set myRange = sh.Range(rangeAddress)
myRange.ClearContents
' Any other cell clearing code e.g. for formatting here
End Sub
然后循环调用
Dim wsCount as Long
wsCount = ActiveWorkbook.WorkSheets.Count
For i = 1 to wsCount
With ActiveWorkbook
If .WorkSheets(i).Name Like "*ABC*" Then
' Always pass ".WorkSheets(i)", but change the range address as needed
ClearRangeInSheet("A1:A20", .WorkSheets(i))
ElseIf ' Other worksheet name conditions ...
End If
End With
Next I
正如评论中所建议的那样,您可以放弃 索引 sheets,而只循环遍历 sheet 对象本身:
Dim wksht as WorkSheet
For Each wksht In ActiveWorkbook.WorkSheets
If wksht.Name Like "*ABC*" Then
' Always pass wksht but change the range address as needed
ClearRangeInSheet("A1:A20", wksht)
ElseIf ' Other worksheet name conditions ...
End If
Next wksht
我正在开发一个宏,它将循环浏览活动工作簿中的所有工作表,然后根据工作表名称中是否包含相关关键字之一来清除特定工作表的特定部分。在每种情况下,工作表名称都会不同,但我要清除的任何工作表名称都将包含以下关键字之一。
我已经设置了一个单独的宏来清除每种情况下的单元格范围。如果工作表名称不包含任何关键字,我希望宏移动到下一个工作表。
我的最终目标是能够将其应用于许多不同的工作簿,因为我正在处理的项目按地区划分,每个地区有一个单独的 Excel 文件。
我一直在尝试的代码如下。当我 运行 代码时没有出现错误,代码似乎也没有 运行,实际上什么都没有发生!
任何指导或建议将不胜感激。
Sub Loop_Customer_Sheets()
Dim ws As Integer
Dim i As Integer
ws = ActiveWorkbook.Worksheets.Count
For i = 1 To ws
If ActiveSheet.Name Like "*ABC*" Then
Call ABCInfoClear
ElseIf ActiveSheet.Name Like "*DEF*" Then
Call DEFInfoClear
ElseIf ActiveSheet.Name Like "*GHI*" Then
Call GHIInfoClear
Else:
End If
Next i
End Sub
“什么都没有发生”- 用您的代码修复问题:
您的问题是您正在循环 sheet 的 号 ,但您只检查 ActiveSheet
,它永远不会改变!将您的代码替换为
ws = ActiveWorkbook.Worksheets.Count
For i = 1 To ws
With ActiveWorkbook.WorkSheets(i)
If .Name Like "*ABC*" Then
ABCInfoClear
ElseIf .Name Like "*DEF*" Then
DEFInfoClear
ElseIf ActiveSheet.Name Like "*GHI*" Then
GHIInfoClear
End If
End With
Next i
注意:您不需要 Call
关键字,您可以像上面介绍的那样调用 subs。
替代解决方案
比拥有大量宏更好的选择可能是创建一个通用子类
Sub ClearRangeInSheet(rangeAddress As String, sh As WorkSheet)
Dim myRange As Range
Set myRange = sh.Range(rangeAddress)
myRange.ClearContents
' Any other cell clearing code e.g. for formatting here
End Sub
然后循环调用
Dim wsCount as Long
wsCount = ActiveWorkbook.WorkSheets.Count
For i = 1 to wsCount
With ActiveWorkbook
If .WorkSheets(i).Name Like "*ABC*" Then
' Always pass ".WorkSheets(i)", but change the range address as needed
ClearRangeInSheet("A1:A20", .WorkSheets(i))
ElseIf ' Other worksheet name conditions ...
End If
End With
Next I
正如评论中所建议的那样,您可以放弃 索引 sheets,而只循环遍历 sheet 对象本身:
Dim wksht as WorkSheet
For Each wksht In ActiveWorkbook.WorkSheets
If wksht.Name Like "*ABC*" Then
' Always pass wksht but change the range address as needed
ClearRangeInSheet("A1:A20", wksht)
ElseIf ' Other worksheet name conditions ...
End If
Next wksht