【问题标题】:Excel VBA run macro across dynamic range of sheetsExcel VBA 在工作表的动态范围内运行宏
【发布时间】:2018-04-28 12:28:20
【问题描述】:

作为我问的最后一个问题的扩展,我正在尝试在所有工作表中运行一个宏,你们成功地帮助我做到了。 我被告知无法对工作表名称进行硬编码,因此我将不得不修改我当前的解决方案。

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 知识已经用完了,我被困住了,我真的很感激有关如何使此宏在数量和名称可能发生变化的工作表范围内工作的指针。

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

【问题讨论】:

  • 您是指工作簿中的所有工作表,还是选择?
  • @sjr 所有的工作表。

标签: vba excel


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 感谢您的回答,我选择了另一个,因为它更简单一些,我必须向那些对 VBA 了解得比我还少的人解释一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2019-03-10
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多