47

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

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

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

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

仕事で Excel 2000 と 2002 を使用していますが、配布を計画しているため、できるだけ多くのバージョンの Excel で動作するようにしたいと考えています。

どんな提案もありがたく受け取った。

4

8 に答える 8

74

yalestar の発言を明確にするために、これにより相対パスが得られます。

Workbooks.Open FileName:= ThisWorkbook.Path & "\TRICATEndurance Summary.html"
于 2008-10-18T01:15:12.040 に答える
20

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

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path
于 2008-10-17T19:50:36.127 に答える
2

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

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

おそらくこれはレガシー VB コマンドの一部であるため、完全に満足しているかどうかはわかりませんが、次のようにすることができます。

ChDir ThisWorkbook.Path

ThisWorkbook.Path を使用して HTML ファイルへのパスを作成したいと思います。私はスクリプト ランタイム (常にインストールされているようです) の FileSystemObject の大ファンなので、(Microsoft スクリプト ランタイムへの参照を設定した後) 次のようなことをしたいと思います。

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
于 2008-10-17T20:53:59.290 に答える
1

ユーザーにブラウザ ボタンを提供することで、ユーザーにより多くの柔軟性を提供できます。

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

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

于 2014-01-13T19:27:00.840 に答える
-2

それはおそらく最善の方法ではありません。しかし、絶対パスを取得するために私が見つけた唯一のことは、構文 .. が文字列に含まれていた回数を計算し、その構文がハイパーリンクアドレスに含まれる回数だけ関数 gotoparent を使用することです。(私の場合、私のフィールドはハイパーリンク アドレスです。PS: このコードには、Microsoft Scripting Runtime への参照が必要です。

Function AbsolutePath(strRelativePath As String, strCurrentFileName As String) As String
Dim fso As Object
Dim strCurrentProjectpath As String
Dim strGoToParentFolder As String
Dim strOrigineFolder As String
Dim strPath As String
Dim lngParentFolder As Long


''Pour retrouver le répertoire parent
Set fso = CreateObject("Scripting.FileSystemObject")

'' détermine le répertire du projet actif
strCurrentProjectpath = CurrentProject.Path

'' détermine le nom du répertoire dans lequel le fichier d'origine se trouve
strOrigineFolder = Replace(Replace(Replace(strRelativePath, strCurrentFileName, ""), "..", ""), "\", "")

''Extraction du chemin relatif (ex. ..\..\..)
strGoToParentFolder = Replace(Replace(strRelativePath, strOrigineFolder, ""), strCurrentFileName, "")

''retourne le nombre de fois qu'il faut remonter au répertoire parent
lngParentsFolder = Len(Replace(strGoToParentFolder, "\", "")) / 2

''détermine la valeur d'origine du répertoire du début
strPath = strCurrentProjectpath

Vérifie s 'il faut aller au répertoire parent
If lngParentsFolder < 1 Then
    'si non, alors répertoire parent et répertoire d'origine du fichier
    strPath = strCurrentProjectpath & "\" & strOrigineFolder
Else
    ''si oui, nous faisons la boucle pour retourner au répertoire d'origine
    For i = 1 To lngParentsFolder
        strPath = fso.GetParentFolderName(strPath)
    Next i
End If

''retournons le répertoire parent du fichier et son répertoire d'origine [le OUTPUT]
AbsolutePath = strPath & strOrigineFolder & "\"

End Function
于 2020-10-09T20:25:12.680 に答える