EnjomonWeb

ストックフォトサービスの画像

Excel VBA ダイアログボックスからファイルを選択して開く | GetOpenFilename

仕事でVBAを使うことがあり、やりたいことはネットで調べていますが、VBA初心者の私が分かりづらかったものを、初心者でも分かるように説明したいと思います。

効率的なコードが書けていない可能性もありますので、予めご了承ください。

今回はGetOpenFilenameを使用し、ダイアログボックスからファイルを指定し開く方法を紹介したいと思います。

使用ケース

ダイアログボックスからファイルを選択して開くを使用するケースとして、私が使用しているのは以下のようなケースです。

・ファイルA・・・日々変化する複数項目の数値を、人毎・月毎にまとめたファイル

・ファイルB・・・特定の人だけの、一部の項目だけを参照するファイル

ファイルBにVBAを設定し、集計したい月のファイルAのデータを選択し取り込むことで、特定の人の集計を簡単にできるようにしています。

サンプルコード

まずは最低限のサンプルコードです。

カレントフォルダ設定のアドレスを変更すれば、基本的にコピペで使用可能です。


Declare Function SetCurrentDirectory Lib "kernel32" Alias _
"SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long

Sub fileopen()

  Dim varFileName As Variant

  SetCurrentDirectory "C:\Users\Owner\Desktop\test" 'カレントフォルダ設定
  varFileName = Application.GetOpenFilename(FileFilter:="EXCELファイル(*.xlsx; *.xlsm;),*.xlsx", Title:="ファイルの選択")

  If varFileName = False Then
    MsgBox "読込を中止します。"
  Else
    Workbooks.Open varFileName, ReadOnly:=True, UpdateLinks:=False
  End If

End Sub


コード解説

Declare ステートメント

Declare Function SetCurrentDirectory Lib "kernel32" Alias _
"SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long

まずはDeclare ステートメントです。

この部分がネットにはほとんどのってなくて、とても苦労しました。。。

Declare ステートメントとは、「外部ファイル内で実装されているプロシージャへの参照を宣言します。」というものらしいです(気になる方はお調べくださいw)。

なぜファイル選択で必要なのか分かりませんでしたが、私の職場・自宅のPCでは、Declare ステートメントを記載しないとエラーになってしまいました。

VBAのみならずプログラミングのあるあるですが、おまじない的なものだと考えています。

カレントフォルダ設定

 SetCurrentDirectory "C:\Users\Owner\Desktop\test"

カレントフォルダ設定では、VBAを実行した際に、表示されるフォルダを予め指定する際に設定します。

こういったマクロを組む際、選択するファイルが格納されているフォルダは固定されていることが多いのではないかと思います。

カレントフォルダを設定しなかった場合、マクロを実行する度にファイルがあるフォルダまで進んでいく必要があり、とても手間です。フォルダを固定する必要がなければ不要ですが、固定されている場合は設定をおすすめします。

GetOpenFilename

varFileName = Application.GetOpenFilename(FileFilter:="EXCELファイル(*.xlsx; *.xlsm;),*.xlsx", Title:="ファイルの選択")

メインのGetOpenFilenameメソッドですが、これでファイルが選択可能となります。

FileFilter:=""で、表示されるファイル種類の限定が可能です。

中止処理

If varFileName = False Then
    MsgBox "読込を中止します。"
  Else
    Workbooks.Open varFileName, ReadOnly:=True, UpdateLinks:=False
End If

最後にファイルの展開と、中止した場合の処理をifで分岐しています。

ファイルを展開する場合、元データを取得したいだけなので、ReadOnly:=Trueで読み取り専用で開いています。

あとは目的に応じて、開いた後の処理を書けばOKです!

ちなみに私は元データ(ファイルA)のシートを全コピーし、集計ファイル(ファイルB)の指定シートへ貼り付けし使用しています。

Excel VBAの画像

ユーザーフォームを使用した入力フォームの作り方

Excel VBAの画像

週ごとに縦に並んだ表を横並びにする方法 | Find&Set

Excel VBAの画像

セルに入力された日付を取得し自動でシートとファイルを作る方法

Excel VBAの画像

検索窓にキーワードを入力しEnterキーで検索するフォームの作り方 | Intersect

Excel VBAの画像

ブックを開いた時のウィンドウサイズを指定する方法 | workbook_open

Excel VBAの画像

新規ブックを作成しマクロが登録されたボタンを設置する方法 | OnAction

Excel VBAの画像

複数のワークシートをまとめて表示・非表示にする方法 | Visible Not.Visible

Excel VBAの画像

セル位置が変わっても特定の範囲を選択する方法 | Find&Address

Excel VBAの画像

電話番号からハイフンを削除し0から表示させる方法 | Evaluate&Replace

Excel VBAの画像

ダイアログボックスからファイルを選択して開く | GetOpenFilename

About

EnjomonWebは、「えんじょもん」である元転勤族の管理人が石川県金沢市から発信する、WEB制作情報をメインとした情報発信サイトです。

コーディング習得過程で検索してもすぐに解決しなかったことや、初心者には分かりづらい内容を分かりやすく説明することができるサイトを目指しています。

※「えんじょもん」とは金沢弁で「遠方の人、県外出身の人」という意味の方言。