見出し画像

19-貼り付け先のファイル開いてる?(エクセルマクロ)

デスクトップに特定のファイルが開いているかどうか確認する!

皆さんこんにちは!
今回は、ファイル間でコピー&ペーストをする際に、使用するファイルが開かれているのかを確認するコードの書き方をご紹介します。
例えば、貼付け先のファイルが開いていないのに貼付けようとするとエラーで止まってしまいます。

関連動画【マクロルーティン24

◆参照マクロ

マクロルーティン#13で書いたマクロを使ってコードを追加していきます。

画像1

★上のコードは1行で書くコードを「 _」(アンダーバーを使って)2行で書いています。
[コーピー元].Copy [コーピー先]

◆参照マクロの問題点

参照マクロは"マスタファイル.xlsm"の指定範囲をコピーして"作業ファイル.xlsm"に貼り付けるという内容です。
Workbooks("マスタファイル.xlsm"). ~ .Copy _
Workbooks("作業ファイル.xlsm"). ~

このマクロは"マスタファイル.xlsm"と"作業ファイル.xlsm"がどちらも開いている状態であれば実行は成功します。
どちらかのファイルが閉じている状態であればエラーになりマクロは止まります。ここが問題です。

◆エラーで止まらないようにコードを書き足す

ファイルが閉じていたら、メッセージでお知らせする。

◆書くコード

画像2

❶では対象のファイルがデスクトップに開いているのか閉じているのかを確認します。
❷では❶の確認が「閉じている」だったらメッセージを表示してマクロを終了します。
(「開いている」場合はIf文の処理を抜けて次のコードへ進みます。)

◆解説と書く順番

コードテキストーーーーーーーーーーーーーーーーーーーーーーーーーーー

②Dim myfile As Workbook
⑤Dim flg As Boolean

⑤flg = False
①For Each myfile In Workbooks
 ③If myfile.Name = "作業ファイル.xlsm" Then
  ④flg = True
 ③End If
①Next

⑥If flg = False Then
 ⑦MsgBox "作業ファイル.xlsm が開いていません。"
 ⑦Exit Sub
⑥End If

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

▶まず①For Each myfile In Workbooks ①Next
開いているブック達(Workbooks)をひとつづつ取得して繰り返し処理する書き方です。
For Each[変数]In[変数を含む集まり ]

Workbooksの中の一つを myfile(変数) としているので、myfile は Workbookですね。myfileがWorkbookオブジェクトであることを宣言します。
→②Dim myfile As Workbook

画像3


▶次に処理するコードを書いていきます。
 ③If myfile.Name = "作業ファイル.xlsm" Then
  ④flg = True
 ③End If

Workbooksの中の1ブック(myfile)を取得したら、そのブックの名前が開いていてほしいファイル名と一致していた場合
フラグをTrueにします。

画像4

このスイッチみたいな変数をつくります。
変数を「flg」とします。
flg は "False" と "True" どちらかがはいっている変数とします。
こういう変数にぴったりの変数型が boolean です。
変数宣言をします。
Dim flg As Boolean
そして、初期値としてFalseを指定しておきます。
flg = False
これを①でループする前に指定しておけば、

ーーーーーーーーーーーーーーーーーーーー
flg = False
①For Each myfile In Workbooks
 ③If myfile.Name = "作業ファイル.xlsm" Then
  ④flg = True
 ③End If
①Next
ーーーーーーーーーーーーーーーーーーーー

③で myfile.Name = "作業ファイル.xlsm" となれば、次の④flg = True で flg がFalseから Trueに変わり、"作業ファイル.xlsm"が開いているということになります。
①のFor Eachステータスを抜けた時点で flg がFalse のままだった場合は③で myfile.Name = "作業ファイル.xlsm"となるブックがなかったということなので、"作業ファイル.xlsm"は開いていないということになります。

次っ!

ーーーーーーーーーーーーーーーーーーーーーーーーーー
⑥If flg = False Then
 ⑦MsgBox "作業ファイル.xlsm が開いていません。"
 ⑦Exit Sub
⑥End If
ーーーーーーーーーーーーーーーーーーーーーーーーーー

"作業ファイル.xlsm"が開いている (flg = True) か、閉じている (flg = False) かがわかったところで、閉じている (flg = False)場合にはメッセージボックスでお知らせしてマクロを終了する。

★気を付けるところは⑦Exit Subを忘れずに書くことです。
このコードを書かなかった場合、"作業ファイル.xlsm"が閉じているというメッセージが出た後マクロを終了せずに⑥の If 文を抜けた後も実行が続き、エラーで止まってしまうことになります。

◆関連動画


この記事が気に入ったらサポートをしてみませんか?