2009-01-06 14 views
18

Pour diverses raisons, je suis coincé dans Access 97 et n'ai besoin que de la partie path d'un chemin d'accès complet.Trouver la partie répertoire (moins le nom de fichier) d'un chemin d'accès complet en accès 97

Par exemple, le nom

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

devrait devenir

c:\whatever dir\another dir\ 

Ce site a quelques suggestions sur la façon de le faire: http://www.ammara.com/access_image_faq/parse_path_filename.html

Mais ils semblent plutôt hideux. Il doit y avoir un meilleur moyen, non?

+0

Qu'est-ce hideux à ce sujet? Cela me semble un code assez simple, et j'avais mes propres versions écrites pour A97 qui fonctionnent encore aujourd'hui dans les applications, même si elles offrent de meilleures fonctions intégrées que celles disponibles dans A97. –

+0

Supprimé des questions: CurrentProject.Path est-il disponible dans Access 97? – Fionnuala

+1

Réponse: Non, CurrentProject est entièrement manquant dans Access 97. CurrentDb.Name existe cependant, mais c'est le chemin d'accès complet, y compris le nom de fichier. - apenwarr – Fionnuala

Répondre

1

C'est à peu près tout. Il n'y a pas de fonction intégrée magique ...

16

J'ai toujours utilisé le FileSystemObject pour ce genre de chose. Voici une petite fonction d'emballage que j'ai utilisée. Veillez à référencer le 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

Mauvaise idée, car elle nécessite une référence au travail. Si vous insistez, vous devez utiliser une liaison tardive. –

+9

Depuis quand les références sont-elles une mauvaise idée? L'accès lui-même nécessite des références au travail. 0_o –

+0

Cela fonctionne très bien dans vba. La seule chose que je devais faire était de faire du système de fichiers un objet régulier et de le définir sur le type complet de FileSystemObject – MattCucco

1

gauche (currentdb.Name, instr (1, currentdb.Name, dir (currentdb.Name)) - 1)

La fonction Dir renvoie uniquement la partie de fichier du chemin complet. Currentdb.Name est utilisé ici, mais il peut s'agir de n'importe quelle chaîne de chemin complet.

+0

Hmm, cela semble ne pas fonctionner si la partie du nom de fichier apparaît dans le chemin, par exemple. "c: \ quelquechose.txt \ x \ y \ z \ whatever.txt" serait scindé incorrectement. – apenwarr

+3

Correct. Je modifierai ma réponse dès que cela m'arrivera ou à quelqu'un que je connais. Jusqu'à présent, ce n'est pas le cas. –

1

Si vous avez juste besoin du chemin de la MDB actuellement ouvert dans l'interface utilisateur Access, je suggérerais d'écrire une fonction qui analyse CurrentDB.Name, puis stocke le résultat dans une variable statique à l'intérieur de la fonction. Quelque chose comme ceci:

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 

Ceci a l'avantage qu'il boucle seulement le nom une fois.

Bien sûr, cela ne fonctionne qu'avec le fichier ouvert dans l'interface utilisateur.

Une autre façon d'écrire serait d'utiliser les fonctions prévues à l'link intérieur de la fonction ci-dessus, ainsi:

Public Function CurrentPath() As String 
    Static strPath As String 

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

Cela rend la récupération du chemin courant très efficace alors que le code utilisant qui peut être utilisé pour trouver le chemin pour n'importe quel nom de fichier/chemin.

10

Cela semble fonctionner. Ce qui précède ne figure pas dans 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

Les références peuvent également être définies dans Excel VBA. Dans l'éditeur VBA, cliquez sur le menu Outils, puis sur Références. Cochez la case dans la liste à côté de "Microsoft Scripting Runtime". Le type FileSystemObject doit alors être disponible pour déclarer dans l'instruction Dim. –

+0

Il s'agit fondamentalement de la même fonction publiée par @Siddharth Rout mais cela fonctionne sans référence à la bibliothèque "Microsoft Scripting Runtime". – ChrisB

0

Essayez cette fonction:

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

Si vous ne souhaitez pas supprimer la dernière barre oblique inverse « \ » à la fin du chemin du dossier, modifiez la dernière ligne avec ceci:

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

Exemple:

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

donne:

C: \ Users \ Christos \ Desktop \ LAT Analyseurs de correction de signal \ 1

ou

C: \ Users \ Christos \ Desktop \ LAT Analyseurs de correction de signal \ 1 \

dans le second cas (notez qu'il y a un backslash à la fin). Je souhaite que cela aide ...

-1

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 

Et là, vous pouvez appeler la fonction:

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

Vous pouvez faire quelque chose de simple comme: Left(path, InStrRev(path, "\"))

Exemple:

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

Champion !! Meilleure solution de loin! –

Questions connexes