Skip to main content

Mengelola Folder dengan Menggunakan FileSystemObject

Pada posting terdahulu, kita sudah membuat program yang digunakan untuk mengelola disk drive dari sebuah komputer. Pada posting berikut ini kita akan membuat program yang digunakan untuk mengelola folder. Secara umum proses yang berlaku saat kita mengelola disk drive juga berlaku di folder, yaitu melakukan koneksi untuk mengakses folder yang ingin dibuka, mengecek apakah sebuah folder tersimpan dalam disk drive, serta merinci isi dari sebuah folder.

Mengakses folder tertentu

Dengan menggunakan metode GetFolder pada FileSystemObject, kita dapat mengarahkan Access untuk melakukan koneksi ke folder tertentu dalam sebuah komputer dan mengaksesnya. Koneksi ini diperlukan untuk memastikan bahwa folder yang dimaksud itu benar-benar ada sehingga kita bisa membuka isi folder tersebut. Untuk mengakses dengan menggunakan GetFolder, kita harus menentukan terlebih dahulu nama path dari folder itu. Nama path dapat berupa local path seperti "C:\Docs" atau UNC seperti "\\akunting\akuntansi". Setelah itu dengan menggunakan pernyataan Set, kita memastikan bahwa folder yang dimaksud dapat diakses. Berikut ini adalah kode VBA yang dipergunakan di modul di Access.
Function koneksifolder(strNamaPath As String) As Boolean
'------------------------------------------
' Fungsi untuk koneksi ke folder
'------------------------------------------
  Dim objFSO As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not (objFSO.FolderExists(strNamaPath)) Then
    Debug.Print "Folder " & strNamaPath & " tidak ada"
  Else
    Set objDrive = objFSO.GetFolder(strNamaPath)
    Debug.Print "Folder " & strNamaPath & " ada"
  End If
  koneksifolder = objFSO.FolderExists(strNamaPath)
  Set objDrives = Nothing
  Set objFSO = Nothing
End Function

Memastikan keberadaan sebuah folder

Sebelum melakukan berbagai perintah ke sebuah folder (seperti meng-copy, memindahkan, mengganti nama, dan menghapus), maka kita harus memastikan bahwa folder itu ada. Folder yang ingin kita ganti nama, misalnya. Saat kita akan mengakses sebuah folder, bila folder itu tidak ada, maka akan muncul pesan kesalahan yang disebut "Path not found". Untuk menghindari munculnya pesan kesalahan seperti itu, kita dapat menggunakan metode FolderExist untuk memeriksa apakah folder yang ingin dibuka itu ada. FolderExist ini bernilai True bila ada, dan False bila tidak ada. Kode VBA selengkapnya di Access adalah sebagai berikut:
Function cekAdaFolder(strNamaPath) As Boolean
'------------------------------------------
' Fungsi untuk mengecek keberadaan folder
'------------------------------------------
  Dim objFSO, objFolder  As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If objFSO.FolderExists(strNamaPath) Then
    Set objFolder = objFSO.GetFolder(strNamaPath)
    MsgBox "Folder " & strNamaPath & " ada."
  Else
    MsgBox "Folder " & strNamaPath & " tidak ada."
  End If
  cekAdaFolder = objFSO.FolderExists(strNamaPath)
  Set objFolder = Nothing
  Set objFSO = Nothing
End Function
Pada kode VBA di atas, bila ada sebuah folder dengan nama strNamaFolder, akses ke folder itu akan dilakukan dan muncul pesan yang menyatakan bahwa folder itu ada. Sebaliknya, billa folder tidak ada, muncul pesan yang menyatakan bahwa folder dengan nama strNamaFolder tidak ada.

Supaya dapat diaplikasikan ke dalam sistem yang akan kita buat nanti, maka fungsi di atas disederhanakan menjadi seperti berikut ini:
Function adaFolder(strNamaPath) As Boolean
'------------------------------------------
' Fungsi untuk mengecek keberadaan folder
'------------------------------------------
  Dim objFSO, objFolder  As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  adaFolder = objFSO.FolderExists(strNamaPath)
  Set objFSO = Nothing
End Function

Menampilkan rincian sebuah folder

Untuk mengelola file yang jumlahnya tidak sedikit, sebuah Operating System pasti akan menempatkan file-filenya dalam kelompok folder. Sebagai contoh OS Windows, yang membagi file-filenya dalam berbagai kelompok folder. Misalnya, file font - dengan ekstensi .otf atau .ttf, akan disimpan dalam folder Fonts. Ada lagi file media, security, network, dan sebagainya. Mereka semua disimpan sesuai dengan objeknya. Demikian pula dengan kita sebagai administrator sistem yang bertugas mengelola sistem yang kita buat.

Folder dibuat sebagai alat untuk membantu administrator mengelola komputer dan membantu user untuk mengelola dokumen yang mereka punyai. Misalnya, pengguna di bagian personalia mungkin menyimpan daftar hidup setiap karyawannya di sebuah folder dengan nama CV. Selain itu file yang berisi hal-hal yang berkaitan dengan gaji disimpan di folder Payroll, dsb.

Di Access, dengan menggunakan FilseSystemObject, kita bisa merinci isi dari sebuah folder. Isi dari sebuah folder bisa berupa file atau subfolder. Nah, pada bagian ini, kita akan menggunakan FileSystemObject untuk membaca subfolder yang ada di sebuah folder. Beriku ini adalah kode VBA pada Access:
Function rincikanFolderItem(strNamaPath As String, Optional ctlListBox As ListBox) As String
'------------------------------------------
' Fungsi untuk merinci subfolder
'------------------------------------------
  Dim objFSO As Object, varItemFolder() As Variant
  Dim n As Integer, strRincikanFolder As String
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFolder = objFSO.GetFolder(strNamaPath)
  Set colSubfolders = objFolder.Subfolders
  n = 0
  ReDim Preserve varItemFolder(colSubfolders.count)
  For Each objSubfolder In colSubfolders
    varItemFolder(n) = objSubfolder.Path
    ctlListBox.AddItem Item:=objSubfolder.Path
    n = n + 1
  Next
  strRincikanFolder = Join(varItemFolder, ";")
  rincikanFolderItem = strRincikanFolder
  Set objFSO = Nothing
  Set objFolder = Nothing
End Function

Merinci subfolder dalam subforlder

Gambar 1. Rincian untuk folder
Seringkali merinci subfolder dari sebuah folder seperti yang kita lakukan di atas tidaklah cukup. Kita juga ingin mengetahui rincian subfolder yang ada di subfolder yang kita buka. Contohnya seperti Gambar 1 di bawah ini.

Pada Gambar 1, tampak jelas bahwa folder dibuka sampai ke level yang paling rinci di bawah (contohnya seperti folder Class dan Standard). Untuk merinci subfolder semacam itu, maka kita harus membuat semacam folder berkalang (nested folder) dari program rekursi untuk merinci folder. Program rekursi ini merupakan fungsi yang akan mengulang diri-nya sendiri untuk merinci subfolder sampai selesai (tidak ada lagi subfolder lainnya).
Berikut ini adalah kode VBA untuk program rekursi yang ada di Access:
Function rincikanSubFolder(strNamaPath As String, Optional intCount As Integer, Optional ctlListBox As ListBox)
'------------------------------------------
' Fungsi untuk merinci subfolder
'------------------------------------------
  Dim objFSO As Object
  Dim n, maksimumSubFolder As Integer
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not cekAdaFolder(strNamaPath) Then
    Cancel = True
    Exit Function
  End If
  Set objFolder = objFSO.GetFolder(strNamaPath)
  Set colSubfolders = objFolder.Subfolders
  maksimumSubFolder = 100
  intCount = intCount + 1
  For Each objSubfolder In colSubfolders
    Debug.Print intCount - 1 & " - " & objSubfolder.Path
    If intCount - 1 > maksimumSubFolder Then
      Cancel = True
      Exit Function
    End If
' Bila variabel ctlListBox di atas tidak mempunyai nilai berupa List Box control,
' maka satu baris di bawah ini harus dinon-aktifkan
    ctlListBox.AddItem Item:=objSubfolder.Path
    
    rincikanSubFolder objSubfolder.Path, intCount, ctlListBox
  Next
End Function
Yang perlu diantisipasi dari program rekursi ini adalah jumlah subfolder yang ingin ditampilkan. Dalam pelaksanaannya, program rekursi memanggil fungsi dirinya sendiri untuk menampilkan subfolder sampai ke yang paling detail. Bila subfolder yang ingin ditampilkan cukup banyak, maka Access bisa mengalami kewalahan sehingga terkesan menggantung. Jadi ada baiknya kita mengatur maksimum jumlah subfolder yang ingin ditampilkan. Pada fungsi di atas, pengaturan maksimum jumlah subfolder yang ingin ditampilkan dilakukan melalui variabel maksimumSubFolder yang nilainya sama dengan 100. Kita dapat mengatur nilai itu sesuai dengan keperluan.

Menampilkan parent folder dari sebuah folder

Selain menampilkan rincian subfolder, kita juga bisa menampilkan parent folder. Parent folder adalah folder yang di dalamnya terdapat folder yang sedang terbuka. Kode VBA yang diperlukan adalah sebagai berikut:
Function tampilkanParentFolder(strNamaPath As String) As String
'------------------------------------------
' Fungsi untuk menampilkan parent folder
'------------------------------------------
  Dim objFSO  As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not adaFolder(strNamaPath) Then
    Cancel = True
    Exit Function
  End If
  If adaFolder(objFSO.GetParentFolderName(strNamaPath)) Then
    tampilkanParentFolder = objFSO.GetParentFolderName(strNamaPath)
  Else
    tampilkanParentFolder = ""
  End If
  Set objFSO = Nothing
End Function

Menampilkan nama drive dari sebuah folder

Selain menggunakan GetDrive/DriveExists untuk menampilkan nama drive, kita juga bisa menampilkan drive dari sebuah folder yang sedang terbuka. Gunakan fungsi di bawah ini untuk menampilkan drive dari sebuah folder
Function tampilkanNamaDrive(strNamaPath As String) As String
'------------------------------------------
' Fungsi untuk menampilkan drive dari sebuah folder
'------------------------------------------
  Dim objFSO  As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not adaFolder(strNamaPath) Then
    Cancel = True
    Exit Function
  End If
  tampilkanNamaDrive = objFSO.GetDriveName(strNamaPath)
  Set objFSO = Nothing
End Function

Contoh administrasi folder dengan menggunakan Access VBA

Setelah memahami seluk beluk penanganan folder dengan fungsi-fungsi di atas, sekarang kita bisa membuat sendiri cara penanganan folder di Access dengan menggunakan VBA. Berikut ini adalah langkah-langkah pembuatannya.
  1. Buatlah form dengan menggunakan Blank Form, yaitu dengan mengklik Create >> Forms >> Blank Form.
  2. Pada form yang masih kosong, sisipkan control sebagai berikut:
    1. Satu buah text box dengan properti sebagai berikut:
      1. Name= txtCurPath
      2. Label untuk text box ini, dengan Caption= Nama path
      3. Before Update= [Event Procedure], lihat di bagian kode VBA di bawah.
      4. After Update= [Event Procedure], lihat di bagian kode VBA di bawah.
    2. Satu buah list box dengan properti sebagai berikut:
      1. Name= lstPath
      2. Row Source Type= Value List
      3. Bound Column= 1.
      4. Allow Value List Edits= No
      5. On Dbl Click= [Event Procedure], lihat di bagian kode VBA di bawah.
    3. Dua buah command button dengan properti sebagai berikut:
      Command button 1, properti:
      1. Name= cmdTampilkanParentFolder
      2. ControlTip Text= Parent Folder
      3. On Click= [Event Procedure], lihat di bagian kode VBA di bawah.
      Command button 1, properti:
      1. Name= cmbTampilkanRoot
      2. ControlTip Text= Root folder
      3. On Click= [Event Procedure], lihat di bagian kode VBA di bawah.
    Design view dari form ini tampak seperti gambar di bawah ini.

    Gambar 2. Design View Mengelola Folder
  3. Buatlah sebuah modul (standard module) dengan mengklik Create >> Other >> Module dan simpanlah module itu dengan nama mdlManajemenFolderPath. Setelah itu isikan fungsi yang telah kita bahas di atas ke dalam kode VBA berikut ini:
    Option Compare Database
    'Sisipkan Function adaFolder di sini
    
    'Sisipkan Function tampilkanParentFolder di sini
    
    'Sisipkan Function tampilkanNamaDrive di sini
    
    'Sisipkan Function rincikanFolderItem di sini
    
    'Sisipkan Function rincikanSubFolder di sini
    
    
  4. isikan kode VBA di bawah ini di class module form:
    Option Compare Database
    
    Private Sub cmbTampilkanRoot_Click()
      Me.txtCurPath = tampilkanNamaDrive(Me.txtCurPath) & "\"
      rincikanFolderItem Me.txtCurPath, Me.lstPath
      Me.txtCurPath.SetFocus
      Me.cmdTampilkanParentFolder.Enabled = False
    End Sub
    
    Private Sub cmdTampilkanParentFolder_Click()
      Me.txtCurPath = tampilkanParentFolder([txtCurPath])
      Me.txtCurPath.ControlTipText = Me.txtCurPath
      Me.txtCurPath.Requery
      Me.lstPath.RowSource = ""
      If Me.txtCurPath = tampilkanNamaDrive(Me.txtCurPath) & "\" Then
        rincikanFolderItem Me.txtCurPath, Me.lstPath
        Me.txtCurPath.SetFocus
        Me.cmdTampilkanParentFolder.Enabled = False
      Else
        Me.lstPath.AddItem Item:="."
        Me.lstPath.AddItem Item:=".."
        rincikanSubFolder Me.txtCurPath, 1, Me.lstPath
        Me.cmdTampilkanParentFolder.Enabled = True
      End If
    End Sub
    
    Private Sub Form_Open(Cancel As Integer)
      Me.txtCurPath = CurDir
      txtCurPath_AfterUpdate
    End Sub
    
    Private Sub lstPath_DblClick(Cancel As Integer)
      If Me.lstPath = "." Then
        cmbTampilkanRoot_Click
        Exit Sub
      End If
      If Me.lstPath = ".." Then
        cmdTampilkanParentFolder_Click
        Exit Sub
      End If
      Me.txtCurPath = Me.lstPath
      txtCurPath_AfterUpdate
    End Sub
    Private Sub txtCurPath_BeforeUpdate(Cancel As Integer)
      If Me.txtCurPath = ".." Or Me.txtCurPath = "." Then
        MsgBox "Anda dapat mengklik ganda tanda .. atau . dari daftar yang tersedia di bawah ini"
        SendKeys "{ESC}"
        Cancel = True
        Exit Sub
      End If
    End Sub
    Private Sub txtCurPath_AfterUpdate()
      If adaFolder(Me.txtCurPath) Then
        Me.txtCurPath.ControlTipText = Me.txtCurPath
        Me.txtCurPath.Requery
      Else
        MsgBox "Folder " & Me.txtCurPath & " tidak ada."
        Cancel = True
        Exit Sub
      End If
      Me.lstPath.RowSource = ""
        Me.lstPath.AddItem Item:="."
      Me.lstPath.AddItem Item:=".."
      If Me.txtCurPath = tampilkanNamaDrive(Me.txtCurPath) & "\" Then
        rincikanFolderItem Me.txtCurPath, Me.lstPath
        Me.cmdTampilkanParentFolder.Enabled = False
      Else
        rincikanSubFolder Me.txtCurPath, 1, Me.lstPath
        Me.cmdTampilkanParentFolder.Enabled = True
      End If
      Me.txtCurPath.ControlTipText = Me.txtCurPath
      Me.txtCurPath.Requery
    End Sub
    
  5. Tampilan Form View dari form untuk mengelola folder akan tampak seperti gambar di bawah ini.

    Gambar 3. Form View Mengelola Folder

Comments

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access