【VBA】煩雑なコピペ作業を自動化-#3 ブックレベルの処理-
VBAによるコピペ作業の自動化、三つ目の記事です。
この記事までで、実は結構なことができるようになります。
3-1. ブック、シートの指定、設定
複数のブックやシートを操作する場合はまずはどのブック、シートを操作するの?ってことを指定してあげないといけません。
前回の記事で
Cells(1, 1).Select
といった記載をしていましたが、これはまじめに省略しないで書くと以下のようになります。すべて同じ意味です。
ActiveWorkbook.ActiveSheet.Cells(1, 1).Select ThisWorkbook.ActiveSheet.Cells(1, 1).Select Workbooks("ブック名").Worksheets("シート名").Cells(1, 1).Select
Activeというのは今操作しているブックやシートということで、Thisというのはこのプログラムを書いているブックということです。
Activeなブックやシートは複数のブックやシートを操作するときには処理状況によって具体的なブックやシートが変わるので、可読性や保守性の面から使用しないほうが良いです。
省略できるなら書かない方が楽なのですが、AブックからBブックにコピーしたいとなるとそうもいきません。でも毎回「Workbooks("ブック名").Worksheets("シート名")」書くのは大変だし、エクセルのファイル名とか変わったら全部直さないといけないの?となります。
そこでブックやシートの設定(Set)です。
Dim wb As Workbook 'ワークブックオブジェクトを宣言 Dim ws As Worksheet 'ワークシートオブジェクトを宣言 Set wb = Workbooks("ブック名") 'ブックを変数「wb」に設定 Set ws = wb.Worksheets("シート名") 'シートを変数「ws」に設定 ws.Cells(1, 1).Select
「'」はVBAのコメントの書き方です。
このようにブックやシートを変数に格納して以降はそれを使うようにすればOKです。またシートの登録の際、wbで「どのブックか」も指定しているので、wsを使うときはwbをいちいち指定する必要はありません。
3-2. ブックを開く、閉じる
ブックを開いたり閉じたりしていきます。
これは簡単で、開きたいブックのパスを指定して「Open」メソッドに渡してあげるだけです。
Workbooks.Open ("ファイルパス")
例えば
Workbooks.Open ("C:\Users\user1\Desktop\ファイル名.xlsx")
フォントの関係でバックスラッシュになってますが、きっと¥マークになると思います。¥マークで大丈夫です。
このままですと違うファイルを開きたいときはいちいちプログラムを直さないといけなくなるので、
Dim ws As Worksheet 'ワークシートオブジェクトを宣言 Dim filePath As String 'ファイルパスを入れる文字列を宣言 Set ws = ThisWorkbook.Worksheets("シート名") 'シートを設定 filePath = ws.Cells(1, 1) 'シートのA1セルにファイルパスを入力しておく Workbooks.Open (filePath) 'シートのA1セルにファイルパスのファイルを開く
ファイルパスを別変数にしておけば、A1セルのファイルパスを書き変えるだけでプログラムを直さずにいろんなファイルが開けます。ファイルパスはフォルダまでではなく、エクセルファイルのファイル名まで書いてあげる必要がある点が注意です。
閉じる場合は以下を書くだけです。
wb.Close
このメソッドには閉じるときに保存するかどうかのオプションが用意されていて保存したくないときは
wb.Close savechanges:=False
とします。savechanges を書かない状態でプログラム内で変更があったブックを wb.Close すると、×ボタンを押して閉じたときと同じように保存するかどうか聞かれるウィンドウが開いてしまいます。(プログラムがいったん止まります。)
3-3. ブックをコピー
コピーには「FileCopy」を使います。
FileCopy [コピー元ファイルパス], [コピー先ファイルパス]
という使い方になります。
Dim ws As Worksheet 'ワークシートオブジェクトを宣言 Dim foldPath As String 'フォルダパスを入れる文字列を宣言 Set ws = ThisWorkbook.Worksheets("シート名") 'シートを設定(ブックはThisを使って省略) foldPath = ws.Cells(1, 1) 'シートのA1セルにフォルダパスを入力しておく FileCopy foldPath & "\" & "サンプルブック.xlsx", foldPath & "\" & "サンプルブック_コピー.xlsx"
前回と多少書き方を変えています。ファイル名まで含めたパスではなく、コピーを行うフォルダまでのパスにし、ブックの名前を文字列結合します。こうすることで同じフォルダの中で複数のファイル操作をする場合に、ファイル名だけを変更することができます。
&はVBAで文字列を結合するときの演算子です。
3-sample. 複数のファイルをコピーし、各ファイルを編集する
というプログラムを書いてみます。
ファイル名でループできるようにファイル名にはコピー時に連番などを付与しておきます。
Sub ans() Dim wb As Workbook Dim ws As Worksheet Dim foldPath As String Dim fileName As String Dim sheetName As String foldPath = "C:\Users\user1\Desktop" FileCopy foldPath & "\" & "サンプルブック1.xlsx", foldPath & "\" & "サンプルブック2.xlsx" For i = 1 To 2 fileName = "サンプルブック" & i & ".xlsx" sheetName = "Sheet1" Workbooks.Open (foldPath & "\" & fileName) Set wb = Workbooks(fileName) Set ws = wb.Worksheets(sheetName) ws.Cells(1, 1) = fileName wb.Close savechanges:=True Next End Sub
以上です。複数のブックに対してその中身を自動で更新できるようになりました。