Contents
前回の復習
前回の続きです。異なるブック(Book)の値を取得するという方法の説明に入りましょう。
前回の最後にも書いた転記の手順は以下のようなイメージです。
- コピー元のブックを開く
- コピー元のシートを選ぶ
- コピー元のセルをコピーする
- コピー先のシートを選ぶ
- コピー先のセルを選ぶ
- 貼り付け処理をする
今回の記事のポイントは「1.コピー元のブックを開く」です。他の部分は前回の内容などを確認していただければよいかと思います。
ブック(Book)を開く方法
上記に書いている通りブック(Book)の転記を行うには”ブック(Book)を開く”という作業が必要です。いつもやっているGUI(画面から)の動作で考えると、ファイルをダブルクリックしたり、右クリックで「開く」を選択したりする”あれ”です。
この”開く”作業もVBAというプログラムで書くことが出来ます。
例えば、同じフォルダの中に「ワークシートA.xlsx」と「ワークシートB.xlsx」があったとします。それぞれの中身は以下の通りです。
今回の「コピー元のブック」は”ワークシートB .xlsx “になります。コピー先は”ワークシートA .xlsx “となります。
作業としては”ワークシートA .xlsx “にVBAを記述して”ワークシートB .xlsx “を「開く」プログラムを書こうと思います。
では”開く”プログラムを見てみましょう。
‘ブック(Book)の塊を入れる箱→変数
Dim wb As Workbook
‘開いたブック(Book)の塊をwbという名前の箱に代入(=)する
Set wb = Workbooks.Open(パス)
‘処理が終わった後、ブック(Book)を閉じる
wb.Close False
新しいキーワード
ここで新しいキーワードが4つ出てきました。
- 変数
- パス(PATH)
- Workbooks.Open(パス)
- wb.Close False
ひとつひとつ説明していきましょう。
変数
まずは、「Dim wb As Workbook」のコメントで出てきた変数です。中心となるのは「wb」の部分で、これは「箱」です。いろいろなものを入れる箱だと思ってください。箱に入れる”いろいろ”というのは、物理的なモノをイメージするかもしれませんが、自然界にある「りんご」や「みかん」や「くま」や「うし」という事ではなくて、「数字」「文字列」のような塊から「セル(cell)」「シート(sheet)」「ブック(Book)」という少し大きな(イメージの)塊までいろいろな”塊の単位”を一時的に入れておくことが出来る「箱」です。
今回用意しているのは「workbook」の箱です。 これは今回のプログラムで働いてくれるブック(Book)を入れる箱と考えてください。「Dim~As~」は変数を宣言するときの決まり文句なので必ず付けます。
言葉にすると 「ブック(Book)の塊を入れる箱をwbという名前で作ります」という事になります。
パス(PATH)
次にパスです。これはエクスプローラーに表示されているファイルがどこに保存しているかの場所の事です。
上記の赤枠の部分がパスですね。このファイルのパスは?と聞かれたら「C(ドライブ)のtemp(フォルダ)」と答えるわけです。
Workbooks.Open (パス)
次が Workbooks.Open(パス) です。ここが今回の本丸です。ファイルを「開く」プログラム。”パス”の部分に開きたいブック(Book)のパスを記述するわけですね。今回で言えば、「 Workbooks.Open(“C:\temp\ワークシートB.xlsx”) 」となります。「¥」が「 \ 」になっていますが、どちらも同じものと考えてしまいましょう。
wb.Close False ※開いたら閉じる
通常でも処理が終わればブック(Book)を閉じます。プログラムでブック(Book)を開いても、閉じる処理は必要です。そのためのコードが「wb.Close False」です。wbは開いたブック(Book)の塊が入っている「箱」でしたね。この「箱」の中身に対して”閉じる”(Close)の処理をしていると考えましょう。ただ、最後の”False”だけは少し気になりますよね。
この”False”は保存をするかしないかのパラメータです。開いたブック(Book)に何らかの処理を行うと閉じる際に「保存しますか?」と聞かれると思いますが、その時の保存する/しないのボタンを押す代わりと考えてください。当然”True”にすれば、保存することになりますが、今回は”ワークシートB.xlsx”には変更しているわけではないので、どちらにしても意味はありません。保存すれば、それだけ処理が多くなるので、Falseにしましょう。
開いているのに画面に表示されない?
さて、改めてですが「 Set wb = Workbooks.Open(“C:\temp\ワークシートB.xlsx”)」のイメージが湧くでしょうか?言葉で表すと「指定したブック(Book)を開いてBookの塊を変数「wb」に代入している」になります。
通常、ブック(Book)を開くと画面上にまさに”開いて”表示されるわけですが、プログラムでブック(Book)を開くとパソコンの中では同じように開いた状態にはなっていますが、画面上に出力するのではなくて、プログラムの変数に出力(代入)されるイメージです。
開いた後も通常はマウスやキーボードなどの画面入力で操作しますが、プログラムで開いた場合は、操作もプログラムのコードで行うことになります。やることは同じでも操作方法が違うという感覚が持てると良いかと思います。
プログラムの全体像
では、ファイルを開く方法が分かったところで全体のプログラムを見てみましょう。
今回やることは「”ワークシートA.xlsx”のセル(Cell) B3に、”ワークシートB.xlsx”のセル(Cell) B2の値を転記」します。
プログラムは以下の通りです。
Sub sample()
‘ブック(Book)の塊を入れる箱→変数
Dim wb As Workbook
‘開いたブック(Book)の塊をwbという名前の箱に代入(=)する
Set wb = Workbooks.Open(“C:\temp\ワークシートB.xlsx”)
‘転記処理
Worksheets(“Sheet1”).Range(“B3”).Value = _
wb.Worksheets(“Sheet1”).Range(“B2”).Value
‘処理が終わった後、ブック(Book)を閉じる
wb.Close False
End Sub
これまで習った部分のみ使っていると思います。気になる点といえば、「wb.Worksheets~」の部分でしょうか。これまでは同じブック(Book)の中の処理だったために「どのブック(Book)か」という記述は書かなくても「今、開いているブック(Book)」と分かりました。
しかし、今回は他のブック(Book)を開いて処理を行っているので、自分以外のブック(Book)の処理については、シート(sheet)の更に上位に「どのブック(Book)か」という情報を付与しなければいけないということです。
ここで使わなければ、どこで使うんだ・・という感じもありますが・・。
このプログラムを”ワークシートA.xlsx”のプログラムとして記述して実行してみてください。どうでしょうか。うまく “ワークシートB.xlsx” の値を取得することが出来たでしょうか。
保存する場合は「xlsm」と拡張子を変えて保存するんでしたね。思い出してください。
次は
いかがでしたでしょうか、シート(sheet)の転記に比べると、別ブック(Book)を指定する方法は”開く”という概念が新しく出てきましたが、実際の作業を比べていただくと処理の流れは理解できるのではないかと思います。
これで様々なところから転記することが出来るようになったので、次に必要になりそうなのは「いっぱいのシート(sheet)」とか「いっぱいのブック(Book)」から転記する場合が考えられます。従業員から個別に提出されたExcelファイルをひとつのExcelファイルにまとめるなどの処理です。
次回は、そういった場合のプログラム方法について考えてみましょう。