2016-10-16 1 views
0

Я провел последний час, читая страницы о переменной области видимости в различных вариантах excel vba, и не смог найти определенную ссылку на документацию, касающуюся моей проблемы с областью ... хотя i Я убежден, что это такая классика. Ну, вот и все.Имея общедоступную переменную, доступную в объектах userform/sheet

У меня есть книга, которая содержит только один лист и одну пользовательскую форму. У меня есть список учеников, сидящих в колонке 1 на моем листе. Я хотел бы:

  • нагрузки этот список вверх в некоторой глобальной переменной коллекции с именем students_list (я делаю это с помощью процедуры Workbook-Open() в ThisWorkbook объект)
  • использовать содержимое students_list в инициализировать ListBox в моем UserForm
  • удалить элементы из students_list при нажатии на моей UserForm нажал на

Все, что нужно это переменная, которая видна из в моих процедурах пользовательской формы, а также изнутри объекта ThisWorkbook.

Я попытался объявить его общедоступным, глобальным, в коде листа, в пользовательской форме в этой книге, в отдельном модуле, посвященном глобальным переменным ... Я просто не могу найти правильный способ иметь students_list переменная видимая от везде.

Что мне не хватает? Приносим извинения за этот вопрос, который должен быть таким базовым и все же бьет меня: -/

+0

Вы можете использовать 'Range' из таблицы для хранения список и быть доступным всеми различными элементами вашего кода VBA - по существу, с любого листа и любого модуля. Если вы не хотите, чтобы эта область царапин была видимой, запустите ее в столбце BB и/или установите цвет шрифта на белый, чтобы пользователь не заметил его. – PeterT

+1

Если вы объявили 'students_list' как' Public' в модуле, переменная ** должна ** быть доступна для всех процедур в рамках проекта. См. Http://stackoverflow.com/a/3815797/6535336.(Единственное исключение было бы, если бы вы объявили другую переменную с тем же именем в каком-то другом месте - тогда эта вторая переменная будет отнесена к сфере действия второй декларации.) – YowE3K

+0

Нет pb с видимой областью нуля, на самом деле это как я загружаю значения в свою коллекцию 'students_list' ... но это не проблема здесь, я боюсь. – Guillaume

ответ

0

Разместите объявление своих Public переменных внутри модуля (используйте Insert/Module из меню, чтобы создать его, если у вас еще нет один). Затем область охвата будет распространена на весь ваш проект.

Таким образом, в модуле (например, Module1) имеют:

Public foo As Integer 

И на листе (например, Лист1) код есть:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    foo = 4 
    MsgBox "foo set to 4" 
End Sub 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
    MsgBox "foo = " & foo 
End Sub 

Если вы должны были разместить объявление в код для ThisWorkbook вам нужно будет ссылаться на него как Thisworkbook.foo, потому что, хотя он доступен из любой части кода, он является переменной, специфичной для этого объекта ThisWorkbook.

Так, в коде ThisWorkbook есть:

Public foo As Integer 

И на листе (например, Лист1) код есть:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    ThisWorkbook.foo = 4 
    MsgBox "foo set to 4" 
End Sub 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
    MsgBox "foo = " & ThisWorkbook.foo 
End Sub 
+0

Приятно и ясно, большое вам спасибо. – Guillaume