Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/invalid outside procedure - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
invalid outside procedure
Blin Дата: Понедельник, 04.05.2015, 04:32 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Хай.
Есть ексель книга, в ней 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
Дата добавления - 04.05.2015 в 04:32
Pelena Дата: Понедельник, 04.05.2015, 09:19 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19402
Репутация: 4554 ±
Замечаний: ±

Excel 365 & Mac Excel
Blin, есть такая примета: если автор вопроса не отписывается в своих темах, подошло решение или нет, то у отвечающих пропадает желание помогать такому автору, потому что нет смысла отвечать в пустоту


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеBlin, есть такая примета: если автор вопроса не отписывается в своих темах, подошло решение или нет, то у отвечающих пропадает желание помогать такому автору, потому что нет смысла отвечать в пустоту

Автор - Pelena
Дата добавления - 04.05.2015 в 09:19
AndreTM Дата: Понедельник, 04.05.2015, 10:02 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Присвоение начальных значений переменным выполняется внутри процедур, вне процедуры вы можете только определять константы.
Естественно, вы можете организовать одну процедуру "инициализации" и вызывать её один раз в нужный момент, до исполнения всего основного кода.

Определение переменной через 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]


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Понедельник, 04.05.2015, 10:37
 
Ответить
СообщениеПрисвоение начальных значений переменным выполняется внутри процедур, вне процедуры вы можете только определять константы.
Естественно, вы можете организовать одну процедуру "инициализации" и вызывать её один раз в нужный момент, до исполнения всего основного кода.

Определение переменной через 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]

Автор - AndreTM
Дата добавления - 04.05.2015 в 10:02
Blin Дата: Понедельник, 04.05.2015, 17:17 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
' процедуру можно поместить в несколько разных модулей, и проверять, запуская её два раза подряд

Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять, чтоб не вызвать второй раз?
 
Ответить
Сообщение
' процедуру можно поместить в несколько разных модулей, и проверять, запуская её два раза подряд

Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять, чтоб не вызвать второй раз?

Автор - Blin
Дата добавления - 04.05.2015 в 17:17
AndreTM Дата: Понедельник, 04.05.2015, 20:04 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять...
Это ПРИМЕР :)
Вы вообще поняли, о чём речь шла? О том, что переменные, определенные внутри модуля, но вне процедур - должны быть проинициализированы до их использования, отдельной процедурой. И о том, что если вы собираетесь использовать переменные, определенные в каком-то модуле, вне этого модуля - то эти переменные должны быть публичными.
Саму методику как первоначальной инициализации, повторной реинициализации, а также освобождения памяти, плюс стратегию использования переменных - вы должны разрабатывать сами, исходя из решаемых вами задач...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Достаточно просто вызвать процедуру в начале каждого модуля, или надо обязательно проверять...
Это ПРИМЕР :)
Вы вообще поняли, о чём речь шла? О том, что переменные, определенные внутри модуля, но вне процедур - должны быть проинициализированы до их использования, отдельной процедурой. И о том, что если вы собираетесь использовать переменные, определенные в каком-то модуле, вне этого модуля - то эти переменные должны быть публичными.
Саму методику как первоначальной инициализации, повторной реинициализации, а также освобождения памяти, плюс стратегию использования переменных - вы должны разрабатывать сами, исходя из решаемых вами задач...

Автор - AndreTM
Дата добавления - 04.05.2015 в 20:04
Blin Дата: Вторник, 05.05.2015, 17:57 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
дада, понял
[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()

initVars

do some things...

End Sub

[/vba]


Сообщение отредактировал Blin - Вторник, 05.05.2015, 17:59
 
Ответить
Сообщениедада, понял
[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()

initVars

do some things...

End Sub

[/vba]

Автор - Blin
Дата добавления - 05.05.2015 в 17:57
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!