Vbsscript case read filename/change

  1. tahun lalu

    Halo sepuh-sepuh

    Saya punya case nih buat vbscript
    Saya memiliki folder yang tiap 5 menitnya akan muncul file baru yang berisikan data
    Saya bingung cara untuk membaca semua data yang didlm folder nya bagaimana karena nama file nya berbeda-beda, apakah bisa kita masukkan ke 1 file yang dot menampung isi dari semua data yang akan muncul nanti nya
    Nama file yang muncul akan unique seperti
    Abc-2017070421501 dan akan random angka nya untuk file yang akan muncul selanjutnya
    Abc-2017070423001.

    Apakah sepuh mungkin pnya cara yg lain dan efektif untuk membaca file yang akan update didalam folder tersebut?

  2. Caton

    10 Jul 2017 Terverifikasi Indonesia + 12.596 Poin

    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.

  3. Halo , Caton , terimakasih sarannya hihihi
    Kondisi nya data tersebut tiap beberapa menit akan muncul dihanya satu folder dengan nama yang berbeda akan tetapi file pertama akan ditimpa sama dengan yang baru untuk file selanjutnya,

    Contoh file pertama isinya abcd
    Nanti akan update file baru isi nya akan abcd-> hasil dari data pertama|1234 -> hasil dari data kedua.

    Dan saya menggunakan vbscript hihihi bkan vba >.<

  4. Caton

    11 Jul 2017 Terverifikasi Indonesia + 12.596 Poin

    Hahaha... :D Mungkin bisa diambil idenya saja. Biasanya untuk system scripting saya lebih suka pake AutoIt. Bahasanya mirip VBS dan bisa dicompile. Banyak contoh yang bisa dicoba. Coba ditengok di sini pak @Petter Jo ...

  5. Hihihihi iya @Caton thx ya konsep nya membantu hihihi

 

atau Mendaftar untuk ikut berdiskusi!