我希望Goalseek经历几个专栏(“BB:BP”)。目前,它仅以下列方式使用“BB”列:
当单元格“BB62”中的值等于单元格“BB61”中的值时,单元格“BB63”中的值会发生变化。
这是代码:
Sub Goalseek()
With Worksheets("sheet_input")
.Range("bc62").GoalSeek _
Goal:=.Range("bc61").Value, _
ChangingCell:=.Range("bc63")
End With
End Sub
我想创建一个循环,以便在运行单个宏时它一直工作到“BP”列。我想出了以下内容:
Public Sub Goalseek()
Dim rngCol As Range
For Each rngCol In ActiveSheet.Range("BB61:BP63")
rngCol.Cells(54, 62).GoalSeek Goal:=rngCol.Cells(54, 61), ChangingCell:=rngCol.Cells(54, 63)
Next rngCol
End Sub
但它不起作用。我收到以下错误:
编译错误:在“结束子”,“结束功能”或“结束属性”
之后,只能显示注释
我做错了什么?
答案 0 :(得分:1)
在解决您的错误问题之前,我们只需处理一些代码整理。
定义Range
时,.Cell
对象是相对于该范围定义的。因此.Cell(1, 1)
实际上引用了Range
中的第一个单元格(即" BB61")而不是整个Worksheet
。
所以你的代码可能会更好,如下所示:
Sub Goalseek()
Dim rng as Range
Dim cell as Range
Set rng = ThisWorkbook.Worksheets("sheet input").Range("BB62:BP62")
For Each cell in rng.Cells
cell.GoalSeek Goal:=cell.Offset(-1).Value, ChangingCell:= cell.Offset(1)
Next
End Sub
由于您尚未发布的代码,您的错误正在发生。在End Sub
下的某个地方,您将获得更多代码。大多数情况下,这是因为删除了以前的例程,因此您可能会发现模块底部有一些旧代码,例如,End Sub
通常会出现两次。
答案 1 :(得分:0)
我找到了我的初始问题的解决方案以及另外两个问题:
Sub Goalseek()
Dim rng As Range
Dim cell As Range
Set rng = ThisWorkbook.Worksheets("pb_input").Range("BB62:BP62")
rng.Offset(1).Value = 0
For Each cell In rng.Cells
If cell.Value <= cell.Offset(-1).Value Then _
cell.Offset(2) = 1 Else _
cell.Offset(2) = -1
cell.Goalseek Goal:=cell.Offset(-1).Value, ChangingCell:=cell.Offset(1)
Next
End Sub
答案 2 :(得分:0)
我发现解决方案是:
Sub GoalSeek()
Dim rng As Range
Dim cell As Range
Application.ScreenUpdating = False
Set rng = ThisWorkbook.Worksheets("pb_input").Range("BB62:BP62")
rng.Offset(1).Value = 0
For Each cell In rng.Cells
If cell.Value <= cell.Offset(-1).Value Then
cell.Offset(2) = 1
Else
cell.Offset(2) = -1
End If
If cell.Offset(-1) > 0 Then
cell.GoalSeek Goal:=cell.Offset(-1).Value, ChangingCell:=cell.Offset(1)
End If
Next
Application.ScreenUpdating = True
End Sub