Здравствуйте Народ! Помогите разобраться с кодом. Пример прилагаю. Понимаю, что есть необходимость присвоить глобальную переменную в "основном модуле", для управления модулями 1,2,3, и. т. д , но как это сделать грамотно, так как в последствии модулей будем много, а последовательность запуска рабочих модулей будет разная в зависимости от наполненной базы данных.
)) Вячеслав, на самом деле какую задачу вы решаете - знаете только вы я написал как понял, и название темы предложил соответствующее моему решению а не вашей задаче (потому что она туманна для меня)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Вячеслав, здравствуйте Непонятно, в чём именно проблема. Если нужно передавать параметр между процедурами, то и задайте этот параметр в скобках после имени процедуры. Полагаю, в вашем случае вполне можно обойтись без глобальной переменной. Если что, писать Call перед вызовом процедуры или функции совсем необязательно и бывает даже плохо (не помню, почему).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Задача передать параметр между модулями Если к примеру во втором модуле "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
не помню, чтобы кому-то после этого поплохело Только если неправильно приготовить. 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 даже немного подстаховывает нас.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пример — это что-то типа такого, а не то, что вы показываете
Код
Sub Main()
Dim tx$
tx = "вася"
t1 tx
MsgBox tx
t2 tx
MsgBox tx
End Sub
'==================================================================================================
Sub t1(a$)
a = "петя"
End Sub
'==================================================================================================
Sub t2(b$)
If b = "петя" Then b = "анжела" Else b = "не петя"
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: Call перед вызовом процедуры или функции совсем необязательно и бывает даже плохо
Впервые слышу такое утверждение )) А вот вариант, когда вызов внешней процедуры без Call может привести к ошибке, в своё время обсуждался. Тему эту уже не найти, но помню, что там было связано с именем этой самой процедуры. И даже пример приводился. Но случай был исключительный
Юрий М, нужен, если вызов процедуры идёт без параметров и после нее идёт двоеточие для продолжения строки. Без Call VBE почитает процедуру меткой перехода. Думаю,что пример о котором ты говоришь заключается в том, что есть 2 и более имени и только одно из них означает процедуру/функцию. Call заставляет отсеять лишнее, а без него будет двусмысленность... Но это только версия)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
вернулся ответить из другой темы Большое спасибо! Я бы сказал, что это, скорее трюк, нежели нюанс, поскольку, вызывая функцию, как функцию мы должны куда-то вернуть её результат. При таком "правильном" использовании, никаких неожиданностей не возникает. Добавил свой тест сверху. Также, видно, что, в отличие от "правильного" применения функции с возвращением её результата, в варианте NotUseCallKeyword_WithBreakets скобки "отбиваются" VBE подальше. Не знаю, что это значит, но что-то вроде того, что переменная "уходит" в TestChangeA, но текстом, а не как переменная, Соответственно, некуда просто вернуть изменения.
Code
Код
Option Explicit
Sub NotUseCallKeyword_WithBreakets_Print()
Debug.Print "------------- NotUseCallKeyword_WithBreakets_Print -------------------"
Dim a As String
a = "I'm alive!"
Debug.Print TestChangeA(a)
Debug.Print "NotUseCallKeyword_WithBreakets->TestChangeA - a=" & a
End Sub
Sub ShockCallStatement()
NotUseCallKeyword_WithBreakets
NotUseCallKeyword
UseCallKeyword
End Sub
'если вызвать функцию TestChangeA без ключевого Call
'но при этом оставить скобки - переменная а не изменит значение
'т.е. функция Test обработает её внутри себя так,
'как будто мы передали её ByVal - т.е. не ссылочным типом
Sub NotUseCallKeyword_WithBreakets()
Debug.Print "------------- NotUseCallKeyword_WithBreakets -------------------"
Dim a As String
a = "I'm alive!"
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
UPD: sokol92, как раз даёт ссылку, где ZVI рассказывает про "отбитые" скобки… Снова не получилось открыть Америку — ZVI всё разложил по полочкам
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄