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.
Supaya dapat diaplikasikan ke dalam sistem yang akan kita buat nanti, maka fungsi di atas disederhanakan menjadi seperti berikut ini:
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:
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:
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 FunctionPada 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 |
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 FunctionYang 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 folderFunction 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.- Buatlah form dengan menggunakan Blank Form, yaitu dengan mengklik Create >> Forms >> Blank Form.
- Pada form yang masih kosong, sisipkan control sebagai berikut:
- Satu buah text box dengan properti sebagai berikut:
- Name= txtCurPath
- Label untuk text box ini, dengan Caption= Nama path
- Before Update= [Event Procedure], lihat di bagian kode VBA di bawah.
- After Update= [Event Procedure], lihat di bagian kode VBA di bawah.
- Satu buah list box dengan properti sebagai berikut:
- Name= lstPath
- Row Source Type= Value List
- Bound Column= 1.
- Allow Value List Edits= No
- On Dbl Click= [Event Procedure], lihat di bagian kode VBA di bawah.
- Dua buah command button dengan properti sebagai berikut:
Command button 1, properti:
- Name= cmdTampilkanParentFolder
- ControlTip Text= Parent Folder
- On Click= [Event Procedure], lihat di bagian kode VBA di bawah.
- Name= cmbTampilkanRoot
- ControlTip Text= Root folder
- On Click= [Event Procedure], lihat di bagian kode VBA di bawah.
Gambar 2. Design View Mengelola Folder - Satu buah text box dengan properti sebagai berikut:
- 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
- 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
- Tampilan Form View dari form untuk mengelola folder akan tampak seperti gambar di bawah ini.
Gambar 3. Form View Mengelola Folder
Comments
Post a Comment