【问题标题】:Using active sheet instead of using sheet name Public / Private Sub code使用活动工作表而不是使用工作表名称公共/私人子代码
【发布时间】:2021-10-02 05:28:44
【问题描述】:

我想使用下面的代码,而不必在公共子函数中的 Sheets("Sheet1").Activate 中写出工作表名称,因此我只需单击工作表并运行代码。我不熟悉 VBA 语言,这应该是一个简单的修复,但是经过一个小时的尝试,我无法让它工作,所以我现在在这里问。此外,当我删除 Sheets("Sheet1").Activate 时,缩写表将被激活,因此该函数不会在该表上运行,而不是在我想要的表上运行。任何帮助将不胜感激!

Public gcolWords As New Collection

Public Sub ReplaceAllWrds()
Dim vWord, vAbv, itm
Dim i As Integer
Dim Lastrow As Integer

LoadAbbrevs

Sheets("Sheet1").Activate
Lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Range("F" & Lastrow).Select
For Each itm In gcolWords
   i = InStr(itm, ":")
   vWord = Left(itm, i - 1)
   vAbv = Mid(itm, i + 1)
   Replace1Wrd vWord, vAbv
Next
Set gcolWords = Nothing
End Sub

Private Sub Replace1Wrd(ByVal pvWrd, pvAbv)
On Error Resume Next


    Selection.Replace What:=pvWrd, Replacement:=pvAbv, LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

Private Sub LoadAbbrevs()
Dim vWord, vAbv, vItm

Sheets("abbrevs").Activate
Range("A2").Select
While ActiveCell.Value <> ""
   vWord = ActiveCell.Offset(0, 0).Value
   vAbv = ActiveCell.Offset(0, 1).Value
   vItm = vWord & ":" & vAbv
   
   gcolWords.Add vItm
   ActiveCell.Offset(1, 0).Select   'next row
Wend
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    你应该定义一个指向ActiveSheetExcel.Worksheet,然后用它来保留引用:

    Public Sub ReplaceAllWrds()
        Dim vWord, vAbv, itm
        Dim i As Integer
        Dim Lastrow As Integer
        Dim ws As Excel.Worksheet
        
        Set ws = ActiveSheet
        
        LoadAbbrevs
    
        ws.Activate
        'MsgBox "The name of the ws sheet is " & ws.Name
        Lastrow = ws.Cells(Rows.Count, 1).End(xlUp).Row
        Range("F" & Lastrow).Select
        For Each itm In gcolWords
           i = InStr(itm, ":")
           vWord = Left(itm, i - 1)
           vAbv = Mid(itm, i + 1)
           Replace1Wrd vWord, vAbv
        Next
        Set gcolWords = Nothing
    End Sub
    

    请注意,您可以使用工作表对象查看您的代码;这样就可以直接通过Worksheet引用进行操作,操作时不需要激活sheet。

    【讨论】:

      【解决方案2】:

      如果您使用工作表对象,则无需激活工作表。

      Dim ws As Excel.Worksheet
      Set ws = ThisWorkbook.Sheets("Sheet1")
      ws.Cells(1,1).Value = "Example"
      

      使用工作表对象可以加快您的代码速度,您无需担心哪个工作表处于活动状态。

      以下是您的LoadAbbrevs 的简单示例。

      Sub Example()
      Dim WS as Worksheet
      Set WS = ThisWorkbook.Sheets("abbrevs")
      Dim RowIndex as Integer
      RowIndex = 2
      While WS.Cells(RowIndex, 2).Value <> ""
          gcolWords.add WS.Cells(RowIndex, 2).Value + ":" + WS.Cells(RowIndex, 3).Value
          RowIndex = RowIndex + 1
      Wend
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 2017-06-24
        • 2017-07-12
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        相关资源
        最近更新 更多