将模块关联到工作表

Associate a Module to a worksheet

我有这个模块来 运行 工作表 B 中的一些事件。本模块中使用的所有范围都是指 工作表 B 中的那些单元格。

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

下面是我的代码片段。感谢您的帮助。

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)

您可以为您所指的 sheet 声明作品sheet,例如:

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)

您的代码没有指定任何工作sheet。因此它作用于ActiveSheet。如果你想让它对 Sheet A 起作用,你必须首先激活 Sheet A。你可以通过调用一个专门的小过程来做到这一点,该过程首先改变 sheet 然后调用你现有的子不变.

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

任何更优雅的解决方案都包括在现有过程中指定 sheet。最简单的方法是使用 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")

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

Sub X_Iterate_Member(Ws As Worksheet)

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

Sub CallXiterateMember()

    Dim WsName As String

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

我想您会在 Sheet1!A3 中有一个数据验证下拉列表,其中您 select 一个 sheet 名称。您按下按钮调用 CallXiterateMember。然后这个 sub 将从工作 sheet 中读取 sheet 名称并将其传递给您修改后的过程进行处理。