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


Вот некоторые изображения моего env:

Лист1 Sheet1

ThisWorkbook (Error подсвечена): enter image description here

+1

's = Selection' ==>' Set s = Selection', хотя 'Set s = Target' также будет работать. –

+0

@JohnColeman Я попробовал 'Set s = Selection' и получил' Run-time error '91': Object variable или с переменной block not set', как и раньше. –

+1

* Где * эти модули? Я скопировал ваш код: 1) декларация public 's' в стандартном модуле кода, 2)« selection_change »в модуле листа и 3)« активировать »/« деактивировать »в модуле книги - и все они работайте для меня (после использования '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) Опасно предположить, что s определяется при срабатывании activate или deactivate. Вы должны защищаться от этого. Что-то вроде:

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 - если '' 'был объявлен' public' в модуле кода листа, который имеет кодовое имя 'Sheet1' (а не листок' .Name', фактическое кодовое имя), тогда к нему можно получить доступ из другого модулей в рамках проекта как «Sheet1.s». Но это было бы очень ** НЕ рекомендовано (по крайней мере, я), поэтому идея разместить его в стандартном модуле кода лучше. – YowE3K

Смежные вопросы