【问题标题】:Associate a Module to a worksheet将模块关联到工作表
【发布时间】:2020-06-04 14:32:31
【问题描述】:

我有这个模块来运行 工作表 B 中的一些事件。此模块中使用的所有 Range 均指 工作表 B 中的那些单元格。

但是,我想将运行此模块的按钮放在 工作表 A 中。是否有单行标题代码或要添加的内容,以便所有 Range 始终引用 Worksheet B 中的那些。请理解,或者,我可以将“Sheets(B).Range(#)”添加到每个 Range,但是,这看起来并不整洁。

以下是我的代码的 sn-p。感谢您的帮助。

Sub X_Iterate_Member()
Application.ScreenUpdating = False
On Error GoTo Error

Dim i As Integer, X As Integer

'------------------------Pre-guess X_value to be 0.5h-------------
For i = 4 To 11
    Range("B" & i) = Range("E" & i).Value * 0.5
Next i


'------------------------Iteration Loop---------------------------
i = 4 'Reset i to be 4-th Row

Do While i < 11 ' Working on Row 4 to 11

    Do While i < 11
        If Range("B" & i) <> "" And Range("J" & i) <> 0 Then Exit Do
    i = i + 1
    Loop

If Range("B" & i) = "" Or Range("J" & i) = 0 Then GoTo Increment
Range("Q" & i).GoalSeek Goal:=0, ChangingCell:=Range("B" & i)

【问题讨论】:

  • With Sheet1 - End With 结构包围您的代码,并在所有Range 引用前加上. 以完全限定它们,即.Range(... 而不是Range(... :- )
  • 并更改您的On Error GoTo Error 行。 Error 是 VBA 中的保留字,不应用作跳转标签。叫它别的东西:On Error GoTo Error_Handling。另请注意,关于变量ix,行数和列数的类型为Long 而不是Integer。存在的行数超出了Integer 的处理能力。

标签: excel vba worksheet


【解决方案1】:

您可以为您所指的工作表声明一个工作表,例如:

Sub X_Iterate_Member()
Application.ScreenUpdating = False
On Error GoTo Error

Dim i As Integer, X As Integer
Dim ws as worksheet
set ws = thisworkbook.sheets("[SHEET NAME]")
'------------------------Pre-guess X_value to be 0.5h-------------
For i = 4 To 11
    ws.Range("B" & i) = ws.Range("E" & i).Value * 0.5
Next i


'------------------------Iteration Loop---------------------------
i = 4 'Reset i to be 4-th Row

Do While i < 11 ' Working on Row 4 to 11

    Do While i < 11
        If ws.Range("B" & i) <> "" And ws.Range("J" & i) <> 0 Then Exit Do
    i = i + 1
    Loop

If ws.Range("B" & i) = "" Or ws.Range("J" & i) = 0 Then GoTo Increment
ws.Range("Q" & i).GoalSeek Goal:=0, ChangingCell:=ws.Range("B" & i)

【讨论】:

    【解决方案2】:

    您的代码未指定任何工作表。因此它作用于ActiveSheet。如果您希望它作用于工作表 A,您必须首先激活工作表 A。您可以通过调用一个专门的小过程来实现,该过程首先更改工作表,然后不更改地调用现有的子程序。

    Sub CallXiterateMember()
        ThisWorkbook.Worksheets("Sheet1").Activate
        X_Iterate_Member
    End Sub
    

    任何更优雅的解决方案都包括在您现有的过程中指定一个工作表。最简单的方法是使用With 语句,然后在每次引用它之前添加一个句点。由于您的所有引用似乎都是Range,应该变成.Range,您可以使用查找和替换来实现。这是您的代码的示例。

    Sub X_Iterate_Member()
    
        Dim i As Long, X As Integer
    
        Application.ScreenUpdating = False
        On Error GoTo ErrExit
    
        With Ws
            '------------------------Pre-guess X_value to be 0.5h-------------
            For i = 4 To 11
                .Range("B" & i) = .Range("E" & i).Value * 0.5
            Next i
    
    
            '------------------------Iteration Loop---------------------------
            i = 4 'Reset i to be 4-th Row
    
            Do While i < 11 ' Working on Row 4 to 11
    
                Do While i < 11
                    If .Range("B" & i) <> "" And .Range("J" & i) <> 0 Then Exit Do
                    i = i + 1
                Loop
    
            If .Range("B" & i) = "" Or .Range("J" & i) = 0 Then GoTo Increment
            .Range("Q" & i).GoalSeek Goal:=0, ChangingCell:=.Range("B" & i)
    
    Increment:
    
        End With
    
        Exit Sub
    ErrExit:
    End Sub
    

    如果你想在你的过程中指定变量Ws,你必须添加

    Dim Ws As Worksheet
    Set Ws = ThisWorkbook.Worksheets("SheetA")
    

    然后在运行代码之前更改工作表的名称。如果您要在过程调用中将 Ws 作为参数传递,则更灵活,例如

    Sub X_Iterate_Member(Ws As Worksheet)
    

    现在您可以使用您选择的工作表名称调用您的函数,例如如下所示。

    Sub CallXiterateMember()
    
        Dim WsName As String
    
        WsName = Worksheets("Sheet1").Cells(3, "A").Value
        X_Iterate_Member ThisWorkbook.Worksheets(WsName)
    End Sub
    

    我想您会在 Sheet1!A3 中有一个数据验证下拉菜单,您可以在其中选择工作表名称。你按下一个按钮来调用CallXiterateMember。然后,该子程序将从工作表中读取工作表名称并将其传递给您修改后的过程进行处理。

    【讨论】:

      猜你喜欢
      • 2014-03-11
      • 2016-10-30
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2011-03-16
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多