【Excel VBA】ファイルを選択して開く実践的なコード(GetOpenFilenameメソッド)

Excel活用術

こんにちは、まりもです。

「Excel VBAの勉強をしたけど、実際に仕事で使えるような複雑なコードが書けない」

そんな悩みをお持ちではないでしょうか?

このブログでは、私が日々の仕事で実際に作成し活用しているコードを紹介します。

今回は、GetOpenFilenameメソッドを用いてファイルを開く作業を自動化するコードです。

ファイルパスを設定したセルを参照してファイルを自動で開いて内容を抽出するコードは
こちらを参考にしてください。

この記事を読んで出来ること
  • 別ブックのファイル名を指定して開くことができる
  • 指定して開いたファイルの内容を抽出することができる
  • 誤ったファイルを開いた時に回避することができる
この記事で使うメソッドや関数、ステートメント、プロパティ
  • GetOpenFilename
  • StrConv
  • InStrRev
  • Mid
  • Like
  • MsgBox
  • If
  • ScreenUpdating
  • ClearContents
  • Copy
  • Close
  • Open

用意するもの

このマクロを動かす為に、事前に2つのファイルを用意しておきます。

マクロを書くExcelファイル

このExceファイルの標準モジュールにコードを書いていきます。

ファイル名は何でもOK。

指定して開くExcelファイル

呼び出す用のExcelファイルは、ファイル名のどこかに「data」を入れてください。

また、1シートめのA1セルに「No」と入れておいてください。

私は「testdata.xlsx」という名前をつけて以下のようなデータセットを作成しました。

やること

マクロを書くExcelファイルから「testdata.xlsx」を開き、
「testdata.xlsx」にあるデータをコピーし、
マクロを書くExcelファイルにペーストします。

実際のコード

Sub ファイルを選択して開く()

Dim myFilename As String
Dim myStr As String

   myFilename = Application.GetOpenFilename(Title:="ファイルを選択してください")

      'キャンセルボタンを押した場合  
     If StrConv(myFilename, vbUpperCase) = "FALSE" Then 
       Exit Sub
     End If

      '誤ったファイルを開いた場合        
     If Not myFilename Like "*data*" Then    
       MsgBox "dataファイルではない?", vbOKOnly, "Information"
       Exit Sub
     End If
        
   myStr = Mid$(myFilename, InStrRev(myFilename, "\") + 1)  'book名取得
        
   Application.ScreenUpdating = False

   ThisWorkbook.Worksheets(1).Cells.ClearContents

   Workbooks.Open Filename:=myFilename, ReadOnly:=True


   '誤ったファイルではないか再度確認
     If Not Workbooks(myStr).Worksheets(1).Cells(1, 1).Value Like "*No*" Then                                            
       MsgBox "該当ファイルではありません", vbOKOnly, "Information"
       Workbooks(myStr).Close
       Exit Sub
     End If

   Workbooks(myStr).Worksheets(1).Cells.Copy _
          Destination:=ThisWorkbook.Worksheets(1).Cells(1, 1)
   Workbooks(myStr).Close

   Application.ScreenUpdating = True


End Sub

解説

どのような動きになるか解説していきます。

GetOpenFilenameメソッド
myFilename = Application.GetOpenFilename(Title:="ファイルを選択してください")

このGetOpenFilenameメソッドを使うと【ファイルを開く】ダイアログボックスが表示されます。

Titleで指定した文言が左上に表示されます。

StrConv関数、Ifステートメント、Exitステートメント
  'キャンセルボタンを押した場合  
     If StrConv(myFilename, vbUpperCase) = "FALSE" Then 
       Exit Sub
     End If

【ファイルを開く】ダイアログボックスでキャンセルボタンを選択した場合、
戻り値は「False」となります。

StrConv関数のvbUpperCaseで大文字変換した文字列が「FALSE」となった場合、
Exit subで処理を終了します。

Ifステートメント(Not条件)、Like演算子、MsgBox関数
   '誤ったファイルを開いた場合        
     If Not myFilename Like "*data*" Then    
       MsgBox "dataファイルではない?", vbOKOnly, "Information"
       Exit Sub
     End If

誤ったファイルを開いた場合に処理を進めないようにします。

ファイル名はLike演算子で文字列比較します。

ファイル名が違う場合はMsgBoxを出して、Exit subで強制終了します。

Mid関数、InStrConv関数
myStr = Mid$(myFilename, InStrRev(myFilename, "\") + 1)  'book名取得

ファイルを選択すると、myFilenameにはGetOpenFilenameメソッドの戻り値として
ファイルのフルパスとファイル名が格納されています。

どのように格納されているかMsgBoxで表示させてみます。

ここからMid関数とInstrRev関数を組み合わせてファイル名だけを取得し、
myStrに格納します。

InstrRev関数は文字列の中から指定した文字列を最後の文字位置から検索を開始し、
最初に見つかった文字位置を返す関数です。

ScreenUpdatingプロパティ
Application.ScreenUpdating = False

これ以降、セルのコピーペースト操作等をするので、ScreenUpdatingプロパティで
画面の更新を停止しておきます。

処理の高速化にもなりますし、画面のちらつきが無くなってシステム感が出ます。

ClearContentsメソッド
ThisWorkbook.Worksheets(1).Cells.ClearContents

別ブックからコピーしてくる前に現在のシートのデータを消しておきます。

ClearContentsメソッドは数式と文字のみを消すメソッドです。

Openメソッド
Workbooks.Open Filename:=myFilename, ReadOnly:=True

先ほどGetOpenFilenameでmyFilenameに格納したファイルを指定します。

ReadOnly:=Trueとして読み取り専用モードで開きます。

Closeメソッド
  '誤ったファイルではないか再度確認
     If Not Workbooks(myStr).Worksheets(1).Cells(1, 1).Value Like "*No*" Then                                            
       MsgBox "該当ファイルではありません", vbOKOnly, "Information"
       Workbooks(myStr).Close
       Exit Sub
     End If

ファイルを開いた後、再度該当シートに抽出対象の値があるか確認します。

無い場合はCloseメソッドでブックを閉じ、処理を終了します。

Copyメソッド
Workbooks(myStr).Worksheets(1).Cells.Copy _
          Destination:=ThisWorkbook.Worksheets(1).Cells(1, 1)
   Workbooks(myStr).Close

Application.ScreenUpdating = True

開いたmyStrファイルの1シート目にある値をコピーし、
現ブックの1シート目にペーストします。

コピー後、用の無くなったmyStrファイルは閉じます。

ScreenUpdatingプロパティをTrueにして画面更新を再開します。

まとめ

今回は、ファイルを指定して開いて内容を抽出する一連の流れを説明しました。

1つの動作の中でも様々なメソッドを使用していることが
わかったかと思います。

「マクロを勉強したけどいまいち書き方がわからない」

そんな方の参考になれば幸いです。

ではまた。

コメント

タイトルとURLをコピーしました