将模块关联到工作表
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 名称并将其传递给您修改后的过程进行处理。
我有这个模块来 运行 工作表 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 名称并将其传递给您修改后的过程进行处理。