Страницы: 1
RSS
Почему переменная теряет свое значение?
 
сам код большой, пременная contract строка 18 , когда дело доходит до 92 строки - обнуляется. Что можно с этим сделать, чтобы значение оставалось?
в 92 строке два варианта существует для активации листа по имени... кто хелпнет?
Код
Sub LoopFilesAlko22()
    Dim myFSO As Object, myFolder As Object, myFile As Object
    Dim sh_act As Worksheet, rng_res As Range, res()
    Dim bk As Workbook, Sh As Worksheet
    Dim arr(), r As Long, i As Long, j As Long
    Dim ИМЯКНИГИ As String
    Dim ИМЯЭТОЙКНИГИ As String
    Dim KodV As Variant
    Dim myF As Range
    Dim shFroml As Worksheet
  ИМЯЭТОЙКНИГИ = ActiveWorkbook.name ' ЭТО Я ТЕСТИРУЮ.
  a = Cells.Find("*контра*").Offset(0, 1).Address
  Range(a) = LTrim(RTrim((Range(a))))
 
' ВОТ ЭТА ПЕРЕМЕННАЯ "contract" , КОГДА ДЕЛО ДОХОДИТ ДО 92 строки: If LCase(myFile.name) Like "LT_*" Then
   Set contract = Cells.Find("*контра*").Offset(0, 1) ' объявляем контракт, со здвигом сразу правее на одну ячейку

    ' Откл. монитора.
    Application.DisplayAlerts = False
    
    '3. Создание объекта для работы с папками и файлами.
    Set myFSO = CreateObject(Class:="Scripting.FileSystemObject")
    
    '4. Создание ссылки на папку, в которой находятся инвойсы.
        ' Путь определяется по активному файлу.
    Set myFolder = myFSO.GetFolder(ActiveWorkbook.Path)
    
    '5. Проверка, что нужные файлы не открыты, чтобы не было непредвиденных ситуаций.
        ' Открытым будет только один инвойс, который будет активным.
    For Each myFile In myFolder.Files
        For Each bk In Workbooks
            If bk.FullName <> ActiveWorkbook.FullName Then
                If bk.name = myFile.name Then
                    Application.ScreenUpdating = True
                    MsgBox "Закройте файлы, которые находятся в новой папке." & vbCr & _
                        "Открытым должен быть только один инвойс из новой папки.", vbExclamation
                    Exit Sub
                End If
            End If
        Next bk
    Next myFile
    
'---------------------------------------------------------------------------------------------------------------------
    '6. Сбор информации.
        ' Если в каком-то иновойсе в "G3" не пусто, значит макрос нужно остановить,
        ' т.к. работа уже была сделана.
     ' =========================================================================================
     ' ПОВТОР ПО-НОВОЙ
    '3) Извлечение данных из закрытых инвойсов.
    For Each myFile In myFolder.Files
     ИМЯКНИГИ = ActiveWorkbook.name
     ActiveWorkbook.Save
     
        ' Активный файл пропускаем.
        If myFile.name = ActiveWorkbook.name Then
      
             ' Следующий инвойс.
            
            GoTo metka_NextFile
            
        End If
        
        ' Скрытые файлы пропускаем.
        If (GetAttr(myFile.Path) And vbHidden) <> 0 Then
            GoTo metka_NextFile
        End If
            
        ' Смотрим расширение.
        If Not LCase(myFile.name) Like "*.xls*" Then
            GoTo metka_NextFile
        End If
        ' Смотрим спецификацию.
        If LCase(myFile.name) Like "*specifikacija*" Then
         GoTo metka_NextFile
        End If
        'определяем еслить ли лист в книге, если нет,- следующий файл:
         d = "инвойс"
         On Error Resume Next
         Set wsSheet = Sheets(d)
         If Err.number <> 0 Then
         ActiveWindow.Close savechanges:=False
         GoTo metka_NextFile
         End If
        ' Определяем с каким листом будем работать: отказ: итак буду на етом листе находится!
        'If ActiveSheet.name = "спецификация" Then  только эту строчку коментим,- ниже влияет на всё!
        '========================================================================================
        ' походу из=за этого момента пременная contract теряет свое значание
         If LCase(myFile.name) Like "LT_*" Then
           Set Sh = Workbooks.Open(filename:=myFile.Path, ReadOnly:=False).Worksheets("инвойс")
           Else
         Set Sh = Workbooks.Open(filename:=myFile.Path, ReadOnly:=False).Worksheets("спецификация")
         End If
         '========================================================================================
        
        
'         If ActiveWorkbook.Sheets.count = 1 Then
'         Set Sh = Workbooks.Open(filename:=myFile.Path, ReadOnly:=False).Worksheets("инвойс")
'         If ActiveWorkbook.Sheets.count > 1 Then
'          Set Sh = Workbooks.Open(filename:=myFile.Path, ReadOnly:=False).Worksheets("спецификация")
'         d = "спецификация"
'         On Error Resume Next
'         Set wsSheet = Sheets(d)
'         If Err.number <> 0 Then
'         ActiveWindow.Close savechanges:=False
'         GoTo metka_NextFile
'         End If
           
           'End If
        Sh.Activate
         'определяем еслить ли лист в книге, если нет,- следующий файл:
         d = "инвойс"
         On Error Resume Next
         Set wsSheet = Sheets(d)
         If Err.number <> 0 Then
         ActiveWindow.Close savechanges:=False
         GoTo metka_NextFile
         End If
        ' метка есть- пропускаем файл
        If ActiveSheet.Range("B5").Interior.Color = 16115929 Then
        GoTo metka_NextFile
        End If

        
        ' если метки нету,- , можно с файлом работать!
        If ActiveSheet.Range("B5").Interior.Color <> 16115929 Then
        'MsgBox "это он"
        ' ==========================================================================
        '        '========================================
        'тема контрактов: ПОКА НЕ ЗНАЮ КУДА СТВИТЬ ЭТУ 
        ' удоление лишних пробелов вначале и конце  контракта:
          b = Cells.Find("*контра*").Offset(0, 1).Address
          Range(b) = LTrim(RTrim((Range(b))))
          'определяем номер контракта нового инвойса
         Set contractt = Cells.Find("*контра*").Offset(0, 1) ' объявляем контракт, со здвигом сразу правее на одну ячейку
         ' проверяем контракты:
         If contract <> contractt Then 'если номера контрактов несовпадают, - пропускаем это файл
    

         MsgBox "эти контракты несопасдают:" & contract & contractt

        ' Stop
         ActiveWindow.Close savechanges:=False
         GoTo metka_NextFile
         End If

'
'        '========================================
        
          Windows(ИМЯКНИГИ).Close savechanges:=True
          ' ЗАКРЫВАЕМ ВСЕ ОТКРЫТЫЕ КНИГИ, КРОМЕ АКТИВНОЙ.
          CloseAllWorkbooks_Save ' игоряшин макрос)))))
          
     
        End If

metka_NextFile:
    Next myFile
    Application.ScreenUpdating = True
  ' =========================================================================================
     ' КОНЕЦ ПОВТОРА ПО-НОВОЙ
' удоляем лишние листы в мастер-инвойсе, между активным листом и последним:
' в остальных видах товаров я сам макрос не буду копирувать, только запуск.
DeleteRightSheets
'metka_N:
End Sub
Изменено: Домкрат - 03.05.2020 20:19:20
 
Зачем вам contract как объект, также как и contractt ? Правда скорее всего это не поможет.
По вопросам из тем форума, личку не читаю.
 
БМВ,
Цитата
БМВ написал:
Зачем вам contract как объект
я использую, из того что есть. Сам код вполне работает, пока не начал мутить тему с проверкой контрактов, после этого переменная стала обнуляться, причем если я напрямую напишу запуск активного листа, вот так:
Код
Set Sh = Workbooks.Open(filename:=myFile.Path, ReadOnly:=False).Worksheets("инвойс")
то переменная остается в нормальном виде , со значением.
Изменено: Домкрат - 03.05.2020 19:45:38
 
а вы поставьте брейкпоинт в строке 93
и увидите, что к моменту выполнения этого кода ваш contract уже Nothing
получилось? (это увидеть)

Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, да, вижу, я же об этом сразу и сказал..
Изменено: Домкрат - 03.05.2020 19:54:27
 
ну  и говорю, сперва уберите SET перед contract.
По вопросам из тем форума, личку не читаю.
 
БМВ, теперь,- да всё супер, я поправил в коде уже, СПАСИБО!
Страницы: 1
Наверх