Thay đổi đường dẫn chọn file mặc định khi dùng hàm GetOpenFilename()

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Em chào các bác, hiện e đang dùng hàm này để mở cửa sổ chọn file

Dim MyFile As String
                    MyFile = Application.GetOpenFilename()
                    Workbooks.Open (MyFile)

Nhưng cửa sổ Open luôn hiển thị tại thư mục C/Document,
liệu có cách nào thay đổi để mặc định cửa sổ mở ra tại thư mục chứa file excel đang làm việc không ạ
Em cảm ơn

Có thể sử dụng một hàm cho việc này:

Function FileOpen(initialFilename As String, _
  Optional sDesc As String = "Excel (*.xls)", _
  Optional sFilter As String = "*.xls") As String
  With Application.FileDialog(msoFileDialogOpen)
    .ButtonName = "&Open"
    .initialFilename = initialFilename
    .Filters.Clear
    .Filters.Add sDesc, sFilter, 1
    .Title = "File Open"
    .AllowMultiSelect = False
    If .Show = -1 Then FileOpen = .SelectedItems(1)
  End With
End Function

'Cách sử dụng:'
Sub Test()
  MsgBox FileOpen("x:", "Kens Files", "*.xls; *.xlsx; *.xlsm")
End Sub

Code trên tham khảo từ [URL='www.mrexcel.com/board/threads/getopenfilename-default-directory.574110/post-2839787']Link này

Thêm đoạn chir đường dẫn thì phải sao ấy nhỉ

ChDir / Dir gì đó nhớ không nhầm là không hoạt động với Unicode

www.giaiphapexcel.com/diendan/threads/thay-%C4%91%E1%BB%95i-%C4%91%C6%B0%E1%BB%9Dng-d%E1%BA%ABn-ch%E1%BB%8Dn-file-m%E1%BA%B7c-%C4%91%E1%BB%8Bnh-khi-d%C3%B9ng-h%C3%A0m-getopenfilename.163325/post-1089389

Bạn thay

MyFile = Application.GetOpenFilename()

bằng

Set xDlg = Application.FileDialog(msoFileDialogOpen)
xDlg.InitialFileName = thisworkbook.Path
If xDlg.Show <> -1 Then Exit Sub
MyFile = xDlg.SelectedItems(1)

—————
Có thể tham khảo thêm cách mở lần lượt từng file (chọn nhiều file cùng lúc)

Sub UseFileDialogOpen()
    Dim fileCount As Long
     ' Open the file dialog
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .InitialFileName = ThisWorkbook.Path
        .Show
        ' Display paths of each file selected
        For fileCount = 1 To .SelectedItems.Count
            Workbooks.Open .SelectedItems(lngCount)
        Next
    End With
End Sub

www.giaiphapexcel.com/diendan/threads/thay-%C4%91%E1%BB%95i-%C4%91%C6%B0%E1%BB%9Dng-d%E1%BA%ABn-ch%E1%BB%8Dn-file-m%E1%BA%B7c-%C4%91%E1%BB%8Bnh-khi-d%C3%B9ng-h%C3%A0m-getopenfilename.163325/post-1089390

.InitialFileName = ThisWorkbook.Path
Cho em hỏi dòng lệnh này có nghĩa gì ạ, khi e xóa đi thì cửa sổ mở ra lại trở về ổ C

Initial File Name = Tên file ban đầu –> Lấy giá trị ban đầu của hộp thoại.
ThisWorkbook = File hiện hành (1) file này, file chứa code; ".Path" = lấy đường dẫn của (1) file này;
Túm lại:
Lấy giá trị khi mở ra của hộp thoại là địa chỉ thư mục chứa file đang chứa đoạn mã này.

GetOpenFileName là đối tượng cho phép xem và mở files, nhanh và giản dị.
FileDialog là đối tượng cho phép xem và chọn files đầy đủ hơn GetOpenFileName một chút.

Vì vậy, trong VBA, khi sử dụng FileDiaLog là người ta muốn nạp thêm một số tham số thay vì mặc định. Điển hình, GetOpenFileName mặc định là cho xem folder hiện hành, FileDialog dựa vào thuộc tính InitialFileName để cho xem folder.

Nếu:
– InitialFileName không được set. Filedialog sẽ dựa vào giá trị set trước đó. Nếu chưa hề set thì mặc định là ổ systems (thường là ổ C:, nhưng chả ai bảo đảm 100%).
– InitialFileName set là thư mục/folder chứ không có filename thì FilDialog sẽ cho xem thư mục ấy và dựa vào Filters để hiển thị files trong thư mục. {#}
– InitiaFileName set với thư mục và tên file:
— Nếu file không có trong thư mục thì sẽ hiện ra thư mục rỗng.
— Nếu file có thì chỉ hiện ra file này.
— Nếu tên file gồm các ký tự WildCards (*, ?,…) thì dạng này sẽ lướt qua (override) Filters. Ví dụ "C::Rácthối*.xlsx" thì FileDialog sẽ hiển thị thư mục C:Rác với các files tên bắt đầu bằng "thối", và kiểu xlsx.

Chú 1: phương pháp được đánh dấu {#} ở trên là phương pháp được khuyến khích dùng ở đây.

Chú 2:
Lưu ý về các thuộc tính của FileDialog:
Là một đối tượng, FileDialog tuân thủ luật chung của đối tượng. Những thuộc tính được set trong lần gọi thứ n sẽ được di truyền sang lần gọi thứ n+1. Chỉ có lần gọi n=1 thì dùng trị mặc định. Vì vậy mõi lần gọi nên nhớ mà set lại nếu cần.
Là một đối tượng của Application cho nên nó chỉ hiệu lực trong thời gian Application đang chạy. Sau khi VBA không chạy nữa thì nó cũng mất theo luôn. Và nếu chạy lại thì trở về n=1.

Khác với lệnh gọi DOS như ChDir. ChDir có hiệu lực cho cả hệ thống. Vì vậy, nếu dùng lệnh này thì người ta copy lại trị trước dó, dùng xong thì set nó về trị ban đầu.

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ
Khóa học SprinGO phù hợp

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ

Con người là một trong những yếu tố quan trọng của công ty, là tài sản quý giá của doanh nghiệp. Chính vì thế,...

Xem khóa học
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Bình luận

Quảng cáo

Cũ vẫn chất

Xem thêm