素人がExcelVBAによる「一人働き方改革」に挑むブログスマートフォン用の表示で見る素人がExcelVBAによる「一人働き方改革」に挑むブログExcelVBAネタです。VBA自作クラス子ブックを生み出すクラス元のブックを開いたままでコピーを作成する元のブックのシートにデータを入力しては別名で保存して、同じ様式でデータの異なるたくさんのブックを作りたいというときがある。Worksheetオブジェクトの場合なら、Copyメソッドがあるので簡単にできるが、WorkbookオブジェクトにはCopyメソッドがないので、上記のようなことがしたいときに、不便だなあと思っていた。ブックの複製を作るときの考え方WorkbooksコレクションのAddメソッドで新しいブックを作る。新しくできたブックの先頭に、元のブックのシートをケツから順に挿入していく。新しいブックは、元のブックのシート+デフォルトのシートの状態になっているので、デフォルトのシートをケツから順に削除していく。新ブックに新しい名前を付ける。新ブックの各セルの参照元を新ブックに改める。新ブックにデータを書き込むなどの処理を施す。新ブックを保存して閉じる。この手順でやってみた。子ブックを生み出すクラスの作成ソースコードを示す。'コピー元ブックと同じフルパスを指定していたらエラーを吐かせる。Description:="コピー元ブックと同じフルパスでは実行できません。'コピー元ブックのシートをケツから順に新ブックの先頭に挿入。'シート削除時のアラートを表示させない。'ブック内の参照元ブックを新ブックに改める。Description:="新ブック生成前に実行できません。'新ブックを保存して閉じる。'アラート表示と画面更新を元に戻す。'オブジェクト変数を空にする。Description:="コピー元ブックと同じフルパスでは実行できません。Ifはコメントの通り。エラーを吐いてプログラマに知らせるべきことだと思うので、こうした。With新しくできたブックのシート名を変更している。数式の参照先も更新されなくなってしまう。※なぜこうなるのかは、自分で考えてみてください。before:=newWorkbook_.Worksheets(1)Nextでは、WorksheetオブジェクトのCopyメソッドを使って新しいブックの先頭に、元のブックのシートをケツから順に挿入している。することで、新しいブックは、先頭から元のブックのシートが順番通りに並び、その後ろにデフォルトのシートが並んでいる状態になる。2010以前だとデフォルトのシートが3つ、2013以降だとデフォルトのシートは1つだけですね。'シート削除時のアラートを表示させない。newWorkbook_.Worksheets(i).DeleteNextで新しいブックのケツにくっついている余分なシート(デフォルトのシート)をケツから削除していく。「ケツから」なのかは、よく考えてください。Ifでは、新しいブックの数式等の参照先を自分自身に改めている。これをやっておかないと、数式等の参照先が全部元のブックになってしまう。Trueこんなふうに、この引数を省略可能にしてデフォルトをTrueにしておいた。closeNewWorkbookでは、引数enableToChangeNewWorkbookの値により、一旦呼び出し元に処理を返すか、このまま新しいブックを保存して閉じるかを分岐している。単純に全く同じブックを名前だけ変えて複製するのなら、引数enableToChangeNewWorkbookをFalseにして実行すればよい、ということ。そんなことはしないと思うけど。Description:="新ブック生成前に実行できません。'新ブックを保存して閉じる。'アラート表示と画面更新を元に戻す。'オブジェクト変数を空にする。Subは、新しいブックを保存して閉じるためのメソッド。Description:="新ブック生成前に実行できません。Ifで、newWorkbook_がNothingのとき、すなわちまだ新しいブックが追加されていない場合はエラーを吐くようにした。これまたユーザに知らせるべきことではないと思うので。あと、今回は珍しくデストラクタを作った。その1次のコードで実験してみる。'このブックのあるディレクトリに「収容所」フォルダがなかったら作る。フォルダに3つのブックができている。こんなふうに、参照先も新しいブックになっている。その2今度は、次のコードで実行してみる。'このブックのあるディレクトリに「収容所」フォルダがなかったら作る。Sub今度は、(*)のところで、引数enableToChangeNewWorkbookをTrueにした。することで、createNewWorkbookメソッドはcloseNewWorkbookメソッドを呼び出すことなく終了するので、処理が呼び出し元のtestNewWorkbookCreator_02に帰ってきて、(**)を実行することになる。フォルダ内に3つのブックができている。Sheet3のA3セルにはファイル名が書き込まれている。仕様フィールドnewWorkbook(Workbook型。新しくできたブックを格納する。enableToChangeNewWorkbook])元のブックを複製し、引数newFullNameをフルパスとして保存する。引数enableToChangeLinkがTrueならば、新しいブックの数式等の参照先は新しいブックになる。引数enableToChangeNewWorkbookがTrueならば、新しいブックを保存して閉じる前に一旦メソッドの呼び出し元に帰る。closeNewWorkbook()新しいブックを保存して閉じる。おわりにExcelのブック(シートではなく)をデータ入力用の様式みたいに使っている場合、データを入力しては別名で保存、という繰り返しが結構発生すると思う。そんなときに、このクラスを元の様式ブックに搭載してやれば、だいぶラクになると思う。簡単なやり方がありそう。»プロフィールid:akashi_keirinExcelVBAネタです。SyntaxHighlighter.all();注目記事はてなブログをはじめよう!akashi_keirinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。