2015-12-10 81 views
2

希望你能幫上忙。在這一點上,我的頭靠在牆上。寫VBA相當新穎。我有一些下面列出的VBA代碼。基本上,我試圖做的是鎖定/解鎖,更改填充顏色,並根據使用工作表更改事件和ActiveSheet的下拉菜單中的輸入設置一組單元格的公式。代碼位於工作表本身。一切工作正常,除了公式設置片。Excel VBA設置使用範圍屬性命名單元格公式

Private Sub Worksheet_Change(ByVal Target As Range) 
With ActiveSheet 
.Unprotect Password:="somepw" 
    If Range("d17").Value = "Yes" Then 
     .Range("D22:D78").Locked = False 
     .Range("D22:D78").Interior.Color = RGB(115, 246, 42) 
     .Range("Inc_06PCTotRev").Formula = "=SUM($D$22:$D$25)" 
    ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then 
     If .Range("D22").Locked = True Then 
      With Range("D22:D78") 
       .Locked = False 
       .ClearContents 
       .Interior.Color = RGB(217, 217, 217) 
      End With 
     Else: .Range("D22:D78").ClearContents 
     End If 
    Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217) 
      .Range("D22:D78").Locked = True 
    End If 
.Protect Password:="somepw" 
End With 
End Sub 

當被包括我收到錯誤消息「的方法對象的_Worksheet範圍失敗」和excel崩潰。如果我將它評論出來,它會毫無問題地發生。任何幫助將不勝感激。請讓我知道,如果這不夠具體或沒有意義,我會盡我所能擴大。

+2

是命名範圍工作簿或工作表名爲範圍? –

+1

每次添加該公式時,都會再次調用工作表更改事件。我猜你是在一個永恆的循環中結束 – Sorceri

+0

名稱範圍代表什麼,IE什麼是實際範圍? – Sorceri

回答

1

正如我在我的評論中發佈的,你在一個永無止境的循環中,因爲你在工作表變更事件中改變你的工作表。您需要跟蹤更改通話。通過創建一個變量來跟蹤您何時調用更改,可以緩解這種情況,這也假定名稱範圍是1個單元格。

Public bRunning As Boolean 'keeps track of when we are making the change 

Private Sub Worksheet_Activate() 
    bRunning = False 'set to false when the sheet is activated 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If bRunning = False Then 'check to see if this is the first change 
    bRunning = True 'set the variable letting us know we are making the change. 
    With ActiveSheet 

    .Unprotect Password:="somepw" 
     If Range("d17").Value = "Yes" Then 
     .Range("D22:D78").Locked = False 
     .Range("D22:D78").Interior.Color = RGB(115, 246, 42) 
     .Range("Inc_06PCTotRev").Formula = "=SUM($D$22:$D$25)" 
     ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then 
     If .Range("D22").Locked = True Then 
      With Range("D22:D78") 
      .Locked = False 
      .ClearContents 
      .Interior.Color = RGB(217, 217, 217) 
      End With 
     Else: .Range("D22:D78").ClearContents 
     End If 
     Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217) 
      .Range("D22:D78").Locked = True 
     End If 
    .Protect Password:="somepw" 
    End With 
    Else 
    bRunning = False 'reset the variable as we are done making changes 
    End If 
End Sub 
+0

走開了一段時間,但該死的。非常感謝。感覺有點愚蠢。完全理解此時的碰撞部分。之前更新了代碼中的單元屬性,完全錯過了那些沒有生成永久循環的單元,因爲它們沒有改變單元內容。真的很感激它。 – Kbrodie

+0

說得過早。這實際上並沒有最終爲我工作,因爲公式部分實際上是爲多個單元設置的,而不僅僅是一個。然而,最終得到的代碼工作。將Application.EnableEvents = False添加到開頭,將Application.EnableEvents = True添加到結尾以及將錯誤值設置爲true時的錯誤處理程序。現在完美運作。 – Kbrodie

0

如果你只需要執行SUM當你的程序被調用,您可以使用Worksheet.Sum function

Application.WorksheetFunction.Sum(Range("$D$22:$D$25")) 

如果你確實需要在該單元格的公式,可以考慮使用FormulaR1C1 function

.Range("Inc_06PCTotRev").FormulaR1C1 = "=SUM(...)" 

在Excel下查找FormulaR1C1有助於更好地理解R1C1引用語法。如果要插入公式的單元格的格式爲$D$26,則應將「...」替換爲「R [-4] C:R [-1] C」。如果公式應該在單元格$ E $ 20中,則可以用「R [2] C [-1]:R [5] C [-1]」替換上面的「...」。

R [#]引用來自目標範圍/單元的行數,C [#]引用來自目標範圍/單元的#列。

相關問題