PR

【ExcelVBA】他のブックからデータをコピーする方法(ファイル操作・ファイルを開く・閉じる)

VBA

今回は実務でよく必要になる、他のブックからのデータをコピーする方法を例に他のファイルを操作する方法を説明します。
すぐにコードが見たい方は見出しの「3.VBAコードの書き方」をクリックしてジャンプしてご覧ください。

スポンサーリンク

マクロで実行する内容

以下の動作を行うマクロを作成していきます。

① 開きたいファイルのPATHを変数に格納する
② 開きたいファイルが存在するか確認する(存在しない場合は終了する。)
③ ファイルを開く
④ 開いたファイルのデータを自ブックにコピーする
⑤ 開いたファイルを閉じる(保存しない)

スポンサーリンク

フォルダ・ファイルの準備、マクロ実行後の状態

今回のテストマクロ用に用意したファイルとマクロ実行後の状態について説明します。

◆フォルダの状態

自ブックと開きたいファイルを同じフォルダに置いています。
・sample.xlsm  …自ブック
・ファイルA.xlsx …開きたいファイル
※開きたいファイルの保存場所はどこでも大丈夫です。

エクセルVBA-他のブックのデータを自ブックにコピーする-フォルダの状態

◆自ブックの実行前の状態

自ブックのSheet1のB2セルには開きたいファイルのパスを書いています。
このファイルパスを使ってファイルを開きます。
※開くファイルのパスはコードに直接書くこともできますが、シートなどに書いておく方がメンテナンス性は良いです。(マクロを書けない人でも変更できるので◎)

エクセルVBA-他のブックのデータを自ブックにコピーする-自ブックの実行前の状態

◆開いたファイルのデータをコピー

開いたブックには↓のようなデータがあります。
このデータを自ブックにコピーしたいと思います。

エクセルVBA-他のブックのデータを自ブックにコピーする-開いたファイルのデータをコピー

◆マクロ実行後の状態

開いたファイルAのデータをコピーし、自ブックのA4セルに貼り付けました。
最後に完了メッセージが表示されます。

エクセルVBA-他のブックのデータを自ブックにコピーする-自ブックの実行後の状態
スポンサーリンク

VBAコードの書き方

VBAコードは下のように書きます。コメント部分で各コードの説明を入れています。

Sub Sample2()

Dim FilePath As String
Dim TargetFile As Workbook

    'アラートを表示しない
    Application.DisplayAlerts = False

    'シートに書いてあるファイルパスを変数に設定
    FilePath = ActiveSheet.Range("B2")
  
    'ファイルが存在するか確認する
    If Dir(FilePath) <> "" Then
        '存在する場合、ファイルを開く
        Workbooks.Open FilePath
    Else
    '存在しない場合、エラーメッセージを表示して処理を中止する
        MsgBox "ファイルが存在しません。処理を中止します。"
        Exit Sub
    End If
    
    '開いたファイルを変数にセットする
    Set TargetFile = ActiveWorkbook
    
    '開いたファイルの内容をコピー
    TargetFile.Worksheets("Sheet1").Range("A1:C13").Copy
    
    '自ブックに貼付け
    ThisWorkbook.Worksheets("Sheet1").Range("A4").PasteSpecial Paste:=xlPasteAll
    
    '開いたファイルを閉じる(保存しない)
    TargetFile.Close SaveChanges:=False
    
    '変数の初期化
    Set TargetFile = Nothing
    
    MsgBox "完了しました"

    'アラートの表示設定を戻す
    Application.DisplayAlerts = True
    
End Sub
スポンサーリンク

解説:ファイルがあるか確認する(存在確認)

上のコードではファイルを開く操作の前に、開きたいファイルの存在確認を行っています。
開きたいファイルのパスが誤っていてファイルが開けないときにエラーになってしまうので、ファイルを開く操作を行うときはこの処理を入れておいた方が良いです。

ファイルの存在確認を行うときはDir(ファイルパス)を使って確認します。

If Dir(FilePath) <> “” Then
 ’ファイルがあるときの処理
Else
’ファイルがないときの処理
End If

今回はファイルパスが存在するときはファイルを開く、存在しないときはメッセージを表示して、処理を中止するようにしています。
メッセージボタンにOKを押すと「Exit Sub」で処理を抜けるのでこの後に書いた処理は行わずに終了します。

    'ファイルが存在するか
    If Dir(FilePath) <> "" Then
        'ファイルを開く
        Workbooks.Open FilePath
    Else
        MsgBox "ファイルが存在しません。処理を中止します。"
        Exit Sub
    End If

自ブックのファイルパスを設定しているB2セルの値を空にしておいてからマクロを実行してみると、エラーメッセージが表示されました。

エクセルVBA-他のブックのデータを自ブックにコピーする-ファイルパスが正しくないときのエラーメッセージ
スポンサーリンク

解説:開いたブックのデータをコピーする

他のブックを開いたあとは、開いたブックに対して何か操作したいことが多いと思います。
開いたブックを操作するためには、変数にセットしておいた方が便利です。

ファイルを開いた直後は、開かれたファイルがActive状態になっています。(前面に表示されている状態)
そのActiveになっているファイルを用意しておいた変数「TargetFile」にセットしています。
変数はworkbook型で冒頭で宣言しています。

これで開いたブックが変数にセットされたので、操作するときは変数を使用してブックを指定することができます。

TargetFile.Worksheets(“Sheet1”).Range(“A1:C13”).Copy

そのあとは自ブックに貼り付けを行います。
自ブックしか開いていない状態のときは必要ないですが、他のブックもマクロから開いているときは、自ブックに貼り付ける、ということを明確にする必要があります。

自ブックに対しての操作を書くときはシート名の前に「ThisWorkbook.」と書きます。

ThisWorkbook.Worksheets(“Sheet1”).Range(“A4”).PasteSpecial Paste:=xlPasteAll

    '開いたファイルを変数にセットする
    Set TargetFile = ActiveWorkbook
    
    '開いたファイルの内容をコピー
    TargetFile.Worksheets("Sheet1").Range("A1:C13").Copy
    
    '自ブックに貼付け
    ThisWorkbook.Worksheets("Sheet1").Range("A4").PasteSpecial Paste:=xlPasteAll
スポンサーリンク

解説:開いたファイルを閉じる

開いたブックを閉じる処理について説明します。

開いたブックを閉じるときはWorkbookのCloseメソッドを使用します。
開いたブックをセットしている変数「TargetFile」を使用して「TargetFile.Close」のように記述します。

「TargetFile.Close」だけでも閉じることができますが、引数で保存する・しないを指定することができます。
今回の例では開いたブックに対して変更を加えていないので「保存しない」を指定してブックを閉じています。

開いたファイルに何か変更を加える処理をしている場合は「SaveChanges:=True」で保存して閉じてください。

TargetFile.Close SaveChanges:=False

そして最後にセットしていた変数「TargetFile」を初期化して終了します。
変数を初期化するときは「Set 変数 = Nothing」と書きます。

Set TargetFile = Nothing

    '開いたファイルを閉じる(保存しない)
    TargetFile.Close SaveChanges:=False
    
    '変数の初期化
    Set TargetFile = Nothing
スポンサーリンク

関連記事(他のブックを開いて書き込む処理・読み取り専用の場合は終了)

他のブックを開いてデータを転記する処理の書き方については下の記事で紹介しています。
この記事と重複しているところも多いですが、書き込む場合はブックが読み取り専用かどうかをチェックして、読み取り専用の場合は終了するように処理を分岐しています。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

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