web-dev-qa-db-ja.com

Excel VBAの絶対パスではなく相対パス

データの計算を実行する前に、HTMLファイル(ローカルに保存)からデータをインポートするExcel VBAマクロを作成しました。

現時点では、HTMLファイルは絶対パスで参照されます。

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

ただし、絶対パスではなく相対パスを使用して参照します(これは、同じフォルダー構造を使用していない可能性のある同僚にスプレッドシートを配布するためです)。 htmlファイルとExcelスプレッドシートが同じフォルダーにあるので、これは難しいとは思わなかったでしょうが、それを完全に行うことはできません。私はウェブで検索しましたが、提案された解決策はすべて非常に複雑に見えました。

私は職場でExcel 2000および2002を使用していますが、配布する予定があるため、できるだけ多くのバージョンのExcelで動作するようにしたいと考えています。

どんな提案もありがたいことに受けました。

42
Gene

Yalestarが言ったことを明確にするために、これは相対パスを提供します:

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

次のいずれかを相対パスルートに使用できます。

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path
19
yalestar

問題は、「カレントディレクトリ」が正しく設定されている場合にのみ、パスなしでファイルを開くことができることだと思います。

イミディエイトウィンドウに「Debug.Print CurDir」と入力してみてください。ツール...オプションで設定したデフォルトファイルの場所が表示されます。

私はそれが完全に満足していると確信していません。おそらくそれはレガシーのVBコマンドですが、これを行うことができます:

ChDir ThisWorkbook.Path

ThisWorkbook.Pathを使用して、HTMLファイルへのパスを作成したいと思います。私はScripting Runtime(常にインストールされているようです)のFileSystemObjectの大ファンなので、(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

オペレーティングシステムの現在のディレクトリが使用しているブックのパスである場合、Workbooks.Open FileName:= "TRICATEndurance Summary.html"で十分です。パスを使用して計算を行う場合、現在のディレクトリを.として参照し、次に\としてファイルがそのディレクトリにあることを確認できます。また、osの現在のディレクトリをワークブックのパスでは、ChDriveChDirを使用してそうすることができます。

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

ユーザーにBrowser Buttonを提供することにより、ユーザーに柔軟性を提供できます。

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

このコードを使用すると、簡単にこれを実現できます。 テスト済みコード

1
Simpal Kumar