Страницы: 1
RSS
Как можно организовать передачу значений переменных между процедурами.
 
Доброго времени суток и всех с праздником 9 мая!. Возник вопрос как организовать передачу значений переменных между процедурами? В програмировании я новичек, не обессудьте за непонимание и не совсем корректную формулировку вопроса.
Создал макрос который выполняет подсчет строк исходя из определенных условий. при запуске, макрос определяет какая процедура должна работать, их 2. Sub Макрос1() и Sub metall(). Если в ячейке Range ("V23") стоит 1, работает Sub metall() в противном случае Макрос1(). В таблице c исходными данными, на листе Excel,
ввожу данные и указываю типы шкафов в ячейке Range ("V23"). Типы могут меняться, поэтому необходима организация передачи переменных для последовательного вывода результата. Отличие процедур в том, что Sub metall() добавляет дополнительно пустые строки.
Подскажите, как это сделать, в литературе мало что понял. Спасибо. Пример прилагаю.
 
Цитата
Фарит написал:
как организовать передачу значений переменных между процедурами?
использовать глобальные переменные
Код
 Public npp As Integer, k As Integer, nrs As Integer
Public kolVk As Integer, kolgr As Integer 
Sub Макрос1()
'...
End Sub

Sub metall()
'...
End Sub
Соблюдение правил форума не освобождает от модераторского произвола
 
Спасибо боьшое, а как переменные будут себя вести в других модулях? или они объявленны только для 1 модуля?
 
Цитата
Фарит написал:
а как переменные будут себя вести в других модулях?
а проверить, открыть справку, нет никак?
Изменено: buchlotnik - 09.05.2020 18:32:30
Соблюдение правил форума не освобождает от модераторского произвола
 
Отработал 1 SUB а второй затирает значения первого значения npp не передал во второй
Никаких значений он не передает в другую процедуру. Описав глобально, я описал их тип, а мне надо чтобы значения передавались между процедурами.
 
Глобальная переменная будет доступна из любого модуля.
 
Мне надо чтобы обмен значений переменных происходил в рамках одного модуля обмен происходил ЗНАЧЕНИЙ в не зависимости в какой очерёдности работают процедуры
 
Объявляйте в модуле, в чем проблема?
Код
Option Explicit

Dim lRw As long

Sub...
 
Цитата
Фарит написал:
а второй затирает значения первого значения npp не передал во второй
Ну так пусть не затирает. У Вас в каждой процедуре  идет присваивание npp=1. Оставьте это присваивание только в той процедуре, которая вызывается первой.
 
что-то вообще ничего не понял, выдает ошибку и все. Может я вообще не правильно все делаю? подскажите как организовать проверку условия и выполнять обработку данных 1 или 2 процедурой? В исходнике строк могут быть тысячи. В Range ("V23") я указываю какую процедуру использовать для конкретной группы строк которые в столбце "В" имеют одинаковое название. Таких групп сотни
 
Цитата
Фарит написал:
Мне надо чтобы обмен значений переменных происходил в рамках одного модуля...не зависимости в какой очерёдности работают процедуры
Не очень понимаю, в чём проблема: объявите глобальную переменную. В процедуре- посреднике присвойте ей значение. Затем в любой последовательности вызывайте остальные процедуры:
Код
Public x As Long
Sub maim()
    x = 5
End Sub

Sub Macro1()
    MsgBox x
End Sub

Sub Macro2()
    MsgBox x
End Sub
 
Идея хорошая, это все равно что в ручную забивать результат. Спасибо за совет
 
Цитата
Фарит написал:
это все равно что в ручную забивать результат.
Зачем вручную? Присвойте на событие открытия книги.
 
хорошая идея - в каждой теме простыми бытовыми терминами описывать задачу, которую решаете, но она пока никак не приживается в ваших темах.
допустим я на французском знаю десяток слов, а вы владеете языком идеально. как вы думаете чтобы вы поняли из моего рассказа на французском об общем устройстве вселенной? вы бы поняли как устроена вселенная? или взглянем глобальнее на степень непонимания: вы бы поняли вообще о чем идет речь?

и отвечая на ваш вопрос:
значения в процедуры передаются как параметры - это один из базовых принципов программирования
Изменено: Ігор Гончаренко - 09.05.2020 21:22:05
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Фарит написал:
как организовать проверку условия и выполнять обработку данных 1 или 2 процедурой
Как это связано с темой сообщения?
И что, все-таки, Вы подразумеваете под передачу значений между процедурами? Процедура не живут сами по себе - она или выполняется, или нет, когда Вы вызвали вторую процедуру, первая продолжит выполняться только после завершения  второй.
У Вас в обеих процедурах организован цикл от 23 до 5000.  То есть вторая процедура будет при каждом вызове выполнять цикл от 23 до 5000. Даже если Вы ей каким-нибудь способом передадите переменную nrs.
Вам нужно переделать логику работы программы, например так (и, кстати, вариант обмена значениями между процедурами):
Код
Sub Макрос1()
  Dim nrs As Integer

  For nrs = 23 To 5000
    if (проверка условия) Then
      Call Обработка1(nrs)
'сюда вернется обработка после выполнения процедуры Обработка1
    Else
      Call Обработка2(nrs)
'сюда вернется обработка после выполнения процедуры Обработка2
    End If
  Next
End sub

Sub Обработка1(nrs As Integer)
'не используем For nrs ...!

End Sub

Sub Обработка2(nrs As Integer)
'не используем For nrs ...!

End Sub

 
Может я не правильно задаю вопрос. Попробую еще раз.
Есть электрические шкафы. В них автоматы, отмеченные как ввод и группа. Подсчет вводов и групп в шкафу с указанием названия шкафа или щита я организовал. Шкаф или щит может быть пластмассовым или железным. Для этого я указываю тип щита цифрой. Чередование щитов за ранее неизвестно. Если шкаф металлический, то нужно вставить после подсчета вводов и групп еще 2 строки, если пластмассовый, то ничего добавлять не надо. Проблема заключается в том, что никак не получается последовательно вставлять таблицы результатов. Происходит наложение, т.к переменная npp-номер строки не передает свое значение другой процедуре.
 
Фарит, о передаче переменных Вам уже много рассказали. Вы выходите за рамки темы.
Создайте новую по Вашей проблеме
 
Цитата
Фарит написал:
Проблема заключается в том,
что в очередной теме вы не показываете необходимый конечный результат
Соблюдение правил форума не освобождает от модераторского произвола
 
Идею понял попробую разобраться. Спасибо большое. Голова кругом и каша в голове. Необходимо все обдумать и структурировать
 
Цитата
Фарит написал:
вставлять таблицы результатов ... переменная npp-номер строки не передает свое значение другой процедуре
Есть также ещё такой вариант, что если ваша "передача переменных" больше связана с какими-то вычислениями, лучше использовать функции, которые будут вычислять правильные "вещи".
Код
Sub aaa()
    With Sheets("List1")
        .Range("B1").Value = funktsiya(.Range("A1").Value)
    End With
End Sub

Function funktsiya(peremenna)
    If Not IsNumeric(peremenna) Then
        funktsiya = "Ya byl tut v 'A1' -> 'Yeti, 2019'"
        Exit Function
    End If
    
    Dim rslt
    
    Select Case peremenna
        Case 0:         rslt = 0
        Case 1 To 9:    rslt = (peremenna * 5) + 24 - 1
        Case Else:      rslt = (peremenna * 5) + 1 - 4
    End Select
    
    funktsiya = rslt
End Function
Страницы: 1
Наверх