2016-04-23 3 views
2

Я создаю пользовательскую форму, которая добавляет данные на рабочий лист. У меня есть куча подпрограмм для моей пользовательской формы, но у меня возникают проблемы с доступом к переменной, установленной на моем листе. В настоящее время это локальная переменная (в подпункте) и попыталась разместить ее в модуле, как описано здесь: Can a worksheet object be declared globally in Excel VBA. Я сделал дальнейший поиск, но не получил желаемых результатов.Глобальная переменная рабочего листа для userform в excel

Я новичок в VBA и новичок в программировании в целом. Я использовал Excel совсем немного и хочу сделать больше, создав макросы и используя VBA. Вот код, который я сейчас использую:

sub savebutton_click() 
    Dim trees As Worksheet 
    Set trees = ThisWorkbook.Sheets("Sheet1") 
    trees.Cells(1, 1) = Me.TextTreeName 
    trees.Cells(1, 2) = Me.TextTreeType 
End sub 

Очевидно, что я не могу получить доступ к локальным переменным из другой подпрограммы, так что я должен сделать глобальные «деревья». Я создал модуль и заменил Dim на Public, поместил вторую строку кода в Workbook_Open(), а затем попытался получить доступ к переменной 'trees'. Я получаю «Недопустимая внешняя процедура» и выделяет код в Workbook_Open(), когда я нажимаю «Debug».

По сути, я просто хочу иметь доступ, скажем, к деревьям. Цвета (5,6) из любого суб, и я не уверен, что еще с этим делать. Есть идеи? Спасибо!

ответ

1

Это должно быть вопрос размещения ... если вы откроете VBA IDE и выберите элемент ThisWorkbook в своем проекте VBAP. Дважды щелкните этот элемент, чтобы открыть его, выберите «Рабочая книга» в верхнем левом раскрывающемся списке, выберите «Открыть» в раскрывающемся списке вверху справа. Это позволит создать Workbook_Open Sub в объекте ThisWorkbook:

Private Sub Workbook_Open() 
    Set trees = ThisWorkbook.Sheets("Sheet1") 
End Sub 

правой кнопкой мыши ваш VBAProject и Add Module. В этом модуле вы устанавливаете глобальную переменную:

Public trees As Worksheet 

Далее вы создаете форму, нажимаете на нее кнопку и дважды щелкаете по кнопке. Это будет генерировать событие кнопки:

В моем случае:

Private Sub CommandButton1_Click() 
    trees.Cells(1, 1) = Me.TextTreeName 
    trees.Cells(1, 2) = Me.TextTreeType 
End Sub 

Теперь, если вы закроете книги Excel (сохранить код и книгу первый) и снова откройте УПРАЖНЕНИЯ Workbook_Open() будет удар и установите Рабочий лист. Теперь позвоните в свою форму и нажмите кнопку. Это заполнит две ячейки на данном листе ....

+0

Спасибо за ваш ответ. Странно, что я сделал все, что вы упомянули с нуля (создал тестовый файл), сохранил все и запустил ящик пользователя перед закрытием всего файла. У меня ошибка. После закрытия книги и ее повторного открытия я запускал код без каких-либо проблем. Для меня это просто странно. В любом случае, если я правильно понимаю, все глобальные переменные входят в подменю Workbook_Open(), правильно? Итак, если бы я должен был установить переменную mapleTree = trees.Cells (1, 9), я смог бы получить доступ к mapleTree из других субмарин? В очередной раз благодарим за помощь! – EJM

+0

Публичные переменные могут быть объявлены как в любом модуле, так и в любой панели кода рабочего листа, а оператор объявления ДОЛЖЕН быть размещен вне его вершины перед первым вводом Sub или Function. После объявления они доступны из любого Sub/Func любого модуля, как для настройки, так и для извлечения. Я бы добавил, что если ваши переменные должны быть разделены только между Subs/Func, все из которых находятся в одном и том же Модуле, тогда это был бы лучший выбор, объявляющий их как переменную уровня модуля (т. Е. 'Dim trees as Worksheet') самой верхней части самого модуля. – user3598756

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