エクセルの神髄様の Twitter 企画「VBA100本ノック」に挑戦してみたいと思います。 ますはその1本目から。 FillAcrossSheets メソッドを使ってみます。
お題:VBA100本ノック 1本目:セルのコピー
#VBA100ノック 1本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月19日
「Sheet1」のA1:C5のセル範囲を、「Sheet2」のA1:C5にコピーしてください。
値も数式も書式も全てコピーしてください。
ただしSelectメソッドは使用禁止
※行高と列幅の設定はしなくて良い。
問題ページ
方針
セルのコピーは Excel VBA の基本ですね。
セルのコピーに関連したメソッドには Copy や Paste 、PasteSpecial、FillAcrossSheets などがあり、それぞれクセがあるので状況によって使い分けられなければなりません。
本記事としてはそのうち、 Worksheets/Sheets オブジェクトの FillAcrossSheets メソッド を使ってみます。
ただしこれが適用できるのは、本題のように、コピー先が同じブックのワークシートで、かつセル範囲のアドレスも同じという状況に限られます。
解答:FillAcrossSheets を使ってみる
Sub VBA100_001() Worksheets(Array("Sheet1", "Sheet2")).FillAcrossSheets Worksheets("Sheet1").Range("A1:C5") End Sub
考察
FillAcrossSheets メソッド はあまり知られていないメソッドかもしれません。
FillAcrossSheets メソッドは Copy メソッドのようにセル範囲を別シートにコピーするものです。
コピー先Worksheets.FillAccrossSheets コピー元セル範囲
複数のシートに一括でコピーできるところが Copy メソッドなどと異なります。 その代わりコピー先のアドレスを指定することができず、コピー元と同じセル位置に展開されます。 別ブックのシートからはコピーできません。
コピー先の指定には、 Worksheets(あるいはSheets) にシート名かインデックスを配列(Array)にして渡してやります。 このとき、配列にはコピー元のワークシートも含める必要があり、さもないとエラーになります。
FillAcrossSheets メソッドにはコピー対象を選べるオプションがあります。
- xlfillwithall セル内容と書式
- xlfillwithcontents セル内容のみ
- xlfillwithformats 書式のみ
セル内容は値と数式です。ふりがなは xlfillwithall ではコピーされるのですが、なぜか xlfillwithcontents ではされません。 xlfillwithcontents は表示形式をコピーしないので日付はシリアル値になるでしょう。
書式は表示形式、スタイル、セルの結合、条件付き書式を含みます。
シート全体のセル範囲をコピー対象とすると、セルの内容や書式だけでなく、セルの幅や高さもコピーされます。
クリップボードにコピーしたセル範囲はクリアされますが、テキストのコピーなどシステムのクリップボードはクリアされません。
速度的には Copy メソッドよりも高速になるようです。
dim wb as Workbook set wb = ActiveWorkbook ' インデックスで指定 wb.Worksheets(Array(1,2)).FillAccrossSheets wb.Worksheets(1).Range("A1:L10"), xlfillwithformats ' 新規シートに書式をコピー wb.Worksheets.Add Before:=1, Count:=12 wb.Worksheets(Array(1,2,3,4,5,6,7,8,9,10,11,12, "雛形")).FillAccrossSheets _ wb.Worksheets("雛形").Range("A1:L10"), xlfillwithformats ' 先頭シートをすべてのシートにコピー wb.Worksheets.FillAcrossSheets wb.Worksheets(1).UsedRange