我有这个模块可以在工作表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)
您可以为要引用的工作表声明一个工作表,例如:
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)
您的代码未指定任何工作表。因此,它作用于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。然后,该子程序将从工作表中读取工作表名称,并将其传递给您修改后的过程进行处理。