PR

【ExcelVBA】他のブックを開いて書き込む方法(読み取り専用の場合は終了)

VBA

他のブックを開いて、書き込む処理をするマクロの作成方法を例に説明します。
他のブックに書き込む場合に必要な、ファイルが誰かが開いていて読み取り専用だった場合は終了するという処理を追加しています。
すぐにコードが見たい方は見出しの「2.VBAコードの書き方」をクリックしてジャンプしてご覧ください。

スポンサーリンク

マクロで実行する内容

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

開いたファイル変更する場合は、ファイルが書き込み可能な状態かを調べる必要があります。
他の人が開いていたときはファイルが読み取り専用になってしまうので、ファイルを開いてから読み取り専用かどうか調べて、読み取り専用の場合は処理を中止する仕組みを追加しています。

① 開くファイルのPATHを変数に格納する
② 開くファイルが存在するか確認する(存在しない場合は終了する。)
③ ファイルを開く(アラートを無視して開く)
④ 開いたファイルが読み取り専用だった場合は終了する
⑤ 自ブックのデータをコピーし、開いたファイルに貼り付ける
⑤ 開いたファイルを保存して閉じる

◆フォルダの状態

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

エクセルVBA-他のブックを開いて書き込む-フォルダの状態

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

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

エクセルVBA-他のブックを開いて書き込む-自ブックの状態(マクロ実行前)

またA4セル~C16セルには表のデータを用意しておきます。
この表データを開いたブックに貼り付ける処理を行います。

◆データを書き込むファイルの実行前の状態

開いてデータを書き込む対象のファイル「ファイルA.xlsx」の実行前の状態です。
Sheet1は空でなにもない状態にしておきます。

エクセルVBA-他のブックを開いて書き込む-書き込むファイルの状態(マクロ実行前)

◆マクロ実行後の状態

マクロを実行すると完了メッセージが表示されます。

エクセルVBA-他のブックを開いて書き込む-自ブックの状態(マクロ実行後)

用意した「ファイルA.xlsx」を開いてみるとデータが転記されていることが分かります。

エクセルVBA-他のブックを開いて書き込む-書き込むファイルの状態(マクロ実行後)
スポンサーリンク

VBAコードの書き方

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

Sub Sample()

Dim FilePath As String
Dim TargetFile As Workbook

    'シートに書いてあるファイルパスを変数に設定
    FilePath = ActiveSheet.Range("B2")
  
    'ファイルが存在しない場合は終了する
    If Dir(FilePath) = "" Then
    
        'アラートメッセージを表示する
        MsgBox "ファイルが存在しません。処理を中止します。"
        
        '処理を抜ける
        Exit Sub
    End If
    
    'アラートを表示しない
    Application.DisplayAlerts = False
    
    'ファイルを開く
    Workbooks.Open Filename:=FilePath
    
    'アラートの表示設定を戻す
    Application.DisplayAlerts = True
    
    '開いたファイルを変数にセットする
    Set TargetFile = ActiveWorkbook
    
    '読み取り専用の場合は終了する
    If ActiveWorkbook.ReadOnly = True Then
    
        '開いたファイルを閉じる
        TargetFile.Close
        
        '変数の初期化
        Set TargetFile = Nothing
        
        'アラートメッセージを表示する
        MsgBox "ファイルが編集中のため処理を中止します。"
     
        '処理を抜ける
        Exit Sub
    End If
    
    '自ブックの表データをコピー
    ThisWorkbook.Worksheets("Sheet1").Range("A4:C16").Copy
    
    '開いたブックのシートへ貼り付ける
    TargetFile.Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteAll
    
    'コピーモード解除
    Application.CutCopyMode = False
    
    '開いたファイルを閉じる(保存する)
    TargetFile.Close SaveChanges:=True
    
    '変数の初期化
    Set TargetFile = Nothing
    
    MsgBox "完了しました"
    
End Sub
スポンサーリンク

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

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

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

If Dir(FilePath) =“” Then
’ファイルがないときの処理
End Sub
End If

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

    'ファイルが存在しない場合は終了する
    If Dir(FilePath) = "" Then
    
        'アラートメッセージを表示する
        MsgBox "ファイルが存在しません。処理を中止します。"
        
        '処理を抜ける
        Exit Sub
    End If
スポンサーリンク

解説:開いたブックが読み取り専用かどうか確認する

ファイルが他の人によって開かれていた場合、「読み取り専用で開きますか?」のエクセルから確認メッセージが表示されます。「はい」を選択すると読み取り専用で開くことができますが、もちろん書き込むことができません。

今回はデータを書き込むマクロを作りたいので、読み取り専用だった場合は処理を中止するようにする必要があります。

↓ファイルが開かれていた場合のメッセージ

エクセルVBA-他のブックを開いて書き込む-自ブックの状態(読み取り専用だった場合のエラー)

マクロの書き方は色々な方法がありますが、今回はエクセルのアラートを出ない設定に変更しておいて、ファイルを開き、ファイルを開いてから読み取り専用かどうかを確認する処理にしています。

アラートを表示しない設定にするにはDisplayAlertsを「False」に設定変更します。
(基本はTrueになっています。)

’アラートを表示しない設定にする
Application.DisplayAlerts = False

そして次にファイルを開きます。
アラートを非表示にしているので、誰かが開いていてもここで「読み取り専用で開きますか?」メッセージは表示されません。

‘ファイルを開く
Workbooks.Open Filename:=FilePath

そしてアラート表示設定を戻してから、ファイルが読み取り専用かどうかを調べています。

If ActiveWorkbook.ReadOnly = True Then
 ’ファイルが読み取り専用だったときの処理
End If

読み取り専用だった場合は、ファイルを閉じて、アラートメッセージを表示して処理を中止します。

    'アラートを表示しない
    Application.DisplayAlerts = False
    
    'ファイルを開く
    Workbooks.Open Filename:=FilePath
    
    'アラートの表示設定を戻す
    Application.DisplayAlerts = True
    
    '開いたファイルを変数にセットする
    Set TargetFile = ActiveWorkbook
    
    '読み取り専用の場合は終了する
    If ActiveWorkbook.ReadOnly = True Then
    
        '開いたファイルを閉じる
        TargetFile.Close
        
        '変数の初期化
        Set TargetFile = Nothing
        
        'アラートメッセージを表示する
        MsgBox "ファイルが編集中のため処理を中止します。"
     
        '処理を抜ける
        Exit Sub
    End If
スポンサーリンク

解説:開いたブックへデータを書き込む

開いたブックへデータを書き込む処理について説明します。
開いたブックを操作するためには、変数にセットしておいた方が便利です。

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

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

    'ファイルを開く
    Workbooks.Open Filename:=FilePath
    
    'アラートの表示設定を戻す
    Application.DisplayAlerts = True
    
    '開いたファイルを変数にセットする
    Set TargetFile = ActiveWorkbook

開いたブックを変数にセットしているので、これを使ってデータの書き込みを行います。
今回は自ブックのSheet1にある表のデータをコピーして、開いたブックのSheet1のA1セルへ貼り付けを行っています。

マクロ処理で複数のファイルを開いているときは、自ブックに対する処理は必ずThisworkbookを付けてブックを指定する必要があります。

‘自ブックのデータをコピー
ThisWorkbook.Worksheets(“Sheet1”).Range(“A4:C16”).Copy

開いたブックを対象に行う処理はWorkbook型変数(今回は変数「TargetFile」)を指定して記述します。

‘開いたブックのシートへ貼り付ける
TargetFile.Worksheets(“Sheet1”).Range(“A1”).PasteSpecial Paste:=xlPasteAll

    '自ブックのデータをコピー
    ThisWorkbook.Worksheets("Sheet1").Range("A4:C16").Copy
    
    '開いたブックのシートへ貼り付ける
    TargetFile.Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteAll
    
    'コピーモード解除
    Application.CutCopyMode = False
スポンサーリンク

解説:ブックを保存して閉じる

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

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

開いたファイルに変更を加えていない場合は「TargetFile.Close」だけでも閉じることができますが、今回は書き込んだデータを保存したいので引数の「SaveChanges:=True」を追加して保存して閉じるようにしています。

’開いたファイルを閉じる(保存して閉じる)
TargetFile.Close SaveChanges:=False

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

‘変数の初期化
Set TargetFile = Nothing

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

関連記事(他のブックからデータをコピー)

他のブックを操作するマクロについては下の記事でも紹介しています。

スポンサーリンク

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

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

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