Хай. Есть ексель книга, в ней 3 листа. пишу в ней vba скрипт
[vba]
Код
dim foo dim bar dim foo1 set foo = worksheets("Лист1") dim ... dim ... sub cool_sub() используем ранее объявленные переменные foo И bar end sub sub second_cool_sub() используем ранее объявленные переменные foo И bar end sub
[/vba] смысл в том, что я хочу вначале один раз объявить некие переменные с именем листов, диапазонов. а далее во всех субах на них ссылаться. При выполнении какой либо субы вылетает ошибка. Так нельзя?
Хай. Есть ексель книга, в ней 3 листа. пишу в ней vba скрипт
[vba]
Код
dim foo dim bar dim foo1 set foo = worksheets("Лист1") dim ... dim ... sub cool_sub() используем ранее объявленные переменные foo И bar end sub sub second_cool_sub() используем ранее объявленные переменные foo И bar end sub
[/vba] смысл в том, что я хочу вначале один раз объявить некие переменные с именем листов, диапазонов. а далее во всех субах на них ссылаться. При выполнении какой либо субы вылетает ошибка. Так нельзя?Blin
Blin, есть такая примета: если автор вопроса не отписывается в своих темах, подошло решение или нет, то у отвечающих пропадает желание помогать такому автору, потому что нет смысла отвечать в пустоту
Blin, есть такая примета: если автор вопроса не отписывается в своих темах, подошло решение или нет, то у отвечающих пропадает желание помогать такому автору, потому что нет смысла отвечать в пустотуPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Присвоение начальных значений переменным выполняется внутри процедур, вне процедуры вы можете только определять константы. Естественно, вы можете организовать одну процедуру "инициализации" и вызывать её один раз в нужный момент, до исполнения всего основного кода.
Определение переменной через Dim вне кода процедуры даст вам переменную с областью видимости в пределах данного модуля. Если вам нужны "глобальные" переменные, которые будут иметь областью видимости всю книгу - используйте определение через Public, а не через Dim. Определять такие переменные надо только в общих модулях книги.
Для примера: [vba]
Код
' поместите код в любой общий модуль Public goFoo As Worksheet Public gcName As String Dim lcName As String
Sub initVars() gcName = "TEST" lcName = "test" Set goFoo = ThisWorkbook.Worksheets("Лист1") End Sub
' процедуру можно поместить в несколько разных модулей, и проверять, запуская её два раза подряд Sub test() If goFoo Is Nothing Then MsgBox "0. 'Foo' is nothing" initVars Else MsgBox "1. 'Foo' is '" & goFoo.name & "'" & vbCrLf & _ "'NAME' is '" & gcName & "'" & vbCrLf & _ "'name' is '" & lcName & "'" Set goFoo = Nothing End If End Sub
[/vba]
Присвоение начальных значений переменным выполняется внутри процедур, вне процедуры вы можете только определять константы. Естественно, вы можете организовать одну процедуру "инициализации" и вызывать её один раз в нужный момент, до исполнения всего основного кода.
Определение переменной через Dim вне кода процедуры даст вам переменную с областью видимости в пределах данного модуля. Если вам нужны "глобальные" переменные, которые будут иметь областью видимости всю книгу - используйте определение через Public, а не через Dim. Определять такие переменные надо только в общих модулях книги.
Для примера: [vba]
Код
' поместите код в любой общий модуль Public goFoo As Worksheet Public gcName As String Dim lcName As String
Sub initVars() gcName = "TEST" lcName = "test" Set goFoo = ThisWorkbook.Worksheets("Лист1") End Sub
' процедуру можно поместить в несколько разных модулей, и проверять, запуская её два раза подряд Sub test() If goFoo Is Nothing Then MsgBox "0. 'Foo' is nothing" initVars Else MsgBox "1. 'Foo' is '" & goFoo.name & "'" & vbCrLf & _ "'NAME' is '" & gcName & "'" & vbCrLf & _ "'name' is '" & lcName & "'" Set goFoo = Nothing End If End Sub
Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять...
Это ПРИМЕР Вы вообще поняли, о чём речь шла? О том, что переменные, определенные внутри модуля, но вне процедур - должны быть проинициализированы до их использования, отдельной процедурой. И о том, что если вы собираетесь использовать переменные, определенные в каком-то модуле, вне этого модуля - то эти переменные должны быть публичными. Саму методику как первоначальной инициализации, повторной реинициализации, а также освобождения памяти, плюс стратегию использования переменных - вы должны разрабатывать сами, исходя из решаемых вами задач...
Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять...
Это ПРИМЕР Вы вообще поняли, о чём речь шла? О том, что переменные, определенные внутри модуля, но вне процедур - должны быть проинициализированы до их использования, отдельной процедурой. И о том, что если вы собираетесь использовать переменные, определенные в каком-то модуле, вне этого модуля - то эти переменные должны быть публичными. Саму методику как первоначальной инициализации, повторной реинициализации, а также освобождения памяти, плюс стратегию использования переменных - вы должны разрабатывать сами, исходя из решаемых вами задач...AndreTM