Страницы: 1
RSS
Передача данных переменной из одной процедуры в другую, В первом макросе переменная myTMes нормально возвращает значение. А дальше ничего..
 
Код
Вот, сам код как выглядит, подчеркнуты места, где находится переменная.




Option Compare Text
 Dim myTMes    ---ВОТ ЗДЕСЬ, ВНАЧАЛЕ Я ОБЪЯВИЛ ТЕМУ, КАК ОСИЛИЛ В ИНЕТЕ ,
=========================================================================

'В этом модуле происходит определение первой ячейки(вид инвойса) с кодом тнвед(макрос);
' все виды товаров здесь есть.Отсюда начинаем искать уже определенный вид товара и объяединять инвойсы по етоим признакам
'на каждый вид будет свой модуль, чтоби не путаться.

Sub ВидИнвойса(control As Office.IRibbonControl)
 Dim spec As Variant
'  ' проверяем на наличие тестеров:
' Set spec = ActiveSheet.Cells.Find(what:="Тестеры", LookAt:=xlPart, MatchCase:=False)
'    If Not spec Is Nothing Then
'    Application.ScreenUpdating = False
'    AA_Nad_ModuleSformi_A_Testera.LoopFilesTestera
'    End If
    Call ВидИнвойс
End Sub
  Sub ВидИнвойс()
    Dim KodVd As Variant
    
    Dim sh_res As Worksheet
    Dim Nachalo As Integer, lngKonec As Integer
    Dim myF As Range
    Dim myF2 As Range ' это для игрушек, у них нет столбца с ящиками
    Dim spec As Variant
    Set sh_res = ActiveSheet
    
      ' Откл. монитора.
   Application.ScreenUpdating = False
    ' отслеживаем столбец с названием, если не в столбце D, то добовляем-скрываем один столбец:
    Set myF = sh_res.Columns("D").Find("Код ТН ВЭД", , , xlPart)
    If myF Is Nothing Then
       sh_res.Columns("C").Insert
       sh_res.Columns("C").Hidden = True
    End If
    

    
'Cells(Columns(4).Find("Код ТН ВЭД").row + 2, Columns(4).Find("Код ТН ВЭД").Column).Select
'определяем первую ячейку с кодом тнвед:
' если на листе встречается слово тетсрры, то ето тестеры))):
           Set spec = ActiveSheet.Cells.Find(what:="Тестеры", LookAt:=xlPart, MatchCase:=False)
           If Not spec Is Nothing Then
           AA_Nad_ModuleSformi_A_Testera.LoopFilesTestera
           End If

KodVd = Cells(Columns(4).Find("Код ТН ВЭД*").row + 2, Columns(4).Find("Код ТН ВЭД*").Column).Value
Select Case KodVd
 ' 1)Алкоголь(вообще с воды начанием):
 Case 2202100000# To 2208909900#
 'MsgBox "это пойло!"
 ' ищем алкогольные инвойсы:
 Call AA_Nad_ModuleSformi_A_Alko.LoopFilesAlko
' 2)Сигареты:+ Стики:
Case 2402209000#
'MsgBox "это сигареты!"
AA_Nad_ModuleSformi_A_Sigi.LoopFilesSigi
' 2а)+ Стики:
Case 2403999009#
'MsgBox "это стики!"

AA_Nad_ModuleSformi_A_Stiki.LoopFilesStiki

' 3)Шоколадки (под шоколадками подразумеваются разные товары, а не только шоколад):
Case "0701100000" To "2106108000", 9500000000# To 9503999999#

' для игрушек смотрим столбци, если не хватает, то добовляем:
Set myF2 = sh_res.Columns("H").Find("кол-во", , , xlPart)
    If myF2 Is Nothing Then
       sh_res.Columns("F").Insert
       sh_res.Columns("F").ColumnWidth = 9.29
      ' sh_res.Columns("F").Hidden = True
       sh_res.Columns("F").Insert
       sh_res.Columns("F").ColumnWidth = 9.29
     '  sh_res.Columns("F").Hidden = True
   
     'заполняем названия столбцов:
    Nachalo = НачалоДанных
    lngKonec = КонецДанных

    With Range(Cells(Nachalo - 2, "F"), Cells(Nachalo - 2, "F"))
       .Borders.LineStyle = xlContinuous
       .Borders.Weight = xlMedium
       '.Interior.Color = 14994616
       .Value = "кол-во" & Chr(10) & "в коробке"
    End With
    With Range(Cells(Nachalo - 2, "G"), Cells(Nachalo - 2, "G"))
       .Borders.LineStyle = xlContinuous
       .Borders.Weight = xlMedium
       '.Interior.Color = 14994616
       .Value = "кол-во коробок"
    End With
    mesta
     End If
'MsgBox "это шоколадки!"
AA_Nad_ModuleSformi_A_Shok.LoopFilesShok
' 4)Парфюм(вполть до мыла):
Case 3302909000# To 3408900000#
'MsgBox "это порфюм!"
AA_Nad_ModuleSformi_A_Parff.LoopFilesParff
'5) Бижутерия:(от сумочек до прочих, маникюрный комлект=8214200000; зонт=6601910000; очки = 90 04 101000 to 90 04 909000
' зеркала=7009920000# ; кольца-кулоны=7117900000+ часи двух видов!
Case 4202210000# To 4205009000#, 8214200000#, 6601910000#, 9004101000# To 9004909000#, 7009920000#, 7117900000#
AA_Nad_ModuleSformi_A_Bijj.LoopFilesBijj
'6)ЧАСЫ(ОНИ КАК БИЖУТЕРИЯ ТОКЛЬКО ОТДЕЛЬНО ДЯДЯ НАДОБЛЯ):
Case 9102110000#, 9102120000#
AA_Nad_ModuleSformi_A_Watches.LoopFilesWatches
' 7)СИГАРЫ(ОНИ КАК БИЖУТЕРИЯ ТОКЛЬКО ОТДЕЛЬНО ДЯДЯ НАДОБЛЯ):
 Case 2402100000#
 AA_Nad_ModuleSformi_A_Sigari.LoopFilesSigari
Case Else
 MsgBox "я не знаю, чё ет за код такой(!"
End Select
End Sub
'запоминаем количество мест в переменную myTMest :
Sub mesta()
Dim myFMest As Range
Dim myTMest As Range
Dim shFrom As Worksheet, thisB As Workbook
Set shFrom = ActiveSheet
Set thisB = ActiveWorkbook
Dim shTo As Worksheet
Dim wbTo As Workbook
Dim Wb As Workbook
Dim myF As Range
Dim stype As String

Set myTMest = Cells.Find("Кол-во мест", , , xlPart)
  myTMes = myTMest.Offset(0, 3).Value    ================== ВОТ ЭТА ПЕРЕМЕННАЯ, В ЭТОМ МОДУЛЕ ВСЁ НОРМАЛЬНО
============================================================================================================

 ' End If
  End Sub
ВОТ СЛЕДУЮЩАЯ ПРОЦЕДУРА, КУДА НУЖНЫ ДАННЫЕ ИЗ ПЕРЕМЕННОЙ ЭТОЙ:


Option Explicit
Dim myTMes - Я ЗДЕСЬ ТОЖЕ В НАЧАЛЕ ОБЪЯВИЛ, НО НИФИГА ЧЁТА((
==================================================================

' Вкладка "Шоколадки" - группа "Шоколадки" - "Сумма".
' Макрос работает с активным листом.
' Макрос обрабатывает лист после макроса "Сортировка".

' Вставка формул под каждым товаром.

'Sub Main(myControl As Office.IRibbonControl)- откзаываемся от кнопки
    Sub ChockSumm()
    Dim shAct As Excel.Worksheet, tbl As Excel.Range
    Dim arrB() As Variant, cn As New Collection
    Dim lngHRow As Long, lngLRow As Long
    Dim i As Long, r As Long
    Dim k As Long
    Dim Nachalo As Integer, lngKonec As Integer
    Dim rCell As Range, spec As Variant, specF As Variant
     ' Поиск первой и последней строки.
    Nachalo = НачалоДанных
    lngKonec = КонецДанных
    
    '1. VBA-наименование активного листаи присвоение имени
    Set shAct = ActiveSheet
    If shAct Is Nothing Then
        Exit Sub
    End If
    
    '2. Отключение монитора.
   ' Application.ScreenUpdating = False
    
    '3. Поиск шапки и низа таблицы.
    Call S_Hr.Function2(shAct, lngHRow, lngLRow)
    
    '4. Vba-именование таблицы.
        ' В таблицу включается строка, которая находится под таблицей.
    Set tbl = shAct.Rows(lngHRow & ":" & lngLRow + 1)
    
    '5.
    ' Копирование столбца B в массив "arrB".
    ' Подготовка данных к сравнению.
    arrB() = tbl.Columns("B").Value
    For i = 2 To UBound(arrB, 1) Step 1
        arrB(i, 1) = CStr(arrB(i, 1))
    Next i
    
    '6. Запись номеров пустых строк в коллекцию.
        ' Во вторую строку формула не вставляется, но эта строка нужна
        ' для составления формулы под первым товаром.
    For i = 2 To UBound(arrB, 1) Step 1
        If arrB(i, 1) = "" Then
            cn.Add Item:=i
        End If
    Next i
    
    '7. Вставка формул.
    
    ' В коллекции находятся два вида пустых строк:
        '1) строки-заголовки групп;
        '2) строки, которые находятся под товарами.
    ' В коллекции первая пустая строка - это строка-заголовок. В неё не надо вставлять формулы.
    For i = 2 To cn.count Step 1
    
        ' Запись порядкового номера эксель-строки в переменную для удобства.
        r = cn(i)
        
        ' Пустые строки-заголовки пропускаем.
            ' Они определяются по двум подрядстоящим пустым строкам.
        If arrB(r - 1, 1) <> "" Then
      Stop
            ' Вставка формул.
            tbl.Range("J" & r).Resize(1, 2).FormulaR1C1 = "=SUM(R[-" & r - cn(i - 1) - 1 & "]C:R[-1]C)"
            If tbl.Range("J" & r) = 0 Then
            tbl.Range("J" & r) = myTMes - ПУСТО, ВООБЩЕ НИЧЕГО НЕ ПЕРЕДАЁТ СЮДА
            ============================ =========================================
            End If
 
Пошаговый проход по коду (F8) в помощь. В окне Locals смотрите что у вас в переменной.
 
Цитата
V написал:
Пошаговый проход по коду (F8
я второй день жму на F8. В первой процедуре всё нормально: переменная возващает как  в самом макросе, так и в шапке нужные значения

а вот в следующей процедуре эта переменная пустая,

Спасибо за ценный совет по нажатию на ф8.
Изменено: Домкрат - 06.11.2020 13:40:52
 
Цитата
Домкрат написал:
Спасибо за ценный совет по нажатию на ф8.
А сарказм здесь неуместен: откуда V мог знать, что Вы в курсе про F8?
Попробуйте использовать глобальную переменную.
 
вопрос был не про ф8, вообщето. Если , конечно, уважаемый V читал  название темы.

Цитата
Юрий М написал: Попробуйте использовать глобальную переменную.
где именно? я уже везде, где только можно объявил. Одно могу сказать: при переходе в следующий модуль все данные обнуляются.
 
Перед самой первой процедурой напишите public myTMes as rage. Там, где у Вас сейчас Dim myTMes
 
уважаемый Домкрат,
а в чем вопрос?
передача переменных в процедуры - это одна из основ, на которой держится программирование и из-за которого все это имеет смысл
понимаете когда на калькуляторе нужно вычислить полином от Х в шестой степени с семью заданными коэффициентами
вы еще посчитаете такое 2-3 раза
но если нужно считать 100 или 1000 раз значение этого полинома при разных Х, вы устанете стучать как дятел по клавишам, сделаете кучу ошибок, набирая цифры, некоторые ошибки не заметите.... начнете сначала по-тихоньку, а потом все громче проклинать калькулятор, математику, полиномы, жизнь...
то в программировании вы 1 раз набираете формулу для вычисления этого полинома, а потом хоть 1000 хоть сколько угодно раз вычисляете его для разных Х, как раз передавая Х как параметр в функцию вычисления этого самого полинома. где сложность?

а у вас что за вопрос?
и для примера достаточно двух процедур с 5-ю строками кода в каждой для демонстрации сути проблемы
для этого не нужны километровые простыни кода, где в какой-то одной из строк проблема

что вы пытались сделать и что не получилось? сможете обьяснить простыми словами - скорее всего получите ответ на свой вопрос, а не сможете ....
можете еще несколько дней жать F8 в надежде, что когда-то все сработает так как было задумано
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Юрий М,  написал перед процедурой: Public myTMes As Range
тогда вот эту строку красит жёлтым:
myTMes = myTMest.Offset(0, 3).Value - объект типо не установлен
Изменено: Домкрат - 06.11.2020 14:07:26
 
Цитата
Ігор Гончаренко написал:
сможете обьяснить простыми словами
пременная обнуляется при попытке передать данные в другую процедуру.
 
Файл секретный? Если нет, то в студию его.
Изменено: V - 06.11.2020 14:17:34
 
У Вас переменная - диапазон. Сначала нужно его установить (Set). А уже ДРУГОЙ переменной присвоить значение ячейки, отстоящей на 3 столбца правее от Вашей переменной/
 
переменные  САМИ не обнуляются при передаче в другие процедуры
пока ничья 1:1, и пока у вас как не было результат, так его и нет

и результата не будет пока вы не перестанете всем делать одолжение выдавливая из себя скупые фразы обьясниний, которые по факту ничего не обьясняют
и пока не обьясните что хотите сделать и на небольшом примере, сделанном специально для этом темы не покажете что вы делаете и что не получается
Изменено: Ігор Гончаренко - 06.11.2020 14:30:37
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
V написал:
Файл секретный?
нет, не секретный, проста надстройка весит 5 бм.
я вытащил два модуля в файл которые нужны сейчас. вот он.
 
передать значение переменной из одного модуля в другой.

Цитата
Ігор Гончаренко написал: пока не обьясните что хотите сделать
макрос обрабатывает несколько файлов, в одном из них может не хватать нескольких столбцов, из-за этого кол-во мест нужно брать из строки под таблицей.
В одном макросе я записываю это количество мест. Далее, мне нужно его запомнить, и когда при окончательной обработке обнаружится, что в столбце J пусто, то в итоговою строку подставить значение из переменной, из первого макроса. Само суммирование будет делать другой макрос.

Цитата
Ігор Гончаренко написал: пока ничья 1:1
Вы это о чём сейчас??? Любите футбол?
 
Доброе время суток
Цитата
Домкрат написал:
Dim myTMes    ---ВОТ ЗДЕСЬ, ВНАЧАЛЕ Я ОБЪЯВИЛ ТЕМУ, КАК ОСИЛИЛ В ИНЕТЕ ,
В приложенном файле нет такой переменной модуля AA_Nad_ModuleSformi_A_Shok, есть только
Код
Option Compare Text
Public myTMest As Range

Далее, нигде нет в этом модуле присвоения какого-либо значения переменной. В процедуре Sub mesta1() есть только её затенение
Код
'запоминаем количество мест в переменную myTMest :
Sub mesta1()
Dim myFMest As Range
Dim myTMest As Range 'локальная переменная затеняет глобальную переменную модуля myTMest
Домкрат, зачем в таком случае наводить тень на плетень?
 
в одном из стандартных модулей обьявляете переменную
Public МояПеременная as Какого-тоТипа

все. суть публичной переменной ЕЕ НЕ НУЖНО НИКУДА ПЕРЕДАВАТЬ, она известна во всех модулях данного проекта
пользуйтесь ею в любом модуле, в любой процедуре, она уже известна ВСЕМ!

есть одни грабли
в любой процедуре вы можете обьявить локальную переменную с таким же именем
и тогда нужно понимать что в этой процедуре МояПеременная - это уже локальная МояПеременная, а не та публичная МояПеременная
к той МояПеременная в этой процедуре нужно обращаться ИмяМодуляВКоторомОбьявленаПеременная.МояПеременная
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Андрей VG написал:
В приложенном файле нет такой переменной
хорошо, а как правильно нужно объявить тогда?
 
Цитата
Ігор Гончаренко написал:
ИмяМодуляВКоторомОбьявленаПеременная.МояПеременная
так: AA_Nad_ModuleSformi_A_Shok.myTMes = myTMest.Offset(0, 3).Value
?
Изменено: Домкрат - 06.11.2020 15:01:09
 
Домкрат,  посмотрите, как это выглядит в общем случае (выполните макрос Main).
 
Юрий М, ну , сделал по вашим мотивам:
 
да, правильно
только не найден метод или член данных (так написано)))
и кроме того MyTMes и MyTMest - это переменные с разными именами и можно не заморачиваться с именем модуля
Изменено: Ігор Гончаренко - 06.11.2020 15:27:45
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
В моём файле переменная во второй процедуре видна? Значит сделали не всё правильно. А Ваш скрин вообще ни о чём.
 
Цитата
Юрий М написал:
А Ваш скрин вообще ни о чём.
Юрий М, я решил использовать именно так: Public МояПеременная, далее в коде, ищем места: МояПеременная = myTMest.Offset(0, 3).Value, и если пусто, то подставляем в другом модуле вот так:
Код
If tbl.Range("J" & r) = 0 Then
            tbl.Range("J" & r) = МояПеременная
заработало. ОДИН В ОДИН зделано как на цитата:". А Ваш скрин вообще ни о чём", только имя переменной поменял на Ваше.

Возвращает теперь как надо, остальное в понедельник уже добью, Спасибо Юрий!
Страницы: 1
Наверх