Как скопировать данные только из файлов Excel в папку, которые не были обновлены / изменены после их первоначального сохранения? - PullRequest
0 голосов
/ 29 июня 2019

Я хочу скопировать данные из различных файлов Excel, которые находятся в папке, в мастер-файл, и с помощью имеющегося у меня кода я могу это сделать. Однако я сталкиваюсь с двумя проблемами при использовании одного и того же.

1: поскольку макрос запускается каждый раз, когда открывается главный файл, данные из последних файлов снова обновляются (если они обновлялись ранее)

EG: у меня есть file1.xlsx и file2.xlsx в папке. Я хочу скопировать данные из этих файлов и вставить их в мой masterfile.xlsm. Я открываю masterfile.xlsm, и макрос запускается и выполняет работу. Теперь, когда я добавляю file3.xlsx в папку и открываю masterfile.xlsm, данные из file3.xlsx get копируются и вставляются в masterfile. НО, когда я открываю мастер-файл во второй раз и предполагая, что file4.xlsx еще не добавлен в папку, макрос запускается и копирует данные из file3.xlsx СНОВА, так как это последний файл в папке. (Код, который я использовал, приведен ниже)

Sub up()

    Dim MyFile As String, myrecfile As String, mymostrecfile As String
    Dim recdate As Date
    Dim mydir As String
    mydir = "C:\Users\National\Desktop\TEST Codes\PO\Excel\"
    Dim fileext As String
    fileext = "*.xls"

    If Right(mydir, 1) <> "\" Then mydir = mydir & "\"
    MyFile = Dir(mydir & "*.xls")
    If MyFile <> "" Then
           myrecfile = MyFile
           recdate = FileDateTime(mydir & MyFile)
            Do While MyFile <> ""
                If FileDateTime(mydir & MyFile) > recdate Then
                myrecfile = MyFile
                recdate = FileDateTime(mydir & MyFile)
                End If
            MyFile = Dir
            Loop
    End If

    mymostrecfile = myrecfile

    If mymostrecfile = "" Then
        Exit Sub
        Else
        'do stuff
        Application.ScreenUpdating = False
        Workbooks.Open Filename:=mydir & mymostrecfile, ReadOnly:=True

        Sheets("DETAILED").Range("A3:S15").Copy

        Application.DisplayAlerts = False
        ActiveWorkbook.Close



        Dim LastRow As Long, WS As Worksheet, LS As Long
        Set WS = Workbooks("Z master for PO").Worksheets("sheet1")
        LastRow = WS.Range("R" & Rows.Count).End(xlUp).Row + 1
        WS.Activate
        WS.Range("A" & LastRow).Select

        ActiveSheet.Paste Destination:=WS.Range("A" & LastRow)
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        Application.DisplayAlerts = True

        Application.CutCopyMode = False

    End If
End Sub

2: если файлы соответствуют условиям времени в коде, они обновляются. Но, если мастер-файл обновляется через некоторое время, такие файлы пропускаются, чтобы удовлетворить условию времени, и данные из этих файлов не обновляются.

EG: из-за первой проблемы, которую я пытался https://stackoverflow.com/a/56749203/9124181 (Спасибо @Tim Stack за это) Однако я столкнулся с другой проблемой. В коде, присланном мне Тимом, я смог добиться того, чего хотел, но что если я открою мастер-файл, скажем, через час? или вечером? Возможно, мне придется проверять и обновлять мастер-файл в любое время, но только данные из файлов, к которым обращались менее 5 минут назад, будут обновлены. Теперь я всегда могу изменить «время последнего доступа» на 10 минут или любое другое число по своему выбору. Однако время сохранения файлов в папке и время обновления мастер-файла является переменным. Мастер-файл может быть обновлен в течение минуты после сохранения файла Excel или может не обновляться даже в течение нескольких часов. В таком случае ограничение времени 5/10/15 минут не будет работать. (Пожалуйста, проверьте ссылку для кода)

Единственный способ, о котором я могу думать прямо сейчас, - это копировать данные только из тех файлов Excel, которые не были обновлены / открыты / изменены после первоначального сохранения.

Как мне это исправить? Есть ли лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...