Sebelumnya maaf mas @Petter Jo... saya bukan sepuh, cuma mau bantu :) Menurut saya, untuk kasus di atas bisa dilakukan dengan tahapan:
Pertama, untuk mengawasi folder yang selalu update setiap 5 menit, bisa dibuatkan pewaktu dengan interval waktu 5 menit. Misalkan, pada sebuah module disusun kode VBA:
Option Explicit
Private m_bTimerRunning As Boolean
Public Sub ActivateTimer()
If (Not m_bTimerRunning) Then
'+--- Atur interval pewaktu 5 menit.
Application.OnTime Now() + TimeValue("00:05:00"), "TimerCallback"
m_bTimerRunning = True
Else
m_bTimerRunning = False
End If
End Sub
Private Sub TimerCallback()
'+-- Proses jika pewaktu aktif.
If m_bTimerRunning Then
'+-- Lakukan proses!
Sheet2.Range("B2").Value = Format(Now, "dd/mm/yyyy hh:mm:ss")
'+-- Jadwal ulang pewaktu.
Application.OnTime Now() + TimeValue("00:05:00"), "TimerCallback"
End If
End Sub
Pada prosedur TimerCallback, dibawah komentar Lakukan proses!, hapus baris kode:
Sheet2.Range("B2").Value = Format(Now, "dd/mm/yyyy hh:mm:ss")
dan ganti dengan kode yang akan memeriksa file pada folder yang kita tentukan. Prosedur ActivateTimer bisa dipanggil secara manual, misalkan menggunakan tombol dan sebagainya, atau dbuat otomatis misalnya dipanggil pada prosedur Workbook_Open.
Kedua, bagaimana mengendalikan file-file yang ada dalam folder. Untuk kasus ini, menurut saya ada 3 konsep yang bisa diterapkan:
1. Dengan membuat daftar nama file pada sebuah sheet (menggunakan VBA) , kemudian periksa apakah nama file sudah ada pada daftar. Jika belum, maka lakukan proses tahap kedua di atas. Contoh skrip yang bisa digunakan:
Private Sub GetFileNames()
Dim bProcess As Boolean ' Penanda apakah akan dilakukan proses.
Dim lListCount As Long ' Jumlah daftar nama file.
Dim lInList As Long ' Penanda apakah file ada pada daftar.
Dim lRow As Long ' Baris sel daftar nama file.
Dim sFile As String ' Nama file.
'+-- Daftar nama file sudah ada isinya?
lListCount = Application.CountA(Sheet2.Range("B:B")) - Application.CountA(Sheet2.Range("$B$1:$B$5"))
lRow = 6
'+-- Ambil nama file pada folder dan tipe file data.
sFile = Dir("F:\WorkOn.Office\Ms.Excel\Data\")
Do While (sFile <> "")
bProcess = True
'+-- Jika sudah ada daftar nama file.
If (lListCount > 0) Then
'+-- Apakah nama file ada pada daftar file?
lInList = Application.CountIf(Sheet2.Range("DataFileList"), sFile)
If (lInList > 0) Then
'+-- Tandai file sudah diperiksa.
Sheet2.Cells(lRow, 3).Value = Format(Now, "dd/mm/yyyy hh:mm:ss")
Sheet2.Cells(lRow, 4).Value = "CHECKED"
'+-- Tandai tidak perlu diproses.
bProcess = False
End If
End If
'+-- Jika harus diproses.
If bProcess Then
'+-- Lakukan proses yang diperlukan!
'+-- Tandai file sudah diproses.
lListCount = Sheet2.Range("DataFileList").Rows.Count + 6
Sheet2.Cells(lListCount, 2) = sFile
Sheet2.Cells(lListCount, 3).Value = Format(Now, "dd/mm/yyyy hh:mm:ss")
Sheet2.Cells(lListCount, 4).Value = "PROCESSED"
End If
'+-- Ambil jumlah daftar untuk periksa ulang.
lListCount = Sheet2.Range("DataFileList").Rows.Count
'+-- Tambah baris selanjutnya.
lRow = lRow + 1
'+-- Ambil nama file selanjut.
sFile = Dir
Loop
End Sub
Catatan:
Skrip di atas masih banyak kekurangan, antara lain tidak ada baris kode untuk memeriksa baris kosong pada daftar nama file. Dan nama range DataFileList diatas merupakan nama range dinamis dengan definisi Refers To menggunakan formula:
=OFFSET(Source!$B$6;0;0;COUNTA(Source!$B:$B)-COUNTA(Source!$B$1:$B$5);3)
2. Memindahkan file yang sudah diproses ke folder lainnya. Contoh skripnya:
FileCopy "D:\Folder Data\Abc-2017070421501.xls", "D:\Folder Data\Data Lama\Abc-2017070421501.xls"
3. Mengubah nama nama file yang sudah diproses. Contoh skripnya:
Name "D:\Folder Data\Abc-2017070421501.xls" As "D:\Folder Data\Old_Abc-2017070421501.xls"
Untuk konsep kedua dan ketiga, tentunya diperlukan proses sebelum dan sesudahnya. Tinggal disesuaikan dengan kondisi dan kebutuhannya.
Ketiga, mengenai file datanya. Saya tidak tahu bagaimana bentuk file datanya, apakah setiap file memang memiliki isi yang berbeda, ataukah file yang terakhir hanya berisi penambahan isi data dari file-file sebelumnya (jadi ada baris data yang sama). Bisa saja dibuatkan 1 sheet khusus untuk menampung seluruh data, tentunya dengan pertimbangan seberapa banyak jumlah data dalam tiap file. Atau misalkan saja isi dari tiap file hanya berbeda pada baris terakhir (artinya ada update data yang baru), maka kode VBA-nya mungkin cukup menyalin (mengcopy) baris terakhir saja atau salin isi satu sheet dan timpakan (overwrite) pada sheet data yang aktif atau disusun kode untuk membandingkan isi data perbaris. Dalam hal ini, keputusan bagaimana data akan diproses tentunya akan membuat perbedaan susunan kode VBA-nya.
Dari ketiga tahapan di atas, alur prosesnya dimulai dari prosedur ActivateTimer yang akan mengaktifkan pewaktu untuk memanggil prosedur TimerCallback setiap kali interval waktu tercapai. Kemudian dari prosedur TimerCallback, bisa disusun prosedur untuk memproses file pada folder data, atau memanggil prosedur GetFileNames pada tahap kedua di atas dimana bisa disisipkan skrip untuk memproses tahapan ketiga.
Untuk saat ini demikian gagasan yang bisa saya bagi. Semoga mas @Petter Jo bisa punya gambaran sehingga bisa menyelesaikan skrip VBA-nya dan tentunya bisa dibagi disini... ;) Semoga bermanfaat juga bagi rekan-rekan lainnya. Atau mungkin ada rekan-rekan lain yang bisa berbagi solusi yang lebih efektif.