我正在处理一个宏,它将遍历活动工作簿中的所有工作表,然后根据工作表名称中是否包含其中一个相关关键字来清除特定工作表的某个部分。在每种情况下,工作表名称都会有所不同,但我要清除的任何内容都将包含以下关键词之一。
我已经设置了一个单独的宏来清除每种情况下的单元格范围。如果工作表名称不包含任何关键字,我希望宏移动到下一个工作表。
我的最终目标是能够将其应用于众多不同的工作簿,因为我正在处理的项目按区域划分,每个区域都有一个单独的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
答案 0 :(得分:0)
您的问题是您正在浏览工作表的编号,但您只是检查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
关键字,您只需按上述方式调用潜在客户。
比拥有多个宏更好的选择可能是创建像
这样的通用子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
正如评论中所建议的,您可以放弃索引工作表,然后循环遍历工作表对象:
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