4

ファイルが開いているときに変更されない一意の識別子を使用して、VBA で外部ブックを参照するにはどうすればよいですか? 完全なファイルパスが含まれていて、同じ名前のファイルが開いていない場合は正常に機能します。ただし、ファイルが開かれている場合、ファイルパスを含む完全な形式は機能せず、ファイル名だけでは機能しません。

すべての参照を更新するために更新サブを作成したかったのですが、スプレッドシートが開いていると、これはうまくいきません (以下のポイント 2 を参照)。

これらは、私がそれが可能であるべきだと思ういくつかの理由です:

  1. 手動リンク更新メニューには、参照するファイル名しかないようです。
  2. また、同じ名前の 2 つのワークブックを開くことはできないため、ソース リンクを開くと、セル参照がファイル パスからファイル名に変更されます (これこそが問題の原因です。

これは私が現在持っているコードでupdCellRef、ファイルパスへのセル参照です(ファイル名を使用したいだけです):

    Sub updateValues(updCellRef)
        updFilePath = ActiveWorkbook.Sheets("INPUTS").Range(updCellRef).Value
        ActiveWorkbook.updateLink Name:=updFilePath, Type:=xlExcelLinks
    End Sub

この問題を明確にするために、上記の関数を使用して値を更新していたときに発生しましたが、ソース スプレッドシートが開いていると、ファイル名だけで参照されます。閉じられると、完全なファイル パスによって参照されます。

Excel Professional 2010 v14 と VBA v7.0 を使用しています。

注: 管理者権限がないとインストールできないため、Power Query を含む他のソフトウェアは使用したくありません。

4

5 に答える 5

1

以下のようなものを試すことができます

  1. リンクが開いているブックからのものかどうかをテストする
  2. 使用されている場合は、ChangeLinkExcel をだまして更新を行わせるために使用します。
  3. そうでない場合は、閉じた本で機能する既存のコードを実行します。

コード

 Sub updateValues()
 Dim updFilePath As String
 Dim Wb As Workbook
 Dim bFound As Boolean

 updFilePath = ActiveWorkbook.Sheets("INPUTS").Range(updCellRef).Value

 For Each Wb In Application.Workbooks
 If Wb.FullName = updFilePath Then
    ActiveWorkbook.ChangeLink Wb.Name, Wb.Name
    bfound = True
    Exit For
 End If
 Next

 If Not bfound Then ActiveWorkbook.UpdateLink Name:=updFilePath, Type:=xlExcelLinks
End Sub
于 2016-08-16T09:10:52.957 に答える
1

ファイル名に情報を追加して一意にする方法は 2 つあります。それは、開いているファイルが同じ名前を共有していないことがわかっている Excel でファイルを開くか、パス全体を含めることです。そのため、参照している同じ名前を共有するすべてのファイルのどれが不確実になるため、それらが開いていない限り、「ファイル名だけを使用して VBA で外部ワークブックを参照する」ことはできません。

これは、MS Office サポートのソースで、「ソースが開かれていない場合、外部参照にはパス全体が含まれます」と書かれています。

更新:元の質問へのコメントを考えると、私たちはここにいると思います:

  1. 開いているファイルと、それらが開いているため、既に更新されている必要があるそれらへのリンクに満足しています
  2. 指定されたパスを介してそれらを見つけることができ、同じファイル名で開いている別のファイルがない場合に、強制的に更新したいファイルのリストがあります

これを試してください:

 Sub updateValues(updFilepath As String)
    If Not FileInUse(updFilepath) Then
        ActiveWorkbook.UpdateLink Name:=updFilepath, Type:=xlExcelLinks
    'else workbook is open and Excel have automatically updated linke
    End If
End Sub

Public Function FileInUse(sFileName As String) As Boolean
On Error Resume Next
Open sFileName For Binary Access Read Lock Read As #1
Close #1
FileInUse = IIf(Err.Number > 0, True, False)
On Error GoTo 0 
End Function

ファイルテスト機能は、ファイルが開いているかどうかをテストする方法についても、この質問に答える user2267971 の厚意によるものです

于 2016-08-15T09:50:22.030 に答える