将模块关联到工作表

问题描述 投票:1回答:2

我有这个模块可以在工作表B中运行一些事件。此模块中使用的所有范围是指Worksheet B中的那些单元格。

但是,我想将按钮运行在Worksheet A中。是否有单行标题代码或要添加的内容,以便所有范围始终引用Worksheet 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)
excel vba worksheet
2个回答
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)

0
投票

您的代码未指定任何工作表。因此,它作用于ActiveSheet。如果要使其作用于工作表A,则必须首先激活工作表A。您可以通过调用专用的小程序来做到这一点,该程序首先更改工作表,然后不更改现有子程序。

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

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

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。然后,该子程序将从工作表中读取工作表名称,并将其传递给您修改后的过程进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.