Goalseek有几列

时间:2015-10-13 10:31:00

标签: excel vba excel-vba

我希望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

但它不起作用。我收到以下错误:

  

编译错误:在“结束子”,“结束功能”或“结束属性”

之后,只能显示注释

我做错了什么?

3 个答案:

答案 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