2016-12-14 27 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