エクセルマクロ(その3)ブックを切り替える

複数のエクセルファイルを切り替えながら作業するようなプログラムを作成する場合があります。

その場合、マクロプログラムが保存されたファイルと、通常のエクセルのファイルが画面上に同居する形になります。

マクロプログラムの実行は、必ずマクロを持っているファイルからスタートする必要があるのですが、他のエクセルファイルに移動して、そのファイル内で作業を行うこともできるのです。

通常、処理を行いたいエクセルファイルにマクロプログラムを組み込むことを考えると思いますが、処理を行うファイルが毎日データベースから出力されてくるファイルだったりした場合は、出力されたファイルで毎回マクロプログラムを組み込むことは効率的ではありません。

そこで、マクロを持つエクセルファイルは1つだけで、処理をするエクセルファイルを入れ替えながら、そのたびごとに処理を行うほうが効率的になります。

このようなプログラムを組む場合は、それぞれのエクセルファイルを切り替えて作業する必要があり、ブックの切替えが必要になります。

今回は、ブックの作成、ブックの読み込み、ブックの切替について書いてみたいと思います。

前回までのブログ記事を紹介しておきます。必要があれば参照してください。
エクセルマクロ(その1)VBEの使い方を知ろう
エクセルマクロ(その2)セルの選択方法

 

 

1.ブックのファイル名とパス

ブックのことを説明する前に、マクロプログラムが入ったエクセルのファイルの保存方法について書いておきたいと思います。

通常のエクセルファイルの拡張子は、「.xlsx」なのですが、マクロプログラムが入ったファイルは、この形式では保存することができません。

最初に、マクロプログラムが入った(もしくはこれからマクロを組む予定の)ファイルを保存する時は、ファイルの種類を「Excelマクロ有効ブック(*.xlsm)」として保存するようにしてください。

ここでは、あらかじめ「マクロファイル.xlsm」というファイル名でデスクトップ上に保存されていると考えてください。

標準モジュールを追加してから、以下のプログラムを書いてみましょう。

Sub マクロブックのファイル名()
Debug.Print ThisWorkbook.Name
End Sub

Debug.Printは、その結果をイミディエイトウィンドウに表示させるコマンドです。
イミディエイトウィンドウが表示されていない場合は、VBEのメニューの「表示」から「イミディエイトウィンドウ」をクリックしてください。

エクセル マクロ ブックの保存

上記のように、ファイル名が表示されてきます。

この場合、ThisWorkbookという部分は、マクロを実行したファイルのことを指してします。ThisWorkbook.Nameで、ファイル名となります。

これに対して、アクティブなブック(一番前面に出てきているワークブック)のファイル名を調べる場合は、以下のようになります。

Sub アクティブブックのファイル名()
Debug.Print ActiveWorkbook.Name
End Sub

ActiveWorkbookというのが、一番前面に表示されているワークブックのことになります。

次に、ワークブックのパスについて調べてみましょう。

パスというのは、ファイルが保存されている場所の階層構造を示すものです。

Sub マクロブックのフォルダパス()
Debug.Print ThisWorkbook.Path
End Sub

これを実行すると、以下のように表示されますが、これはあくまでも私のケースなので、マクロファイルが保存された場所によって変化します。

エクセル マクロ フォルダパス

このパスでわかるのは、マクロファイルがどのフォルダに保存されているかというところまでです。

完全なファイルのパスを表示する場合は、以下のように書いてください。

Sub マクロブックのファイルパス()
Debug.Print ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub

上記のコードの中に「\」という記号がありますが、日本語モードのパソコンでは半角の¥マークに相当すると思ってください。ネット上では「¥」マークはバックスラッシュ「\」に変換されて表示されます。(内部的には同一のコードです)

エクセル マクロ ファイルパス

上記のように、ファイルまでのパスが表示されてくると思います。
ここで、パスの中にある「¥」は、フォルダの階層を区切る記号と考えてください。

ファイルを開いたり、ファイルを保存したりする場合は、「ファイルまでのパス」が必要になります。

 

 

2.新しいブックの作成と保存

新しいブックの作成は、以下のプログラムになります。

Sub ブックの作成()
Workbooks.Add
End Sub

こんな簡単なコマンドで、新しいブックが作成されます。

作成されたブックは、まだ保存されていないのでファイル名がついていない状態です。おそらくBook1やBook2のような名前になっているはずです。

そこで、この新しいファイルを保存してみたいと思います。
ファイル名は、「新しいファイル.xlsx」という名前にしてみましょう。

新しいブックが一番前面にある状態で以下のマクロプログラムを実行してみてください。

Sub ブックを名前をつけて保存()
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "新しいファイル.xlsx"
End Sub

このプログラムでは、マクロファイルと同じフォルダに、「新しいファイル.xlsx」という名前で保存されます。

ここで、ActiveWorkbookは一番前面にあるブックを指しています。
「SaveAs」は、「名前をつけて保存」という意味だと思ってください。

ちなみに、すでに保存されているファイルを再度保存する場合は、「Save」のみとなります。

Sub ブックの上書き保存()
ActiveWorkbook.Save
End Sub

 

 

3.エクセルファイルを開く

すでに存在しているエクセルファイルの開く場合についてですが、開く場合もそのファイルまでのファイルパスというものが必要になります。

まず、前の項目で作成した「新しいファイル.xlsx」を閉じてください。

今、このファイルは、デスクトップにありますので、ファイルまでのパスは、
「C:\Users\noko\Desktop\新しいファイル.xlsx」となります。
(実際にVBEに書く場合は、バックスラッシュは半角¥マークになります)
(ファイルパスの中の「noko」は私のパソコンのアカウント名です)

そこで、次にこのファイルを開くプログラムを書いてみましょう。

Sub ブックを開く()
Workbooks.Open "C:\Users\noko\Desktop\新しいファイル.xlsx"
End Sub

ブックを開くときは、「Workbooks.Open」の後に半角スペースを置いてから、開くファイルまでのパスを記述します。

これで、「新しいファイル.xlsx」が開いてアクティブになったと思います。

しかし、ここで問題なのは、開くファイルのパスをいちいち調べてマクロプログラムの中に記述するのは、かなり面倒だということです。

そこで、今度は誰でもブックを簡単に開ける方法をやってみましょう。

次のプログラムは、ブックを自分で選んで開く方法になります。

Sub ブックを自分で選択して開く()
Workbooks.Open Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
End Sub

ここで、「Application.GetOpenFilename(“Microsoft Excelブック,*.xls?”)」の部分が、ファイルを開くダイアログを出してくれる部分で、さらに「(“Microsoft Excelブック,*.xls?”)」の部分は、ファイルの種類を限定しています。

最後の「.xls?」の「?」の部分は、何かの文字が1文字あるという意味です。

さらに、上記のプログラムでは、開くダイアログで「キャンセル」されるエラー処理が行われていないので、正しくは以下のように記述します。

Sub ブックを自分で選択して開く2()
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If OpenFileName <> "False" Then
    Workbooks.Open OpenFileName
Else
    MsgBox "キャンセルされました"
End If
End Sub

いきなり、難しいプログラムになったと思います。

「Dim OpenFileName As String」というのは、変数を宣言している部分です。
変数というのは、いろんなものを入れることができる箱と考えてください。

Dimは、宣言するときに先頭に入れる文字です。
OpenFileNameというのが、変数の名前です。(勝手に考えていい名前です)
As Stringというのは、変数の型を指定する方法です。
Stringというのは、「文字列」の型であることを示しています。

つまり、日本語でいうと、
「私はOpenFileNameという名前の変数を宣言します。その変数の型は文字列です」
という意味になります。

変数については、今後の記事で詳しく説明する予定です。

次の「OpenFileName =・・・・」の部分ですが、
「Application.GetOpenFilename(“Microsoft Excelブック,*.xls?”)」は、前にも出てきたエクセルファイルを開くダイアログのことです。

実際にこれが実行されて、なにがしかのファイルをクリックして「開く」ボタンを押したとしましょう。

そうすると、そのファイルまでのファイルパスが「OpenFileName」に代入されるということになるわけです。

ところが、「開く」ボタンを押さずに「キャンセル」ボタンが押されたとします。
そうすると、「OpenFileName」には「False」という文字が代入されるということになります。つまり、この部分がエラー処理しなければならない部分です。

If OpenFileName <> “False” Then
Workbooks.Open OpenFileName
Else
MsgBox “キャンセルされました”
End If

この部分は、「If ~Else~End If」という条件分けの構文になっています。
その条件は、「OpenFileName <> “False”」になります。

ここで、見慣れない「<>」という記号があると思いますが、これは「イコールではない」ということを表す記号です。
この条件の意味は、「OpenFileName」は「False」とイコールではない時という条件になります。つまり、ファイルが正常に選択されて開くボタンが押された時という意味になります。この条件に合致する場合は、「Workbooks.Open OpenFileName」が実行され、選択したファイルが開くことになります。

「If ~Else~End If」の構文はいずれ詳しく説明しますが、
ここでは、条件が正しくない場合は、「Else」以下の命令を実行します。

つまり、ファイルを開かないで、キャンセルされた場合は、「MsgBox “キャンセルされました”」が実行されるという意味になります。

少し難しかったと思いますが、今回はファイルを自分で選択して開けるマクロプログラムがあるんだと思っていただければ大丈夫です。

 

 

4.ブックを切り替える

エクセルファイルが2個も3個も起動している時に、ウィンドウを切り替える時は、どのようにしたらいいのでしょうか?

人間であれば、エクセルの画面を見ながら、「これだ!」って見つけて切り替えると思います。しかし、プログラム上で切り替えるためには、そういうわけにはいきません。

そこで、ファイルを何らかの方法であらかじめ区別しておく必要があります。

マクロファイルは、最初から立ち上がっていますが、別のファイルを開いた場合には、そのファイルが一番上に表示されてきます。

もう1度、マクロファイルのウィンドウを出すのは、どうすればいいのでしょうか?

この解決方法としては、プログラムを起動した直後に、マクロファイルにニックネームを付けておいたり、新しく開いたファイルは、開いた直後にニックネームを付けておいたり、新しく作成したファイルも、作成した直後にニックネームを付けておけば、そのニックネームで呼び出すことができるのです。

このニックネームのことを、オブジェクト変数といいます。
つまり、それぞれのファイルをオブジェクトとして、変数に当てはめておくということができます。

変数の宣言は、Dimから始まることを前に述べましたが、変数の型がその場合重要になります。

Sub ブックを切り替える()
Dim macrofile As Workbook
Dim newfile As Workbook
'マクロファイルに名前をつける
Set macrofile = ActiveWorkbook
'新しいファイルを作成
Workbooks.Add
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "NewBook.xlsx"
'新しいファイルに名前をつける
Set newfile = ActiveWorkbook
'マクロファイルに切り替える
macrofile.Activate
Range("A1").Value = "これはマクロブックです"
'新しいファイルに切り替える
newfile.Activate
Range("A1").Value = "これは新しいブックです"
'マクロファイルに切り替える
macrofile.Activate
MsgBox "処理が終わりました"
End Sub

ここで、重要なことは、変数の宣言です。
Dim macrofile As Workbook
Dim newfile As Workbook
というように「As Workbook」としてWorkbookオブジェクトの変数であることを宣言します。
書き方はいろいろあって、「As Object」や「As Variant」でもオブジェクト変数は宣言できるのですが、より具体的な方が分かりやすいので「As Workbook」としています。

このオブジェクト変数に、実際のワークブックを代入するときは、
Set macrofile = ActiveWorkbook
Set newfile = ActiveWorkbook
のように、「Set 変数名 = ActiveWorkbook」とします。

もちろん、ActiveWorkbookというのは、一番前面に表示されたワークブックのことなので、目的とするワークブックがアクティブになっている時点で、オブジェクト変数に代入する必要があります。

通常の変数であれば、「変数名 = 文字や数字」となりますが、
オブジェクト変数の場合は、必ず「Set 変数名 = オブジェクト」となりますので、覚えておいてください。

そして、ブックを切り替える時は、
macrofile.Activate
newfile.Activate
のように、「オブジェクト変数.Activate」とするだけでウィンドウが切り替わります。この場合、「.Activate」としているところが重要です。
前の記事で、Activateは1つのセルだけしか選択できないということを書いたと思いますが、今回の場合も、ウィンドウは1つしかアクティブにならないので、Activateを用います。

ちゃんとブックを切り替えて作業していることがわかるように、
それぞれのブックのA1セルに文字を代入しています。

セルに文字を代入する場合は、
Range(“A1”).Value = “これはマクロブックです”
というように、「セル位置.Value = “文字”」とします。

最後に処理が終わったことがわかるように、
MsgBox “処理が終わりました”
としていますが、一般のマクロプログラムを作成した場合にも、マクロの終了がわかるように、最後にこのメッセージを入れることがよくあります。

それと、コードの中にシングルクォーテーションを最初に入れたコメントが書いていると思います。

エクセルマクロの場合、半角のシングルクォーテーションを先頭に入れると、プログラムには含まれないコメントを入れることができます。

 

 

5.まとめ

今回は、エクセルのブックの新規作成方法や保存方法、既存のブックの開き方、そして、開かれた複数のブックの切替方法について説明しました。

エクセルブックは、ファイル名だけでは開いたり、保存したりすることができません。「ファイルパス」を正しく設定したり、取得したりすることが重要になります。

また、エクセルファイルを画面上で切り替える場合には、オブジェクト変数を定義して、「オブジェクト変数.Activate」で簡単に切り替えられることを覚えておいてください。

今回少しですが、変数が出てきていますので、次回は変数について説明したいと思います。