エクセルマクロを使ってできることの代表的な例として、データの転記があります。
データを転記する場合でも、同じシート内で転記するのか別シートに転記するのかでコードの記述方法が変わってきます。
この記事では、同じシート内で転記する方法から始めて、別シートに転記する方法についても解説しています。
本格的に転記する際に必須となる繰り返し処理についても解説していますので、参考にしてみてください。
エクセルマクロについては、下記にまとめた記事もあります!
【まとめ記事】エクセルマクロのすべて!マクロとは?から作り方まで
エクセルマクロを使って別シートに転記をするイメージ
エクセルマクロを使って別シートに転記をする意味としましては、Aという表からBという表に指定の条件にあてはまるものだけをコピーするようなイメージです。
具体例の1つとして、例えば病院の「来患表」という表から「初診」にあてはまる人だけを、初診の人だけをまとめた表に転記するようなものです。
このような機能を実現するには、
- どこからどこまでを転記するのか
- どのような条件で転記するのか
といったことをプログラミングしていく必要がありますが、まずは単純にデータを転記するにはどのようにしたらよいのか、ということについて解説していきます。
エクセルマクロで別シートに転記をする方法
単純に転記する方法
エクセルマクロで単純に転記をする方法としては「イコールでつなぐ」だけです。
まずは同じシート内で転記をする場合について考えます。
同じシート内でただ転記をしたい場合、VBAの記述は非常にシンプルです。
B2セルの内容をB5セルに転記したいとすると、
Range("B5") = Range("B2")
これだけで実現可能です、とても分かりやすいですね。
この記述ですと、必ず同シート内での転記となります。
Range("B2")
という記述にはブック名・シート名等が省略されているため、その辺りを含めて記述すると
Thisworkbook.Sheets(1).Range("B2")
となります。何となく分かるかと思いますが、「Thisworkbook」という部分が自分のワークブックということを示し、「Sheets(1)」が1番目のシート、「Range("B2")」がB2セルを示します。
では、違うシートに転記をしたい場合、「Sheets(1)」のところを変更すれば良いことが分かりますね。
例えば1番目のシートのB2セルの値を2番目のシートのB5セルに転記したい場合、
Thisworkbook.Sheets(2).Range("B5") = Thisworkbook.Sheets(1).Range("B2")
という記述で実現することができます。
Sheets(1)、Sheets(2)などの記述だと順番でしか指定できませんが、シート名で指定することもできます。
例えばシート名が「管理表A」・「管理表B」だとします。
管理表AシートのB2セルの内容を管理表BシートのB5セルに転記したい場合、下記のようなコードとなります。
ThisWorkbook.Sheets("管理表B").Range("B5") = ThisWorkbook.Sheets("管理表A").Range("B2")
別シートに転記をする方法は以上です。次に、繰り返し転記をする方法について解説します。
繰り返し転記する方法
これまでの方法だと、「B2セルの内容をB5セルに転記する」など1回限りの転記しかすることができませんでした。
「B2セルの内容をA1~A20セルに転記する」など繰り返し転記を行いたい場合、繰り返し処理(ループ処理)を使うと便利です。
繰り返し処理には主に、
VBAの繰り返し処理
- For Nextを使う方法
- Do Loopを使う方法
がありますが、For Nextがよく使われるのでおすすめです。For Nextを使った繰り返しの転記について簡単に解説します。
繰り返し処理をするにあたって、セルの指定を数字にするほうが都合が良いため、
Range("A1")
という表現ではなく、
Cells(1,1)
という表現でコードを記載します。
この2つは意味は同じなのですが、Cellsという表現を使うと、A1・A2などのセル番地の表現を行番号,列番号で記載することができます。
Range・Cellsの例
- Range("A1")とCells(1,1)は同じ ※A1セルは1行目&1列目のため
- Range("D5")とCells(5,4)は同じ ※D5セルは5行目&4列目のため
管理表AのB2セルの値を管理表BのA1~A10セルに転記することをやっていきたいと思います。
まず、何も考えずRangeを使って記述すると下記のようになります。
ThisWorkbook.Sheets("管理表B").Range("A1") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A2") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A3") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A4") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A5") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A6") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A7") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A8") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A9") = ThisWorkbook.Sheets("管理表A").Range("B2")
ThisWorkbook.Sheets("管理表B").Range("A10") = ThisWorkbook.Sheets("管理表A").Range("B2")
これくらいの量であれば少し見にくいだけですが、これがA1~A1000セルまで転記となると1行ずつ記述は不可能になってきます。そこで繰り返し処理を使ってスッキリさせましょう。
まずは、RangeでなくCellsを使った記述にします。
ThisWorkbook.Sheets("管理表B").Cells(1,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(2,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(3,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(4,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(5,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(6,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(7,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(8,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(9,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
ThisWorkbook.Sheets("管理表B").Cells(10,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
このコードを見てみると、Cellsの行指定の数字が1から10まで順番になっていることが分かります。ここを繰り返し処理にすると下記のようなコードにすることができます。
Dim i As Long
For i = 1 to 10
ThisWorkbook.Sheets("管理表B").Cells(i,1) = ThisWorkbook.Sheets("管理表A").Cells(2,2)
Next
行指定の部分を変数iにして、そこに1から10の数字を繰り返し入れていくような繰り返し処理に変更しています。
長い記述が1行にまとまって、非常にスッキリしましたね。
まとめ:転記は繰り返し処理で速く・スッキリ
エクセルマクロを使って、別シートにデータを転記する方法についてお分かりいただけましたでしょうか?
ただ転記をするだけでしたらシート名を記載してイコールでつなげば転記することができます。
しかしデータ量が膨大になってくるとイコールでつないだ文を何十行・何百行と記述するわけにはいかないのでFor Nextなどの繰り返し処理を使ってコードをスッキリさせることができます。