Code Tìm đường dẫn từ tên file ghi trên bảng tính ?

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,469
Nghề nghiệp
Công chức
Chào các bạn ! nhờ các bạn viết giúp Code Tìm đường dẫn từ tên file ghi trên bảng tính ? (Search All file)

Đề bài: Tại cột B của bảng tính là danh sách một số tên file có trong máy, các file này nằm ở các thư mục khác nhau. Tôi muốn lấy đường dẫn đầy đủ của từng file để ghi vào C giống như kết quả trong infodres của Search results (tìm file) thì code viết như thế nào ?
 
Chào các bạn ! nhờ các bạn viết giúp Code Tìm đường dẫn từ tên file ghi trên bảng tính ? (Search All file)

Đề bài: Tại cột B của bảng tính là danh sách một số tên file có trong máy, các file này nằm ở các thư mục khác nhau. Tôi muốn lấy đường dẫn đầy đủ của từng file để ghi vào C giống như kết quả trong infodres của Search results (tìm file) thì code viết như thế nào ?
Mới làm xong ở đây mà anh:
http://www.giaiphapexcel.com/forum/showthread.php?47356-H%E1%BB%8Fi-Code-%C4%91%E1%BB%83-m%E1%BB%9F-file-Excel-trong-th%C6%B0-m%E1%BB%A5c&p=302198#post302198
Dùng Application.FileSearch
 
Upvote 0

Bài Ndu chỉ dẫn là mở file còn yêu cầu bài này là lấy đường dẫn của nó điền vào cột bên cạnh. Tôi cũng cảm thấy hình như là tương tự nhưng do không hiểu code nên không biết sửa như thế nào (kể cả việc bỏ tên file Main mà ndu nói ở bài trước tôi cũng chưa làm được). Vì vậy nhờ các bạn giúp tiếp.
Thanks!
 
Upvote 0
Bài Ndu chỉ dẫn là mở file còn yêu cầu bài này là lấy đường dẫn của nó điền vào cột bên cạnh. Tôi cũng cảm thấy hình như là tương tự nhưng do không hiểu code nên không biết sửa như thế nào
Đương nhiên là tương tự rồi... Muốn mở file thì phải có đường dẫn trước chứ, khi anh lấy được đường dẫn rồi thì anh đừng mở file, làm gì đó tùy anh
Cái thằng .FoundFiles(1) chính là đường dẫn đấy thôi
kể cả việc bỏ tên file Main mà ndu nói ở bài trước tôi cũng chưa làm được)
Thì trước đoạn Dic.Add .... anh thêm 1 cái IF nữa là xong chứ gì
Mã:
If FileName <> ThisWorkbook.FullName Then
 
Lần chỉnh sửa cuối:
Upvote 0
Em gữi anh code này (áp dụng cho topic bên kia nha)
PHP:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim i As Long, j As Long, Arr
  With Application.FileSearch
    .NewSearch
    .FileName = Search
    .LookIn = Folder
    .SearchSubFolders = InSub
    If .Execute Then
      For i = 1 To .FoundFiles.Count
        If .FoundFiles(i) <> ThisWorkbook.FullName Then
          j = j + 1
          ReDim Preserve Arr(1 To j)
          Arr(j) = .FoundFiles(i)
        End If
      Next
    End If
  End With
  GetListFile = Arr
End Function
PHP:
Sub List_File()
  Dim Arr
  On Error Resume Next
  Range("B3:C60000").Clear
  With Application.FileDialog(4)
    .Show
    .AllowMultiSelect = False
    Arr = GetListFile(.SelectedItems(1), "*.*", True)
  End With
  With Range("C3").Resize(UBound(Arr))
    .Value = WorksheetFunction.Transpose(Arr)
    .Offset(, -1).Value = Evaluate("ROW(R:R)")
  End With
End Sub
Đây không phải là code tối ưu về tốc độ nhưng khá dễ hiểu
Còn code cho tốc độ nhanh nhất không phải là code mà anh vừa sưu tầm đâu, nó là cái này đây:
PHP:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim sComm As String, tmpFile
  On Error GoTo ExitSub
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  Folder = """" & Folder & """"
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    sComm = "DIR " & Folder & "*" & Search & "* /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
    GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
  End With
  Kill tmpFile
ExitSub:
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Ndu ! đã giúp đỡ, đến giờ thì Tôi làm được rồi.
 
Upvote 0
Em gữi anh code này (áp dụng cho topic bên kia nha)
PHP:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim i As Long, j As Long, Arr
  With Application.FileSearch
    .NewSearch
    .FileName = Search
    .LookIn = Folder
    .SearchSubFolders = InSub
    If .Execute Then
      For i = 1 To .FoundFiles.Count
        If .FoundFiles(i) <> ThisWorkbook.FullName Then
          j = j + 1
          ReDim Preserve Arr(1 To j)
          Arr(j) = .FoundFiles(i)
        End If
      Next
    End If
  End With
  GetListFile = Arr
End Function

@ndu:
code bị lỗi ở dòng ReDim Preserve Arr(1 To j) (các dòng khác chưa test được) bạn xem lại giúp mình nhé. Thanks!
 
Upvote 0

@ndu:
code bị lỗi ở dòng ReDim Preserve Arr(1 To j) (các dòng khác chưa test được) bạn xem lại giúp mình nhé. Thanks!
Dòng khai báo biến nó thế này:
Mã:
Dim i As Long, j As Long, [COLOR=red][B]Arr[/B][/COLOR]
Anh sửa thành:
Mã:
Dim i As Long, j As Long, [COLOR=red][B]Arr()[/B][/COLOR]
 
Upvote 0
Còn code cho tốc độ nhanh nhất không phải là code mà anh vừa sưu tầm đâu, nó là cái này đây:
PHP:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim sComm As String, tmpFile
  On Error GoTo ExitSub
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  Folder = """" & Folder & """"
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    sComm = "DIR " & Folder & "*" & Search & "* /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
    GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
  End With
  Kill tmpFile
ExitSub:
End Function

Code trên lấy được tên file và đường dẫn rồi. Bây giờ tôi muốn mở một file nào đó từ start - Run thi câu lệnh viết như thế nào (tương tự như copy hoặc nhập tên file vào Run và OK) ? Nhờ các bạn viết giúp câu lệnh này. Thanks !
 
Lần chỉnh sửa cuối:
Upvote 0
Code trên lấy được tên file và đường dẫn rồi. Bây giờ tôi muốn mở một file nào đó từ start - Run thi câu lệnh viết như thế nào (tương tự như copy hoặc nhập tên file vào Run và OK) ? Nhờ các bạn viết giúp câu lệnh này. Thanks !
Tại sao phải cho đường dẫn vào hộp Run hả anh? Mở bình thường không được sao?
PHP:
Sub Test()
  On Error Resume Next
  With CreateObject("Shell.Application")
    .Open "Đường dẫn"
  End With
End Sub
 
Upvote 0
Tại sao phải cho đường dẫn vào hộp Run hả anh? Mở bình thường không được sao?
PHP:
Sub Test()
  On Error Resume Next
  With CreateObject("Shell.Application")
    .Open "Đường dẫn"
  End With
End Sub

Tôi đã chạy thử, OK rồi. Cảm ơn Ndu nhiều nha ! hôm qua bạn đi đâu mình chờ mãi mà không có ai giúp.
 
Upvote 0
Nhờ các bạn giúp tiếp: câu lệnh để chọn file trong Explorer theo đường dẫn đã biết - tương tự như code này:
Mã:
Private Sub lstResult_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  If lstResult.ListCount > 0 Then
    Shell "Explorer.exe /Select, " & lstResult.Value, 1
  End If
End Sub
Thanks !
 
Upvote 0
Nhờ các bạn giúp tiếp: câu lệnh để chọn file trong Explorer theo đường dẫn đã biết - tương tự như code này:
Mã:
Private Sub lstResult_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  If lstResult.ListCount > 0 Then
    Shell "Explorer.exe /Select, " & lstResult.Value, 1
  End If
End Sub
Thanks !
Thì cũng giống vậy thôi mà anh
PHP:
Sub Test()
  Dim path As String
  path = "đường dẫn"
  Shell "Explorer.exe /Select, " & path, 1
End Sub
Với path là đường dẫn đầy đủ của 1 file hoặc folder
 
Upvote 0
Thì cũng giống vậy thôi mà anh
PHP:
Sub Test()
  Dim path As String
  path = "đường dẫn"
  Shell "Explorer.exe /Select, " & path, 1
End Sub
Với path là đường dẫn đầy đủ của 1 file hoặc folder

Code trên OK rồi. Tiếp theo tôi muốn xoá file này và đóng Explore lại để trở về bảng tính thì viết như thế nào ? (Hiện tại tôi phải viết code để Sendkyes các công việc trên)
Mã:
Sub Delete_File()
    Dim path As String
    path = Selection(1, -3)
    Shell "Explorer.exe /Select, " & path, 1
    Application.SendKeys "{Delete}"
    Application.SendKeys "%{F4}"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code trên OK rồi. Tiếp theo tôi muốn xoá file này và đóng Explore lại để trở về bảng tính thì viết như thế nào ? (Hiện tại tôi phải viết code để Sendkyes các công việc trên)
Mã:
Sub Delete_File()
    Dim path As String
    path = Selection(1, -3)
    Shell "Explorer.exe /Select, " & path, 1
    Application.SendKeys "{Delete}"
    Application.SendKeys "%{F4}"
End Sub
Em đang thắc mắc: Anh muốn xóa cái nào thì cứ xóa, sao phải mở Explorer lên làm gì rồi phải đóng lại?
 
Upvote 0
Em đang thắc mắc: Anh muốn xóa cái nào thì cứ xóa, sao phải mở Explorer lên làm gì rồi phải đóng lại?

Cảm ơn Ndu ! các câu hỏi của mình trong Topic này là để thực hiện các công việc sau: Thay vì phải mở từng thư mục con để tìm file thì ta sẽ cho nó hiện tất cả các file có trong các thư mục con hiện ra bảng tính (vì nhiều khi file cần tìm ta không nhớ tên và cũng không biết nó nằm trong thư mục nào để mở). Khi nó đã hiện ra rồi thì ta có 2 lựa chọn hoặc là mở nó ra để sử dụng hoặc là vào thư mục xóa nó đi nếu xét thấy không cần nó nữa. Vấn đề mở nó ra thì bạn đã giúp nên tôi đã làm được; còn vấn đề xóa nó đi thì tôi không biết viết như thế nào ? (những lệnh mà Macro không ghi được thì tôi hoàn toàn bó tay). Rất mong bạn vui lòng viết giúp code cho các yêu cầu này. Thanks !
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Ndu ! các câu hỏi của mình trong Topic này là để thực hiện các công việc sau: Thay vì phải mở từng thư mục con để tìm file thì ta sẽ cho nó hiện tất cả các file có trong các thư mục con hiện ra bảng tính (vì nhiều khi file cần tìm ta không nhớ tên và cũng không biết nó nằm trong thư mục nào để mở). Khi nó đã hiện ra rồi thì ta có 2 lựa chọn hoặc là mở nó ra để sử dụng hoặc là vào thư mục xóa nó đi nếu xét thấy không cần nó nữa. Vấn đề mở nó ra thì bạn đã giúp nên tôi đã làm được; còn vấn đề xóa nó đi thì tôi không biết viết như thế nào ? (những lệnh mà Macro không ghi được thì tôi hoàn toàn bó tay). Rất mong bạn vui lòng viết giúp code cho các yêu cầu này. Thanks !
Anh thử vầy xem:
PHP:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
PHP:
Sub Delete_File()
  Dim path As String, WinhWnd As Long, WinCap As String
  path = Selection(1, -3)
  Shell "Explorer.exe /Select, " & path, 1
  With CreateObject("Scripting.FileSystemObject")
    WinCap = .GetFile(path).ParentFolder.ShortName
    '.DeleteFile path
  End With
  AppActivate ThisWorkbook.Name, True
  Application.Wait Now + TimeSerial(0, 0, 1)
  WinhWnd = FindWindow(vbNullString, WinCap)
  If WinhWnd Then PostMessage WinhWnd, &H10, 0, 0
End Sub
Tuy nhiên có vài vấn đề em không chắc lắm:
- Thứ nhất: Không chắc rằng tiêu đề cửa sổ Explorer của anh nó đang hiện theo kiểu gì (hiển thị nguyên đường dẫn đầy đủ hay chỉ hiện tên thư mục cuối cùng)
- Thứ hai: Không chắc đoạn Application.Wait Now + TimeSerial(0, 0, 1) cái số màu đỏ nên để bao nhiêu là vừa
Thôi thì anh cứ thử xem! (cái khó nằm ở chổ đóng cửa số Explorer)
 
Upvote 0
Code tìm đường dẫn ở 1 máy khác

Chào các bạn , tôi muốn code liệt kê các đường dần của các file F nằm trong 1 máy M khác(đang cùng mạng) thì viết thế nào .
Cảm ơn
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom