web-dev-qa-db-fra.com

Chemins relatifs au lieu de chemins absolus dans Excel VBA

J'ai écrit une macro Excel VBA qui importe des données à partir d'un fichier HTML (stocké localement) avant d'effectuer des calculs sur les données.

Pour le moment, le fichier HTML est référencé avec un chemin absolu:

Workbooks.Open FileName:="C:\Documents and Settings\Senior Caterer\My Documents\Endurance Calculation\TRICATEndurance Summary.html"

Cependant, je veux utiliser un chemin relatif pour y faire référence par opposition à absolu (c'est parce que je veux distribuer la feuille de calcul à des collègues qui pourraient ne pas utiliser la même structure de dossiers). Comme le fichier html et la feuille de calcul Excel se trouvent dans le même dossier, je n'aurais pas pensé que ce serait difficile, mais je suis tout simplement incapable de le faire. J'ai cherché sur le Web et les solutions suggérées sont toutes apparues très compliquées.

J'utilise Excel 2000 et 2002 au travail, mais comme je prévois de le distribuer, je voudrais qu'il fonctionne avec autant de versions d'Excel que possible.

Toutes les suggestions reçues avec reconnaissance.

42
Gene

Juste pour clarifier ce que yalestar a dit, cela vous donnera le chemin relatif:

Workbooks.Open FileName:= ThisWorkbook.Path & "\TRICATEndurance Summary.html"
66
dbb

Vous pouvez utiliser l'un d'entre eux pour la racine du chemin relatif:

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path
19
yalestar

Je pense que le problème est que l'ouverture du fichier sans chemin ne fonctionnera que si votre "répertoire courant" est correctement défini.

Essayez de taper "Debug.Print CurDir" dans la fenêtre Exécution - qui devrait montrer l'emplacement de vos fichiers par défaut comme défini dans Outils ... Options.

Je ne suis pas sûr d'être complètement satisfait, peut-être parce que c'est en quelque sorte un héritage VB command, mais vous pouvez le faire:

ChDir ThisWorkbook.Path

Je pense que je préférerais utiliser ThisWorkbook.Path pour construire un chemin vers le fichier HTML. Je suis un grand fan du FileSystemObject dans le Scripting Runtime (qui semble toujours être installé), donc je serais plus heureux de faire quelque chose comme ça (après avoir défini une référence à Microsoft Scripting Runtime):

Const HTML_FILE_NAME As String = "my_input.html"

With New FileSystemObject
    With .OpenTextFile(.BuildPath(ThisWorkbook.Path, HTML_FILE_NAME), ForReading)
        ' Now we have a TextStream object that we can use to read the file
    End With
End With
2
Mike Woodhouse

si le répertoire actuel du système d'exploitation est le chemin du classeur que vous utilisez, Workbooks.Open FileName:= "TRICATEndurance Summary.html" suffirait. si vous effectuez des calculs avec le chemin d'accès, vous pouvez vous référer au répertoire courant comme . et alors \ pour indiquer que le fichier se trouve dans ce répertoire, et si vous devez changer le répertoire courant du système d'exploitation pour le chemin de votre classeur, vous pouvez utiliser ChDrive et ChDir pour le faire.

ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
Workbooks.Open FileName:= ".\TRICATEndurance Summary.html"
1
robotik

Vous pouvez offrir plus de flexibilité à vos utilisateurs en leur fournissant Bouton Navigateur

Private Sub btn_browser_file_Click()
Dim xRow As Long
Dim sh1 As Worksheet
Dim xl_app As Excel.Application
Dim xl_wk As Excel.Workbook
Dim WS As Workbook
Dim xDirect$, xFname$, InitialFoldr$
InitialFoldr$ = "C:\"
With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = Application.DefaultFilePath & "\"
    .Title = "Please select a folder to list Files from"
    .InitialFileName = InitialFoldr$
    .Show
    Range("H13").Activate
    If .SelectedItems.Count <> 0 Then
        xDirect$ = .SelectedItems(1) & "\"
         Range("h12").Value = xDirect$
        xFname$ = Dir(xDirect$, 7)
        Do While xFname$ <> ""
         If (Format(FileDateTime(xDirect$ & "\" & xFname$), "MM/DD/YYYY") > Format(Range("H10").Value, "MM/DD/YYYY")) Then
            ActiveCell.Offset(xRow) = xFname$
            xRow = xRow + 1
            xFname$ = Dir
            Else
            xFname$ = Dir
            xRow = xRow
        End If
        Loop
    End If
End With

avec ce morceau de code, vous pouvez y parvenir facilement. Code testé

1
Simpal Kumar