1. 程式人生 > >VBScript - 彈出“檔案選擇對話方塊”方法大全!

VBScript - 彈出“檔案選擇對話方塊”方法大全!

本文記錄,VBScript 中,各種開啟 “檔案選擇對話方塊” 的方法。



實現方法-1 (mshta.exe):

首先,我們要實現的就是,彈出上面的這個“檔案選擇對話方塊”。
這種方法是通過,Shell 物件,開啟 mshta.exe 程式,執行一個 .hta 檔案,從而開啟視窗,
這種方法,其實是寫了一個簡單的 hta (HTML Applicaiton) 檔案,
然後,這個 hta 檔案,打開了 “選擇檔案對話方塊”,程式碼如下:


'開啟對話方塊
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")

'輸出選擇的,檔案的路徑
File_Selected = oExec.StdOut.ReadLine
MsgBox File_Selected


實現方法-2 (InternetExplorer.Application):

這種方法是通過,InternetExplorer.Application 物件來實現的,
先建立一個 IE 的物件,然後寫一個 HTML 檔案,然後執行這個檔案,從而開啟視窗,
這種方法,雖然呼叫的物件,和方法1不同,但其根本原理和方法1,是完全一樣的,


'開啟對話方塊
Set IE = CreateObject("InternetExplorer.Application")
With IE
    .Visible = False
    .Navigate("about:blank")
    Do Until .ReadyState = 4 : Loop
        With .Document
            .Write "<html><body><input id='f' type='file'></body></html>"
                With .All.f
                    .Focus
                    .Click
                        Result = .Value
                End With
        End With
        .Quit
End With
Set IE = Nothing

'輸出選擇的,檔案的路徑
File_Selected = Result
MsgBox File_Selected


實現方法-3 (Excel.Application):

這種方法是通過,Excel.Application 物件來實現的,
是通過 Excel Object 自帶的,GetOpenFilename 方法,直接開啟的對話方塊,
個人覺得,這個方法是最方便的,程式碼如下:


'開啟對話方塊
Set oExcel=CreateObject("Excel.Application")
    FileFilter = "CSV Files (*.csv),*.csv"
    FilterIndex = default
    Title = ""
    ButtonText = ""
    MultiSelect = False
File_Selected= oExcel.GetOpenFilename (FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

'輸出選擇的,檔案的路徑
MsgBox File_Selected


實現方法-4 (Excel.Application):

這種方法是通過,Excel.Application 物件來實現的,
是通過 Excel Object 自帶的,FileDialog 方法,直接開啟的對話方塊,
另外,這種方法,是支援選擇多個檔案的,多選的時候,返回的是一個 Array,
這就是,為什麼你看到 FileDialog.SelectedItems(1) 這段程式碼結尾有個 (1),代表選擇了第一個 Item,
還有,這是這種方法,是要提前設定常量的,一共四種常量,對應四種不同的視窗,
這種方法,本質上來源於 VBA,所以,方法3和方法4,在 VBA 裡也可以使用,
我個人比較喜歡,這種方法,因為看上去很清晰,而且可以設定初始路徑,很方便,


'設定常量
Const msoFileDialogOpen = 1
Const msoFileDialogSaveAs = 2
Const msoFileDialogFilePicker = 3
Const msoFileDialogFolderPicker  = 4

'開啟對話方塊
Set oExcel = CreateObject("Excel.Application")
Set FileDialog = oExcel.FileDialog(msoFileDialogFilePicker)

'新增篩選條件
FileDialog.Filters.Add "Images", "*.gif; *.jpg; *.jpeg", 1 

'設定初始路徑
FileDialog.InitialFileName = "C:\" 

'彈出對話方塊
FileDialog.show()

'輸出選擇的,檔案的路徑
File_Selected = FileDialog.SelectedItems(1)
MsgBox File_Selected


實現方法-5 (Word.Application):

這種方法和上面的方法是完全一樣的,
只是使用的是,Word.Application 物件而已,
所以,可以推測,微軟的辦公套件物件,應該都可以用來實現這個功能,


'設定常量
Const msoFileDialogOpen = 1
Const msoFileDialogSaveAs = 2
Const msoFileDialogFilePicker = 3
Const msoFileDialogFolderPicker  = 4

'開啟對話方塊
Set oWord = CreateObject("Word.Application")
Set FileDialog = oWord.FileDialog(msoFileDialogFilePicker)

'設定初始路徑
FileDialog.InitialFileName = "C:\" 

'彈出對話方塊
FileDialog.show()

'輸出選擇的,檔案的路徑
File_Selected = FileDialog.SelectedItems(1)
MsgBox File_Selected


實現方法-6 (Scripting.FileSystemObject):

這種方法,就不去詳細說明了,因為其根本原理,其實和方法1,方法2,是一樣的,
只不過是,呼叫的 Object 不同而已,但,也列出來供大家參考,


Function BrowseForFile()
    With CreateObject("WScript.Shell")
        Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
        Dim tempFolder : Set tempFolder = fso.GetSpecialFolder(2)
        Dim tempName : tempName = fso.GetTempName() & ".hta"
        Dim path : path = "HKCU\Volatile Environment\MsgResp"
        With tempFolder.CreateTextFile(tempName)
            .Write "<input type=file name=f>" & _
            "<script>f.click();(new ActiveXObject('WScript.Shell'))" & _
            ".RegWrite('HKCU\\Volatile Environment\\MsgResp', f.value);" & _
            "close();</script>"
            .Close
        End With
        .Run tempFolder & "\" & tempName, 1, True
        BrowseForFile = .RegRead(path)
        .RegDelete path
        fso.DeleteFile tempFolder & "\" & tempName
    End With
End Function

MsgBox BrowseForFile


實現方法-7 (Shell.Application):

這種方法呢,算是 VBScript 最本土的方法了,
沒有呼叫任何第三方的 Object,只用了自己自帶的 Shell.Application 物件,
但是,其實這種方法,只能選擇資料夾,雖然確實能看到所有檔案,但是要是真選了,就會報錯!
但是,網上還是有人,在這種基礎上做出了改進,也變得能夠選擇檔案,並且返回檔案路徑,


Function BrowseForFile()
    Dim shell : Set shell = CreateObject("Shell.Application")
    Dim file : Set file = shell.BrowseForFolder(0, "Choose a file:", &H4000, "C:\")
    BrowseForFile = file.self.Path
End Function

MsgBox BrowseForFile


實現方法-8 (MSComDlg.CommonDialog):

其實,這才是最古老的方法,看上去十分的簡潔,好用,
但是,注意,這是 Windows XP 時代的程式碼,現在 Windows 7 已經不支援了,
當然,你是可以想辦法讓 Windows 7 支援,這個 Object,
如果有人,對這種古老的方法感興趣,就去看我的參考閱讀吧,
但是,很麻煩,幾乎不太值得了,所以,放在這,作為個借鑑吧,


Set oDialog = CreateObject("MSComDlg.CommonDialog")

With oDialog
    .Filter = "*.txt"   
    .InitDir = "C:"   
    .MaxFileSize = 256   
    .Flags = &H80000 + &H4 + &H8 
End With

MsgBox oDialog.FileName


實現方法-9 (UserAccounts.CommonDialog):

這是另一個古老的方法,看上去十分的簡潔,同樣是 Windows XP 時代的程式碼,
現在 Windows 7 已經不支援了,放在這,作為個借鑑吧,
我也沒辦法測試這兩個方法,因為我沒有 XP 系統,

<br>

'Set oDialog = CreateObject("UserAccounts.CommonDialog")

oDialog.Filter = "Text Files|*.txt|All Files|*.*"
oDialog.FilterIndex = 1
oDialog.InitialDir = "C:\Program Files"
Result = oDialog.ShowOpen

MsgBox oDialog.FileName


篇尾總結

我個人比較喜歡,方法4,方便清晰,又簡潔。
這篇文章差不多囊括了所有常見的 “檔案選擇對話方塊” 的實現方法。
如果,以後在發現新的方法了,再來更新!
希望使用 VBScript 的人有幫助。

參考閱讀:

  1. VBA - VBScript to open a dialog to select a filepath - Stack Overflow
  2. Windows7 VBScript open file dialog box - fakepath
  3. VBA Files & Directories - Application.GetOpenFileName
  4. Application.GetOpenFilename method (Excel) | Microsoft Docs
  5. MsoFileDialogType enumeration (Office) | Microsoft Docs
  6. FileDialog members (Office) | Microsoft Docs
  7. How to browse for a file in Windows 7
  8. VBScript File Browser · GitHub
  9. Windows 7 Replacement for UserAccounts.CommonDialog in VBScript
<