Страницы: 1
RSS
как обьявить и использовать глобальную переменнуюкак обьявить и использовать глобальную переменную, Передать значение переменной в управляющий модуль
 
Здравствуйте Народ! Помогите разобраться с кодом. Пример прилагаю. Понимаю, что есть необходимость присвоить глобальную переменную в "основном модуле",  для управления модулями 1,2,3, и. т. д , но как это сделать грамотно, так как в последствии модулей будем много, а последовательность запуска рабочих модулей будет разная в зависимости от наполненной базы данных.
Изменено: Юрий М - 15.12.2022 18:46:50
 
название темы
как обьявить и использовать глобальную переменную

в модуле1 обьявлена
в модуле ЭтаКнига инициализирована
в модуле3 видно значение, если выполнить местный макрос
Изменено: Ігор Гончаренко - 15.12.2022 16:00:46
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Искал решение через ByRef весь мозг разорвал)))). Хотел обойтись без глобальной переменной. Игорь спасибо все работает
 
))
Вячеслав,
на самом деле какую задачу вы решаете - знаете только вы
я написал как понял, и название темы предложил соответствующее моему решению а не вашей задаче (потому что она туманна для меня)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вячеслав, здравствуйте
    Непонятно, в чём именно проблема. Если нужно передавать параметр между процедурами, то и задайте этот параметр в скобках после имени процедуры. Полагаю, в вашем случае вполне можно обойтись без глобальной переменной.
    Если что, писать Call перед вызовом процедуры или функции совсем необязательно и бывает даже плохо (не помню, почему).
Изменено: Jack Famous - 15.12.2022 17:59:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Задача передать параметр между модулями Если к примеру во  втором модуле "Mod2" параметр к=1 то создается отдельный лист и далее срабатывается модуль 3 иначе  действие  переходит в модуль "Roditel" в Step4  шаг 4. Пишу в разных модулях по причине того что сами модули очень большие
Код
Sub auxProc_Step2() ' Обрабатывается база данных листа 1
Dim k
    .........
    .........
   if k=1 Then
        Worksheets.Add.Name = "List1"
        
        Else: ?????? ' Вот здесь и возникли у меня трудности
    End If
End Sub
________________________________________________________________________________________________________

Sub Roditel() ' управляющий модуль
Call Mod1.auxProc_Step1 'Шаг 1 Заполнение реквизитов
Call Mod2.auxProc_Step2 'Шаг 2 обработка данных листа 1 если условие выполнено то шаг 3
Call Mod3.auxProc_Step3
MsgBox "ШАГ 3"
Call Mod4.auxProc_Step4 'Шаг 4 
MsgBox "Завершение "
End Sub
Изменено: Вячеслав - 15.12.2022 18:30:56
 
Цитата
Jack Famous написал:
и бывает даже плохо
не помню, чтобы кому-то после этого поплохело :) Только если неправильно приготовить. Call вроде как атавизм - остался от старых версий VB, где каждая функция должна была иметь тип Let или Get и т.п. Но вернемся к правильной готовке с Call и без него.
Я накидал пару кодов - чтобы было понимание что к чему и как не надо:
Код
Sub ShockCallStatement()
    NotUseCallKeyword_WithBreakets
    NotUseCallKeyword
    UseCallKeyword
End Sub
'если вызвать функцию TestChangeA без ключевого Call
'но при этом оставить скобки - переменная а не изменит значение
'т.е. функция Test обработает её внутри себя так,
'как будто мы передали её ByVal - т.е. не ссылочным типом
Sub NotUseCallKeyword_WithBreakets()
    Debug.Print "-------------   NotUseCallKeyword_WithBreakets    -------------------"
    Dim a As String
    TestChangeA (a)
    Debug.Print "NotUseCallKeyword_WithBreakets->TestChangeA - a=" & a
End Sub
'если вызвать функцию TestChangeA без ключевого Call
'и не указывать скобки - переменная а изменит значение
'Т.е. функция Test обработает её внутри себя так, как ожидалось
Sub NotUseCallKeyword()
    Debug.Print "-------------   NotUseCallKeyword    -------------------"
    Dim a As String
    TestChangeA a
    Debug.Print "NotUseCallKeyword->TestChangeA - a=" & a
End Sub
'если вызвать функцию TestChangeA с ключевым Call
'переменная а изменит значение
'Т.е. функция Test обработает её внутри себя так, как ожидалось
Sub UseCallKeyword()
    Debug.Print "-------------   UseCallKeyword    -----------------"
    Dim a As String
    Call TestChangeA(a)
    Debug.Print "UseCallKeyword->TestChangeA - a=" & a
End Sub
'т.к. переменная refArg передана
Private Function TestChangeA(Optional ByRef refArg As String) As Boolean
    Debug.Print "TestChangeA - a=" & refArg
    refArg = "Test"
    TestChangeA = True
    Debug.Print "TestChangeA - a=" & refArg
End Function

Я бы здесь сказал, что Call даже немного подстаховывает нас.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Пример — это что-то типа такого, а не то, что вы показываете
Изменено: Jack Famous - 15.12.2022 18:32:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Вячеслав написал:
Если к примеру во  втором модуле "Mod2"
Если правильно понял, то Вам пора погружаться в прекрасный мир функций, возвращающих параметры.
Mod2.auxProc_Step2 - должна выглядеть примерно так:
Код
Function auxProc_Step2()
'что-то делаем, проверяем.
'Если все выполнилось - возвращаем True
auxProc_Step2 = True
End Function

В итоге вот эти строки
Код
Call Mod2.auxProc_Step2 'Шаг 2 обработка данных листа 1 если условие выполнено то шаг 3
Call Mod3.auxProc_Step3

превратятся в такие:
Код
'Шаг 2 обработка данных листа 1
If Mod2.auxProc_Step2 = True then 'если условие выполнено то шаг 3
    Call Mod3.auxProc_Step3
End if
Изменено: Дмитрий(The_Prist) Щербаков - 15.12.2022 18:32:35
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Jack Famous написал:
Call перед вызовом процедуры или функции совсем необязательно и бывает даже плохо
Впервые слышу такое утверждение ))
А вот вариант, когда вызов внешней процедуры без Call может привести к ошибке, в своё время обсуждался.  Тему эту уже не найти, но помню, что там было связано с именем этой самой процедуры. И даже пример приводился. Но случай был исключительный
 
Гениально!!!  :) , о функции я и не подумал Дмитрий спасибо за идею. Буду пробывать
 
Юрий М, нужен, если вызов процедуры идёт без параметров и после нее идёт двоеточие для продолжения строки. Без Call VBE почитает процедуру меткой перехода.
Думаю,что пример о котором ты говоришь заключается в том, что есть 2 и более имени и только одно из них означает процедуру/функцию. Call заставляет отсеять лишнее, а без него будет двусмысленность... Но это только версия)
Изменено: Jack Famous - 15.12.2022 19:47:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
См. еще эту тему.
Владимир
 
Вопрос решен тема закрыта. Всем спасибо
 
Цитата
Дмитрий(The_Prist) Щербаков: Я накидал пару кодов - чтобы было понимание что к чему и как не надо:
вернулся ответить из другой темы  :D
    Большое спасибо! Я бы сказал, что это, скорее трюк, нежели нюанс, поскольку, вызывая функцию, как функцию мы должны куда-то вернуть её результат. При таком "правильном" использовании, никаких неожиданностей не возникает. Добавил свой тест сверху.
    Также, видно, что, в отличие от "правильного" применения функции с возвращением её результата, в варианте NotUseCallKeyword_WithBreakets скобки "отбиваются" VBE подальше. Не знаю, что это значит, но что-то вроде того, что переменная "уходит" в TestChangeA, но текстом, а не как переменная, Соответственно, некуда просто вернуть изменения.
Code


UPD:
sokol92, как раз даёт ссылку, где ZVI рассказывает про "отбитые" скобки…
    Снова не получилось открыть Америку — ZVI всё разложил по полочкам :D
Изменено: Jack Famous - 08.08.2023 11:56:21
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Читают тему
Наверх