Create File Explorer in VBA with BSListView controls , BSImageList in BSAC controls
VIDEO
In VBA, do it step by step:
Step 1: Create a Userform
Make sure that you have installed Add-in A-Tools (version 9.1.0.5 or later) or BSAC.ocx activex controls ( version 2.0.0.7 or later) before performing Step 2
Step 2: Click on the Userform, view the "Toolbox" window, right click on the "Controls" tab => "Import Page", select the "ImportToToolbox.pag" file (Download )
(Only do Step 2 if you do not see the BSAC controls on the Toolbox window)
Step 3: Drag the controls to the Userform: BSComboBox (cbView), BSListView (BSListView1), BSButton (cmdSelectFolder), BSEdit(edtPath), BSImageList (iml16), BSImageList (iml32)
Step 4: Right click on the Userform -> View the Code. Now you have the widow to edit the code. Copy the code below:
'-------BEGIN COPY
'Author: Nguyen Duy Tuan - http://atoolspro.com OR http://bluesofts.net
' Mail: duytuan@bluesofts.net - Tel: (84) 904210337
Option Explicit
Dim hwnd
'--------------------------------------------------------------
Private Sub BSListView1_OnItemDblClick(ByVal Item As BSAC.BSListItem)
ShellExecute hwnd, "OPEN", edtPath.Text & "\" & Item.Text
End Sub
'--------------------------------------------------------------
Private Sub cbView_OnSelect()
BSListView1.View = cbView.ItemIndex
End Sub
'--------------------------------------------------------------
Private Sub cmdSelectFolder_OnClick()
Dim sPath As String, Params As TBSBrowseForFolderParams
Params.NewFolderButton = True
Params.Title = "Please select folder:"
'If BrowseForFolder(sPath, "Please select folder:") Then
If BrowseForFolderEx(Params) Then
sPath = Params.Result
edtPath.Text = sPath
'Add folder and files to BSListView
BSListView1.Items.Clear
GetAllFiles sPath, True 'Get Folder
GetAllFiles sPath, False 'Get Files
End If
End Sub
'--------------------------------------------------------------
Private Sub GetAllFiles(sPath As String, ByVal GetFolder As Boolean)
Dim Files, bf As New BSFunctions
Dim cl As BSListColumn, li As BSListItem, Idx&, Ext$
Dim I&, J&, s$
Dim hIcon, hsmIcon
' Type of Files is array 2D= (1..m, 1...n)
Files = GetFiles(Path:=sPath, Folder:=GetFolder, SubFolder:=False)
'Add column header
If BSListView1.Columns.Count = 0 Then 'Create columns for the first time
For J = LBound(Files, 2) To UBound(Files, 2)
If J 2 Then 'ignore index 2
BSListView1.Columns.Add Files(LBound(Files, 1), J)
End If
Next J
BSListView1.AutoColumns 'resize columns
End If
'Add items
BSListView1.Items.BeginUpdate
For I = LBound(Files, 1) + 1 To UBound(Files, 1) 'Get rows
Ext = Files(I, 3) 'It is key to find image
If GetFolder Then
Ext = "folder"
ElseIf Ext = ".ico" Then
Idx = iml32.ListImages.AddIcon(sPath & "\" & Files(I, 1)) 'Create and Add icon to Imagelist size 32
Idx = iml16.ListImages.AddIcon(sPath & "\" & Files(I, 1)) 'Create and Add icon to Imagelist size 16
ElseIf Ext ".exe" And Ext ".ico" Then
Idx = iml16.ListImages.IndexOf(Ext)
Else
Idx = -1 'let find icon
End If
If Idx = -1 Then 'not exists then add new icon for file type
If GetAssociatedIcon(sPath & "\" & Files(I, 1), hIcon, hsmIcon) > 0 Then
Idx = iml32.ListImages.AddIcon(hIcon, Ext) 'Add icon to Imagelist size 32
iml16.ListImages.AddIcon hsmIcon, Ext 'Add icon to Imagelist size 16
End If
End If
Set li = BSListView1.Items.Add(Files(I, 1), Idx)
For J = 3 To UBound(Files, 2) 'Get columns
li.SubItems.Add Files(I, J)
Next J
Next I
BSListView1.Items.EndUpdate
End Sub
'--------------------------------------------------------------
Private Sub UserForm_Initialize()
Dim hIcon, hIcon2
hwnd = GetHwnd(Me)
'Set resize userform, min, max button
SetWindowLong hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) Or _
WS_SIZEBOX Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX
iml16.PicWidth = 16
iml16.PicHeight = 16
iml32.PicWidth = 48
iml32.PicHeight = 48
hIcon = ExtractIcon(0, GetSysDir & "\shell32.dll", 3) 'Icon Folder
hIcon2 = ExtractIcon(0, GetSysDir & "\shell32.dll", 3) 'Icon Folder
iml16.ListImages.AddIcon hIcon, "folder"
iml32.ListImages.AddIcon hIcon2, "folder"
'ListView
BSListView1.View = vsReport
BSListView1.hSmallImageList = iml16.hImageList
BSListView1.hImageList = iml32.hImageList
BSListView1.RowSelect = True
BSListView1.MultiSelect = True
BSListView1.AllowCustomSort = True
BSListView1.lpfnCustomSort = GetFuncPtr(AddressOf SortByColumn)
'Add combobox View
cbView.Items.Add "vsIcon"
cbView.Items.Add "vsSmallIcon "
cbView.Items.Add "vsList"
cbView.Items.Add "vsReport"
cbView.ItemIndex = 3 'vsReport
End Sub
'--------------------------------------------------------------
Private Sub UserForm_Resize()
If Width - BSListView1.Left > 0 Then
BSListView1.Width = Width - BSListView1.Left - 17
End If
If Height - BSListView1.Top > 0 Then
BSListView1.Height = Height - BSListView1.Top - 33
End If
'Caption = Width - BSListView1.Left - 8 & " : " & BSListView1.nWidth
End Sub
'-------END COPY
(*) Go to menu Tools->References
Select/check "AddinATools.dll" to use GetFiles () function
Step 5: Go to menu "Insert"->Module. Now you have the widow to edit the code. Copy the code below:
'-------BEGIN COPY
Option Explicit
' RUN IF DECLARE:
' BSListView1.AllowCustomSort = True
' BSListView1.lpfnCustomSort = GetFuncPtr(AddressOf SortByColumn)
' SortByColumn run when click on column to sort
#If VBA7 Then
Function SortByColumn(ByVal lParam1 As LongPtr, ByVal lParam2 As LongPtr, ByVal Col As Long) As Long
#Else
Function SortByColumn(ByVal lParam1 As Long, ByVal lParam2 As Long, ByVal Col As Long) As Long
#End If
Dim Item1 As BSListItem, Item2 As BSListItem
Dim v1, v2
Set Item1 = UserForm1.BSListView1.Items.GetItemFromLPARAM(lParam1)
Set Item2 = UserForm1.BSListView1.Items.GetItemFromLPARAM(lParam2)
'Get data from BSListView
If Col = 0 Then
v1 = Item1.Text
v2 = Item2.Text
Else
v1 = Item1.SubItems(Col - 1)
v2 = Item2.SubItems(Col - 1)
End If
'Convert data
Select Case Col
Case 2, 6:
v1 = CDbl(v1)
v2 = CDbl(v2)
Case 3, 4, 5:
v1 = CDate(v1)
v2 = CDate(v2)
End Select
'Compare
If v1 = v2 Then
SortByColumn = 0
ElseIf v1 < v2 Then
SortByColumn = -1
Else
SortByColumn = 1
End If
If Not UserForm1.BSListView1.SortIsAscending Then
SortByColumn = -SortByColumn
End If
Set Item1 = Nothing
Set Item2 = Nothing
End Function
'--------------------------------------------------------------
Sub ShowExlorer()
UserForm1.Show
End Sub
'-------END COPY
Support online: https://www.facebook.com/groups/hocexcel/
Download source code
'--------------------------------------------------------------