webentwicklung-frage-antwort-db.com.de

Relative statt absolute Pfade in Excel VBA

Ich habe ein Excel-VBA-Makro geschrieben, mit dem Daten aus einer (lokal gespeicherten) HTML-Datei importiert werden, bevor mit den Daten Berechnungen durchgeführt werden.

Momentan wird auf die HTML-Datei mit einem absoluten Pfad verwiesen:

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

Ich möchte jedoch einen relativen Pfad verwenden, um darauf zu verweisen, und keinen absoluten Pfad (dies liegt daran, dass ich die Tabelle an Kollegen verteilen möchte, die möglicherweise nicht dieselbe Ordnerstruktur verwenden). Da sich die HTML-Datei und die Excel-Tabelle im selben Ordner befinden, hätte ich nicht gedacht, dass dies schwierig sein würde, aber ich bin einfach nicht in der Lage, dies zu tun. Ich habe im Internet gesucht und die vorgeschlagenen Lösungen sind alle sehr kompliziert erschienen.

Ich verwende Excel 2000 und 2002 bei der Arbeit, aber da ich beabsichtige, es zu verteilen, möchte ich, dass es mit so vielen Versionen von Excel wie möglich funktioniert.

Anregungen dankbar erhalten.

42
Gene

Um zu verdeutlichen, was yalestar gesagt hat, erhalten Sie den relativen Pfad:

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

Sie können eine dieser Optionen für die relative Pfadwurzel verwenden:

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path
19
yalestar

Ich denke, das Problem ist, dass das Öffnen der Datei ohne Pfad nur funktioniert, wenn Ihr "aktuelles Verzeichnis" richtig eingestellt ist.

Versuchen Sie, "Debug.Print CurDir" in das Direktfenster einzugeben. Dort sollte der Speicherort für Ihre Standarddateien angezeigt werden, wie unter Extras ... Optionen festgelegt.

Ich bin mir nicht sicher, ob ich damit ganz zufrieden bin, vielleicht, weil es ein bisschen wie ein Legacy-Befehl ist VB), aber Sie könnten dies tun:

ChDir ThisWorkbook.Path

Ich denke, ich würde lieber ThisWorkbook.Path verwenden, um einen Pfad zur HTML-Datei zu erstellen. Ich bin ein großer Fan von FileSystemObject in der Scripting Runtime (die immer installiert zu sein scheint), daher würde ich gerne Folgendes tun (nachdem ich einen Verweis auf Microsoft Scripting Runtime festgelegt habe):

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

wenn das aktuelle Verzeichnis des Betriebssystems der Pfad der von Ihnen verwendeten Arbeitsmappe ist, würde Workbooks.Open FileName:= "TRICATEndurance Summary.html" ausreichen. Wenn Sie mit dem Pfad rechnen, können Sie das aktuelle Verzeichnis als . und dann \ bezeichnen, um festzustellen, dass sich die Datei in diesem Verzeichnis befindet, und falls Sie das aktuelle Verzeichnis des Betriebssystems ändern müssen Zum Pfad Ihrer Arbeitsmappe können Sie ChDrive und ChDir verwenden, um dies zu tun.

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

Sie können Ihren Benutzern mehr Flexibilität bieten, indem Sie ihnen Browser-Schaltfläche zur Verfügung stellen

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

mit diesem Code können Sie dies auf einfache Weise erreichen. Geprüfter Code

1
Simpal Kumar