2016-12-14 29 views
0

最終,我試圖在焦點遠離工作簿時突出顯示單元格。如何在工作表和書籍之間發送變量?

這裏是我的代碼(在ThisWorkbook):

Public s As Range 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    s = Selection 
End Sub 

Private Sub Workbook_Deactivate() 
    s.Interior.ColorIndex = xlColorIndexNone 
    s.Interior.Color = RGB(0, 0, 0) 
End Sub 

Private Sub Workbook_Activate() 
    s.Interior.ColorIndex = xlColorIndexNone 
    s.Interior.Color = RGB(100, 204, 204) ' Blue 
End Sub 

但我發現了遇到第一s.Interior.ColorIndex錯誤:

Object variable or With block variable not set


下面是一些我的環境圖像:

表Sheet1 Sheet1

的ThisWorkbook(錯誤高亮): enter image description here

+1

's = Selection' ==>'Set s = Selection',雖然'Set s = Target'也可以。 –

+0

@JohnColeman我嘗試了'Set s = Selection'並且得到了'運行時錯誤'91':對象變量或With block variable not set'與以前一樣。 –

+1

*這些模塊在哪裏?我複製了你的代碼:1)標準代碼模塊中的公共'''聲明,2)工作表模塊中的'selection_change',以及3)工作簿模塊中的'activate' /'deactivate' - 以及它們全部爲我工作(使用'Set'後)。我的猜測是你沒有使用Option Explicit。公共變量應該在標準代碼模塊中聲明。如果沒有,變量's'在'workbook'模塊中將不可見。 –

回答

1

有幾個問題:

1)爲了在整個項目中可見,公共變量聲明必須位於標準的代碼模塊中。因此,行

Public s As Range 

不應該在ThisWorkbook,但應在一個標準的代碼模塊。

2)s = Selection應改爲Set s = Selection

3)輔助

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Set s = Selection 
End Sub 

應該是片模塊(和重複希望此爲每片)。它在ThisWorkbook中不是語法錯誤,但它不會按預期工作。

4)當觸發activatedeactivate時,假定s被定義是危險的。你應該防範這一點。例如:

Private Sub Workbook_Activate() 
    If s Is Nothing Then 
     Set s = Selection 
     Exit Sub 
    End If 
    s.Interior.ColorIndex = xlColorIndexNone 
    s.Interior.Color = RGB(100, 204, 204) ' Blue 
End Sub 

對於Deactivate有類似的東西。

+0

FWIW - 如果's'在代碼名稱爲Sheet1(不是工作表'.Name',實際代碼名稱)的代碼模塊中聲明爲'Public',則可以從其他代碼模塊項目中的模塊爲'Sheet1.s'。但是,這將是非常**不推薦(至少是我),所以把它放在一個標準的代碼模塊更好。 – YowE3K