2015-10-13 117 views
1

我想讓Goalseek運行幾列(「BB:BP」)。目前僅在以下方式中使用列「BB」:若干列的Goalseek

當單元格「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 

但它不工作。我收到以下錯誤:

Compile error: Only comments may appear after End Sub, End Function, or End Property

我在做什麼錯?

回答

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下的某個地方,您將獲得更多代碼。大多數情況下,它是刪除以前的例程的結果,因此您可能會發現在模塊的底部留下了一些舊代碼,例如,通常會出現兩次,例如兩次出現。

+0

嗨Ambie。感謝您的答覆。我忘了定義的範圍。它正在工作。當我想「重新啓動」goalseeker時,我將第63行中的值設置爲0.是否有一種方法可以將其自動化,因此在運行宏之前,所有單元格值都設置爲0? – Saud

+1

'rng.Offset(1).Value = 0' – Ambie

+0

輝煌。有效。我需要這個宏完全自動化的最後一件事是調整新行,第64行依賴於第61行和第62行,如下所示:如果'行中的單元格中的值'> ='行中的單元格中的值62',則'行64中的單元格中的值'= 1,否則它等於-1。這需要在搜索目標被初始化之前完成,否則對於所有列將等於1。邏輯很直觀,但我不確定在哪裏插入它。子Goalseek() 昏暗的RNG作爲範圍 昏暗的小區範圍 設置RNG = ThisWorkbook.Worksheets( 「sheet_input」)的範圍。( 「BB62:BP62」) RNG – Saud

0

我找到了解決我的問題INTIAL以及另外兩個問題是:

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