2009-01-06 51 views
18

Vì nhiều lý do, tôi bị kẹt trong Access 97 và chỉ cần lấy phần đường dẫn của tên đường dẫn đầy đủ.Tìm phần thư mục (trừ tên tệp) của đường dẫn đầy đủ trong truy cập 97

Ví dụ, tên

c:\whatever dir\another dir\stuff.mdb 

nên trở thành

c:\whatever dir\another dir\ 

Trang web này có một số gợi ý về cách để làm điều đó: http://www.ammara.com/access_image_faq/parse_path_filename.html

Nhưng họ có vẻ khá xấu xí. Phải có một cách tốt hơn, phải không?

+0

gì gớm ghiếc về nó? Nó trông giống như mã khá đơn giản đối với tôi, và tôi đã có các phiên bản của riêng tôi được viết cho A97 vẫn đang chạy trong các ứng dụng ngày nay, mặc dù chúng cung cấp các hàm dựng sẵn tốt hơn so với sẵn có trong A97. –

+0

Đã xóa khỏi các câu hỏi: CurrentProject.Path có sẵn trong Access 97 không? – Fionnuala

+1

Trả lời: Không, CurrentProject hoàn toàn bị thiếu trong Access 97. Có CurrentDb.Name, tuy nhiên, nhưng đó là đường dẫn đầy đủ bao gồm tên tệp. - apenwarr – Fionnuala

Trả lời

1

Đó là về nó. Không có chức năng tích hợp ma thuật nào ...

16

Tôi luôn sử dụng số FileSystemObject cho loại điều này. Đây là một hàm wrapper nhỏ mà tôi đã sử dụng. Đảm bảo tham chiếu Microsoft Scripting Runtime.

Function StripFilename(sPathFile As String) As String 

'given a full path and file, strip the filename off the end and return the path 

Dim filesystem As New FileSystemObject 

StripFilename = filesystem.GetParentFolderName(sPathFile) & "\" 

Exit Function 

End Function 
+2

Ý tưởng tồi, bởi vì nó đòi hỏi một tham chiếu đến công việc. Nếu bạn nhấn mạnh vào nó, bạn nên sử dụng ràng buộc muộn. –

+9

Vì khi nào là tham chiếu ý tưởng tồi? Bản thân quyền truy cập yêu cầu tham chiếu để hoạt động. 0_o –

+0

Điều này làm việc tuyệt vời trong vba. Điều duy nhất tôi phải làm là làm cho hệ thống tập tin trở thành đối tượng thường xuyên và sau đó đặt nó thành kiểu đầy đủ của FileSystemObject – MattCucco

1

trái (currentdb.Name, InStr (1, currentdb.Name, dir (currentdb.Name)) - 1)

Chức năng Dir sẽ trở lại chỉ có phần tập tin của đường dẫn đầy đủ. Currentdb.Name được sử dụng ở đây, nhưng nó có thể là bất kỳ chuỗi đường dẫn đầy đủ nào.

+0

Hmm, điều này nghe có vẻ như nó sẽ không hoạt động nếu phần tên tệp xuất hiện như một phần của đường dẫn, ví dụ. "c: \ whatever.txt \ x \ y \ z \ whatever.txt" sẽ bị chia không chính xác. – apenwarr

+3

Chính xác. Tôi sẽ chỉnh sửa câu trả lời ngay khi điều đó xảy ra với tôi hoặc bất cứ ai tôi biết. Cho đến nay nó đã không. –

1

Nếu bạn chỉ cần đường dẫn của MDB hiện đang mở trong giao diện người dùng truy cập, tôi khuyên bạn nên viết một hàm phân tích cú pháp CurrentDB.Name và sau đó lưu kết quả trong biến tĩnh bên trong hàm. Một cái gì đó như thế này:

Public Function CurrentPath() As String 
    Dim strCurrentDBName As String 
    Static strPath As String 
    Dim i As Integer 

    If Len(strPath) = 0 Then 
    strCurrentDBName = CurrentDb.Name 
    For i = Len(strCurrentDBName) To 1 Step -1 
     If Mid(strCurrentDBName, i, 1) = "\" Then 
      strPath = Left(strCurrentDBName, i) 
      Exit For 
     End If 
    Next 
    End If 
    CurrentPath = strPath 
End Function 

Điều này có lợi thế là nó chỉ lặp qua tên một lần.

Tất nhiên, nó chỉ hoạt động với tệp đang mở trong giao diện người dùng.

Một cách khác để viết những dòng này sẽ được sử dụng các chức năng cung cấp tại link bên trong hàm trên, như sau:

Public Function CurrentPath() As String 
    Static strPath As String 

    If Len(strPath) = 0 Then 
    strPath = FolderFromPath(CurrentDB.Name) 
    End If 
    CurrentPath = strPath 
End Function 

Điều này làm cho lấy đường dẫn hiện tại rất hiệu quả khi sử dụng mã có thể được sử dụng cho việc tìm kiếm đường dẫn cho bất kỳ tên tệp/đường dẫn nào.

10

Điều này dường như hoạt động. Ở trên không có trong Excel 2010.

Function StripFilename(sPathFile As String) As String 
'given a full path and file, strip the filename off the end and return the path 
Dim filesystem As Object 

Set filesystem = CreateObject("Scripting.FilesystemObject") 

StripFilename = filesystem.GetParentFolderName(sPathFile) & "\" 

Exit Function 

End Function 
+0

Tham khảo cũng có thể được đặt Trong Excel VBA. Trong trình soạn thảo VBA, nhấp vào trình đơn Tools và sau đó tham khảo. Đánh dấu vào ô trong danh sách bên cạnh "Thời gian chạy Microsoft Scripting". Kiểu FileSystemObject sau đó sẽ có sẵn để khai báo trong câu lệnh Dim. –

+0

Điều này về cơ bản là cùng một chức năng được đăng bởi @Siddharth Rout nhưng nó hoạt động mà không cần tham chiếu tới thư viện "Microsoft Scripting Runtime". – ChrisB

0

Hãy thử chức năng này:

Function FolderPath(FilePath As String) As String 

    '-------------------------------------------------- 
    'Returns the folder path form the file path. 

    'Written by: Christos Samaras 
    'Date:   06/11/2013 
    '-------------------------------------------------- 

    Dim FileName As String 

    With WorksheetFunction 
     FileName = Mid(FilePath, .Find("*", .Substitute(FilePath, "\", "*", Len(FilePath) - _ 
        Len(.Substitute(FilePath, "\", "")))) + 1, Len(FilePath)) 
    End With 

    FolderPath = Left(FilePath, Len(FilePath) - Len(FileName) - 1) 

End Function

Nếu bạn không muốn loại bỏ các dấu chéo ngược cuối cùng "\" ở phần cuối của con đường của thư mục, thay đổi dòng cuối cùng với điều này:

FolderPath = Left(FilePath, Len(FilePath) - Len(FileName))

Ví dụ:

FolderPath("C:\Users\Christos\Desktop\LAT Analysers Signal Correction\1\TP 14_03_2013_5.csv") 

cho:

C: \ Users \ Christos \ Desktop \ LẠT Máy phân tích tín hiệu Correction \ 1

hoặc

C: \ Users \ Christos \ Desktop \ LẠT Máy phân tích tín hiệu Correction \ 1 \

trong trường hợp thứ hai (lưu ý rằng có dấu gạch chéo ngược ở cuối).

Tôi hy vọng điều này sẽ giúp ...

-1

Sử dụng các mã này và tận hưởng.

Public Function GetDirectoryName(ByVal source As String) As String() 
Dim fso, oFolder, oSubfolder, oFile, queue As Collection 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set queue = New Collection 

Dim source_file() As String 
Dim i As Integer   

queue.Add fso.GetFolder(source) 'obviously replace 

Do While queue.Count > 0 
    Set oFolder = queue(1) 
    queue.Remove 1 'dequeue 
    '...insert any folder processing code here... 
    For Each oSubfolder In oFolder.SubFolders 
     queue.Add oSubfolder 'enqueue 
    Next oSubfolder 
    For Each oFile In oFolder.Files 
     '...insert any file processing code here... 
     'Debug.Print oFile 
     i = i + 1 
     ReDim Preserve source_file(i) 
     source_file(i) = oFile 
    Next oFile 
Loop 
GetDirectoryName = source_file 
End Function 

Và ở đây bạn có thể gọi hàm:

Sub test() 
Dim s 
For Each s In GetDirectoryName("C:\New folder") 
Debug.Print s 
Next 
End Sub 
26

Bạn có thể làm một cái gì đó đơn giản như: Left(path, InStrRev(path, "\"))

Ví dụ:

Function GetDirectory(path) 
    GetDirectory = Left(path, InStrRev(path, "\")) 
End Function 
+0

Champion !! Giải pháp tốt nhất cho đến nay! –

Các vấn đề liên quan