Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Запуск макроса при добавлении, обновлении или изменении файла в папке
 
Привет всем! Столкнулся с такой ситуацией: есть файл с макросом, есть файл с исходными данными, из которого макрос по нажатию кнопки забирает данные. Изначально это работает так, что сначала файл с исходными данными, создаётся или обновляется/изменяется или заменяется новым. После этого в файле с макросом, нажимается кнопка и все данные из файла с исходными данными идут в нужное место. Подскажите как можно это сделать без нажатия кнопки, что бы при копировании файла с исх данными в папку происходило чудо) файл с макросом изначально открыт и все данные из файла с исх данными идут в него. Заранее спасибо)
 
Когда файл с макросом закрыт, Вы все равно не видите данные. Обновлять по событию откртия книги.
 
А другие то есть варианты? Книга с макросом изначально открыта, это принципиально важно
 
А почему кнопку обижаете? )
Силой мысли не получится запустить макрос - нужно какое-нибудь событие. Какое - выбирать Вам.
 
Юрий М, да, вот и я про то же, как определить изменение или замену файла событием для запуска макроса?)
Изменено: BeatCrusher - 11 Сен 2018 12:36:04
 
А вариант запуска макроса-сборщика на событие закрытия книги не подойдёт?
 
Цитата
BeatCrusher написал:
сначала файл с исходными данными, создаётся или обновляется/изменяется или заменяется новым
1. файл не может сам создаваться или обновляться/изменяться или заменяться новым. Это с файлом делает кто-то (или что-то).
2. макрос Excel срабатывает только на события Excel.
3. отсюда следует, что если этот кто-то (что-то) - не Excel (или не другая программа, в которой предусмотрено программирование с использованием объектной модели Excel), то ничего не получится.
Изменено: Михаил Лебедев - 11 Сен 2018 13:17:26
 
BeatCrusher, можно раз в минуту (или секунду) проверять дату последнего изменения файла с данными. Если значение изменилось, то запустить процедуру обработки данных и запомнить новую дату последнего изменения.
 
Запускать макрос при изменении данных в книге-источнике (макрос - в этой книге).
 
Или как вариант, если файл с данными изменяется, но не сохраняется — проверять какую-то характеристику содержания файла, которая не может не измениться при его изменении. Что-то вроде контрольной суммы.
 
Вить, твой вариант из #9 не подойдёт:
Цитата
BeatCrusher написал:
сначала файл с исходными данными, создаётся или обновляется/изменяется или заменяется новым.
 
Юрий М, по сути он лежит там постоянно, люди постоянно заменяют его на файл с таким же именем
 
Казанский, класс! Что надо написать что бы макрос это делал?
 
Цитата
BeatCrusher написал:
люди постоянно заменяют его на файл с таким же именем
Но в нём же не будет макроса, который будет отслеживать изменения?
 
Юрий М, нет. Все макросы в соседнем файле в этой же папке
 
Вот я об этом и говорю. Значит, нужно из другой (внешней) процедуры отслеживать изменения, произошедшие в книге-доноре. Почитайте эту статью - может подойдёт?
 
BeatCrusher, делал подобное недавно: http://www.cyberforum.ru/vba/thread2276098.html#7
Там не только DateLastModified проверяется, но и содержимое файла, что Вам не нужно.
На VBA надо будет использовать Application.Ontime, а не задержку WScript.Sleep - поищите на форуме.
 
можно конечно все усложнить и сделать на основе  этого
 
И всё это из-за того, что трудно нажать кнопочку )
 
Юрий М, А как же прогресс, автоматизация? :-)
 
Казанский, сейчас возможно будет глупый вопрос... А это писать в код книги или модуля? И если я правильно понял надо создавать отдельный текстовый файл, чтобы туда записывать последнюю дату изменения?
 
Цитата
БМВ написал:
можно конечно все усложнить и сделать на основе   этого
Здравствуйте, коллеги! В замечательном методе Андрея как раз все просто с точки зрения пользователя (и процессор не греется :) ).
Изменено: sokol92 - 11 Сен 2018 15:30:33
Владимир
 

Всем, доброго дня! Попробовал вчера сделать что-то по аналогии с решением Казанского, работает криво, таблица обновляется, но потом всё зависает и приходится останавливать. М
Могу только догадываться что Application.Ontime стоит не там или аргументы введены неверно, проверьте пожалуйста)

Код
Sub Check_File()
Const FILE_PATH = "\\путь к файлу\таблица.xlsx"Dim dT, oDS    Set oDS = CreateObject("scripting.filesystemobject")
        
    Do
        If oDS.FileExists(FILE_PATH) Then
            With oDS.GetFile(FILE_PATH)
                If .DateLastModified <> dT Then
                    dT = .DateLastModified
                    Application.Run ("Извлечение_данных")
                End If
            End With
        End If
    Application.OnTime Now + TimeValue("00:01:00"), "Check_File"
    LoopEnd Sub

Изменено: BeatCrusher - 12 Сен 2018 13:08:02
 
BeatCrusher, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
Тег VBA.jpg (19.2 КБ)
 
Цитата
Юрий М написал:
исправьте своё сообщение.
Готов
 
BeatCrusher,
Код
'код обычного модуля

Public nextRun, dT, dT1

Sub Check_File()
Const FILE_PATH = "\\путь к файлу\таблица.xlsx"
  If Len(Dir(FILE_PATH)) Then
    dT1 = FileDateTime(FILE_PATH)
    If dT1 <> dT Then
      Application.Run ("Извлечение_данных")
      dT = dT1
    End If
  End If
  Application.OnTime Now + #12:01:00 AM#, "Check_File"
End Sub

'код модуля ЭтаКнига

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  On Error Resume Next
  Application.OnTime nextRun, "Check_File", , False
End Sub
Изменено: Казанский - 13 Сен 2018 14:53:18
Страницы: 1
Читают тему (гостей: 1)
Наверх