Excel VBA跨越工作表的dynamic范围运行macros

作为最后一个问题的延伸,我试图在所有工作表中运行一个macros,你们成功帮助我做到这一点。 我被告知,工作表名称不能硬编码,所以我将不得不修改我目前的解决scheme。

Sub RemoveCarriageReturns() Dim MyRange As Range Dim NameList() As Variant NameList = Array("OTCUEXTR", "OTFBCUDS", "OTFBCUEL") Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For i = 0 To 2 With Worksheets(NameList(i)) For Each MyRange In .UsedRange If 0 < InStr(MyRange, Chr(10)) Then MyRange = Replace(MyRange, Chr(10), "") End If Next MyRange End With Next i Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 

我已经尝试使用For循环来收集每个工作表的名称,但是我觉得在2天后,我茫然地盯着这个,我有限的VBA知识已经用完了,我卡住了,我真的很感激一些关于如何让这个macros可以在数量和名称上发生变化的表单上工作。

很高兴在评论中提供您需要的更多信息

你可以这样做(或者可以使用原始代码中的索引)。

 Sub RemoveCarriageReturns() Dim MyRange As Range Dim ws As Worksheet Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For Each ws In Worksheets With ws For Each MyRange In .UsedRange If 0 < InStr(MyRange, Chr(10)) Then MyRange = Replace(MyRange, Chr(10), "") End If Next MyRange End With Next ws Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 
 Public Function GetSheetNames(ByVal wbk As workbook) As String() Dim names() As String Dim count As Integer Dim i As Integer count = wbk.Worksheets.count ReDim names(count - 1) For i = 1 To wbk.Worksheets.count names(i - 1) = wbk.Worksheets(i).Name Next GetSheetNames = names End Function 

用法: GetSheetNames(Application.ActiveWorkbook)

更新:仅对于选定的工作表:

 Public Function GetActiveSheetNames(ByVal wbk As workbook) As String() Dim names() As String Dim count As Integer Dim i As Integer count = wbk.Windows(1).SelectedSheets.count ReDim names(count - 1) For i = 1 To wbk.Windows(1).SelectedSheets.count names(i - 1) = wbk.Windows(1).SelectedSheets(i).Name Next GetActiveSheetNames = names End Function