Excel VBA 質問スレッド №2131 (解決済)

GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか

投稿者 : VBA始めました     投稿日時 : 2025/07/01(Tue) 10:52:14     OS : Windows 11     EXCEL : Excel 2007
はじめまして。

VBAを始めまして、初歩的なことで恐縮ですが質問させて頂きました。


以下は一部抜粋したものですが


  Dim str1 As Variant, fileName As Variant

  str1 = Application.GetOpenFilename()

  fileName = Dir(str1)

Range("O10:O13") = "=VLOOKUP(G10,'[fileName]Sheet名'!$E:$AS,11,0)" 




fileNameの中にApplication.GetOpenFilenameで取得したブック名が入っているのですが、
中にあるブック名を読まず、再度ブック名を読みに行こうとして、ファイルの選択画面になってしまいます。

ブック名の中身を取得していることはMsgBoxで確認済みです。

どのような形式で書けばfileNameの中を読みにいってくれるでしょうか?

ご協力のほど宜しくお願い致します。

スポンサーリンク
[返信 1] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : 匿名     投稿日時 : 2025/07/01(Tue) 11:55:45
変数「str1」「fileName」ともにVariiant型ではなく、
文字型でも同じです。

つまり、どちらにも「文字列」が入っているだけで、
ファイル自体が入っているわけではありません。

Dim wb As Workbook
Set wb = Workbooks.Open(filename)

これを実行して初めて、ExcelWorkbookが
ワークシートオブジェクトとして扱えます。

[返信 2] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : VBA始めました     投稿日時 : 2025/07/01(Tue) 13:13:59
■[返信 1] 匿名さん(2025-07-01 11:55:45)の記事
ご返信ありがとうございます。

> Dim wb As Workbook
> Set wb = Workbooks.Open(filename)

> これを実行して初めて、ExcelWorkbookが
> ワークシートオブジェクトとして扱えます。
ありがとうございます。お教示頂いた通りWorkbookを用いてやってみます。

後頂いた返信で申し訳ございませんが、追加で質問させてください。

以下のような形式でブック名.シート名(シート名は実際のシート名を直書き)で記載しましたがうまくいきません。


"=VLOOKUP(G10,'[wb]シート名'!$E:$AS,11,0)"



ブック名と直書きのシート名を繋げる時はどのように記載すればよろしいでしょうか?初歩の初歩の質問で申し訳ございません。

お忙しい所恐縮ですが何卒宜しくお願い致します。

[返信 3] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : 匿名     投稿日時 : 2025/07/01(Tue) 15:22:20
>"=VLOOKUP(G10,'[wb]シート名'!$E:$AS,11,0)"

"=VLOOKUP(G10,'[" & wb.Name & "]シート名'!$E:$AS,11,0)"
これでもプログラムの順序や書き方によってはエラーが出ると思います。


出来ない原因は、文字列とオブジェクトを混同していることですかね。

文字列:ファイルパス・ファイル名などの文字の列
    よって、コンピュータは、
    ExcelファイルなのかWordファイルなのかは
    一切判断できません。
    (xlsxという文字あってもExcelファイルと認識できません)

オブジェクト:命令や属性を持った物体
       例えば、Excelというアプリケーション自体もオブジェクトのひとつ、
       A1セルというのもオブジェクトのひとつと考えます。
       Excelには「ファイルを開く」という命令や、オプションなどの属性があります。
       1つ1つのセルにも、選択する、値を消すなどの命令や、背景色、罫線などの属性があります。


まずは、以下のサンプルコードを標準モジュールに書いて、
コメント通りの環境を作って、ステップイン実行して
1つ1つの行が、どんなことをしているのか動きを見てみましょう。


'1つのフォルダに2つのExcelファイルを作ります
'aaa.xlsx
'bbb.xlsx
'
'同じフォルダ内に1つのマクロ付きExcelファイルを作ります
'book1.xlsm
'
'
'bbb.xlsxファイルのA1セルに、
'aaa.xlsxファイルのA1セルを参照する式を入れるプログラムです。
'
'aaa.xlsxもbbb.xlsxも開いた状態で式を入れるので、
'ファイルパスはコード上には書いていません。
'ファイルパスを入れるとエラーになると思います。
'
'
Sub Sample()
    Dim wbA As Workbook
    Dim wbB As Workbook
    
    'aaa.xlsxファイルを開き「wbA」というワークブックオブジェクトを生成
    Set wbA = Workbooks.Open(ThisWorkbook.Path & "\aaa.xlsx")
    
    'bbb.xlsxファイルを開き「wbB」というワークブックオブジェクトを生成
    Set wbB = Workbooks.Open(ThisWorkbook.Path & "\bbb.xlsx")
    
    'aaa.xlsxファイルのA1セルを参照する式を入れる※直書きする場合
    wbB.Worksheets("Sheet1").Range("A1").Formula = "=[aaa]Sheet1!$A$1"
    
    'aaa.xlsxファイルのA1セルを参照する式を入れる※変数を利用する場合
'    wbB.Worksheets("Sheet1").Range("A1").Formula = "=[" & wbA.Name & "]Sheet1!$A$1"

    wbA.Close True
    wbB.Close True
    
    Set wbA = Nothing
    Set wbB = Nothing

End Sub

[返信 4] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : VBA始めました     投稿日時 : 2025/07/01(Tue) 16:06:19
■[返信 3] 匿名さん(2025-07-01 15:22:20)の記事
再度のご回答ありがとうございました。本当に助かりました。


> >"=VLOOKUP(G10,'[wb]シート名'!$E:$AS,11,0)"

> "=VLOOKUP(G10,'[" & wb.Name & "]シート名'!$E:$AS,11,0)"
> これでもプログラムの順序や書き方によってはエラーが出ると思います。


> 出来ない原因は、文字列とオブジェクトを混同していることですかね。

本当にそうでした。頂いた回答を見るまで、オブジェクトと文字列の違いが分かっていなかったです。



> 文字列:ファイルパス・ファイル名などの文字の列
>     よって、コンピュータは、
>     ExcelファイルなのかWordファイルなのかは
>     一切判断できません。
>     (xlsxという文字あってもExcelファイルと認識できません)

> オブジェクト:命令や属性を持った物体
>        例えば、Excelというアプリケーション自体もオブジェクトのひとつ、
>        A1セルというのもオブジェクトのひとつと考えます。
>        Excelには「ファイルを開く」という命令や、オプションなどの属性があります。
>        1つ1つのセルにも、選択する、値を消すなどの命令や、背景色、罫線などの属性があります。

こちらのご説明を頂いてやっと理解に至りました。


> まずは、以下のサンプルコードを標準モジュールに書いて、
> コメント通りの環境を作って、ステップイン実行して
> 1つ1つの行が、どんなことをしているのか動きを見てみましょう。


> '1つのフォルダに2つのExcelファイルを作ります
> 'aaa.xlsx
> 'bbb.xlsx
> '
> '同じフォルダ内に1つのマクロ付きExcelファイルを作ります
> 'book1.xlsm
> '
> '
> 'bbb.xlsxファイルのA1セルに、
> 'aaa.xlsxファイルのA1セルを参照する式を入れるプログラムです。
> '
> 'aaa.xlsxもbbb.xlsxも開いた状態で式を入れるので、
> 'ファイルパスはコード上には書いていません。
> 'ファイルパスを入れるとエラーになると思います。
> '
> '
> Sub Sample()
> Dim wbA As Workbook
> Dim wbB As Workbook

> 'aaa.xlsxファイルを開き「wbA」というワークブックオブジェクトを生成
> Set wbA = Workbooks.Open(ThisWorkbook.Path & "\aaa.xlsx")

> 'bbb.xlsxファイルを開き「wbB」というワークブックオブジェクトを生成
> Set wbB = Workbooks.Open(ThisWorkbook.Path & "\bbb.xlsx")

> 'aaa.xlsxファイルのA1セルを参照する式を入れる※直書きする場合
> wbB.Worksheets("Sheet1").Range("A1").Formula = "=[aaa]Sheet1!$A$1"

> 'aaa.xlsxファイルのA1セルを参照する式を入れる※変数を利用する場合
> ' wbB.Worksheets("Sheet1").Range("A1").Formula = "=[" & wbA.Name & "]Sheet1!$A$1"

> wbA.Close True
> wbB.Close True

> Set wbA = Nothing
> Set wbB = Nothing

> End Sub


丁寧なご指導痛み入ります。
こちらのサンプルコードを自分の端末で実施してようやく理解できました。
上記で申し上げた通り、自分文字列でオブジェクトのような書き方をしておりました。
詰まっていた問題箇所も解決致しました。本当にありがとうございました。

[返信 5] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : tek     投稿日時 : 2025/07/02(Wed) 07:13:52
解決済みですが、

■[質問] VBA始めましたさん(2025-07-01 10:52:14)の記事


> Range("O10:O13") = "=VLOOKUP(G10,'[fileName]Sheet名'!$E:$AS,11,0)" 
> どのような形式で書けばfileNameの中を読みにいってくれるでしょうか?

単に文字列の生成ミスだと思います。

VLOOKUPワークシート関数はブックを開かなくとも動作します。これだけならセル値を参照するだけなのでブックとして開くことは無駄とも言えます。
ファイルはフルパスで指定します。
但し、ご承知のようにブック名を[]で囲む必要が有りますので、文字列操作関数などでstr1を加工する必要があります。
ファイルが存在するのは確実ですし、ファイル名はstr1に含まれていますので、Dir関数は不要です。

なお、Application.GetOpenFilenameはExcelファイルと限定した方が良いと思います。
また、拡張子がExcelブックを表すファイルに対してExcelブックで無いかもしれないなどとは通常考慮する必要は無いと思います。
私は今までそのようなコードをプロシージャに入れたことも入ったコードを見たこともありません。
Sub test()
    Dim str1 As Variant, fileName As String
    Dim pos As Long

    str1 = Application.GetOpenFilename("Excelブック,*.xls*")    'フルパス取得
    If str1 = False Then Exit Sub
    pos = InStrRev(str1, "\")
    fileName = Mid(str1, pos + 1)                               'ファイル名取得
    fileName = Left(str1, pos) & "[" & fileName & "]"           '[]で囲む
    Range("O10:O13").Formula = "=VLOOKUP(G10,'" & fileName & "Sheet名'!$E:$AS,11,0)"
End Sub

[返信 6] Re : GetOpenFilename()で取得したブック名を参照するにはどうすればいいのでしょうか
投稿者 : VBA始めました     投稿日時 : 2025/07/02(Wed) 10:57:08
■[返信 5] tekさん(2025-07-02 07:13:52)の記事
> 解決済みですが、

> ■[質問] VBA始めましたさん(2025-07-01 10:52:14)の記事

> >
> > Range("O10:O13") = "=VLOOKUP(G10,'[fileName]Sheet名'!$E:$AS,11,0)" 
> > どのような形式で書けばfileNameの中を読みにいってくれるでしょうか?

> 単に文字列の生成ミスだと思います。

> VLOOKUPワークシート関数はブックを開かなくとも動作します。これだけならセル値を参照するだけなのでブックとして開くことは無駄とも言えます。
> ファイルはフルパスで指定します。
> 但し、ご承知のようにブック名を[]で囲む必要が有りますので、文字列操作関数などでstr1を加工する必要があります。
> ファイルが存在するのは確実ですし、ファイル名はstr1に含まれていますので、Dir関数は不要です。

ご回答ありがとうございました。
文字列の作成ができていませんでしたか。ご指摘ありがとうございます。

Dir関数は不要なのも教えて頂き気づきました。確かにいらないですね。

> なお、Application.GetOpenFilenameはExcelファイルと限定した方が良いと思います。
> また、拡張子がExcelブックを表すファイルに対してExcelブックで無いかもしれないなどとは通常考慮する必要は無いと思います。
> 私は今までそのようなコードをプロシージャに入れたことも入ったコードを見たこともありません。
> Sub test()
> Dim str1 As Variant, fileName As String
> Dim pos As Long

> str1 = Application.GetOpenFilename("Excelブック,*.xls*") 'フルパス取得
> If str1 = False Then Exit Sub
> pos = InStrRev(str1, "\")
> fileName = Mid(str1, pos + 1) 'ファイル名取得
> fileName = Left(str1, pos) & "[" & fileName & "]" '[]で囲む
> Range("O10:O13").Formula = "=VLOOKUP(G10,'" & fileName & "Sheet名'!$E:$AS,11,0)"
> End Sub


テストコードまでありがとうございました。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-07-04 14:18:43 )
タイトルとURLをコピーしました