<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>複数シート &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%E8%A4%87%E6%95%B0%E3%82%B7%E3%83%BC%E3%83%88/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 Jul 2026 01:49:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>複数シート &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAで複数シート間のデータを転記・集約する方法｜For Eachで全シート一括コピー</title>
		<link>https://mashukabu.com/vba-copy-data-between-sheets/</link>
					<comments>https://mashukabu.com/vba-copy-data-between-sheets/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Mon, 08 Jun 2026 15:50:42 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[For Each]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[シート転記]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[複数シート]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7847</guid>

					<description><![CDATA[VBAで複数シート間のデータを転記・集約する方法を3パターンのコードで解説。単純転記・For Eachによる全シート集約・条件付き転記まで、コピペで動く完成コードと仕組みの説明に加え、実行時エラー9・13・1004など、よくあるエラーの原因と対処法もあわせて紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「Sheet1に入力したデータを、Sheet2にも手で写している」。「月別シートの数字を、毎月集計シートにコピペでまとめている」。こんな作業を繰り返していませんか。</p>



<p class="wp-block-paragraph">シートが増えるほど、コピペの回数も増えていきます。1枚あたり数分でも、10枚あれば30分以上。しかも貼り間違いや行のズレといったミスもつきまといます。</p>



<p class="wp-block-paragraph">そんなシート間のデータ転記・集約は、VBAで<strong>一瞬で片づけられます</strong>。この記事では、コピペでそのまま動く完成コードを3パターン用意しました。単純な別シート転記から、For Eachによる全シート一括集約、条件付き転記までを順番に解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAでシート間のデータを転記・集約してできること</a></li><li><a href="#toc2" tabindex="0">VBEの起動とマクロを書く準備</a><ol><li><a href="#toc3" tabindex="0">VBEの開き方</a></li><li><a href="#toc4" tabindex="0">標準モジュールの挿入</a></li><li><a href="#toc5" tabindex="0">.xlsmで保存することに注意</a></li></ol></li><li><a href="#toc6" tabindex="0">パターン1：別シートにデータを転記する基本コード</a><ol><li><a href="#toc7" tabindex="0">コードの仕組みを理解する</a></li></ol></li><li><a href="#toc8" tabindex="0">パターン2：For Eachで全シートを集計シートに集約する</a><ol><li><a href="#toc9" tabindex="0">コードの仕組みを理解する</a></li></ol></li><li><a href="#toc10" tabindex="0">パターン3：条件に合うデータだけを別シートに転記する</a><ol><li><a href="#toc11" tabindex="0">コードの仕組みを理解する</a></li></ol></li><li><a href="#toc12" tabindex="0">VBAのシート転記でよくあるエラーと対処法</a><ol><li><a href="#toc13" tabindex="0">実行時エラー9：インデックスが有効範囲にありません</a></li><li><a href="#toc14" tabindex="0">実行時エラー13：型が一致しません</a></li><li><a href="#toc15" tabindex="0">実行時エラー1004：Rangeの指定が不正</a></li><li><a href="#toc16" tabindex="0">大量データは画面更新を止めると速い</a></li></ol></li><li><a href="#toc17" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAでシート間のデータを転記・集約してできること</span></h2>



<p class="wp-block-paragraph">まずは、VBAを使うとシート間のデータ処理がどう変わるのかを見ておきましょう。</p>



<p class="wp-block-paragraph">手作業では、シートを切り替えてコピーして、別のシートに貼り付ける、という操作の繰り返しです。シートが10枚あれば、この往復を10回行うことになります。</p>



<p class="wp-block-paragraph">VBAなら、この往復をコードに書いておくだけです。マクロを実行すれば、全シートの処理が数秒で終わるでしょう。</p>



<p class="wp-block-paragraph">具体的には、次のような処理を自動化できます。</p>



<ul class="wp-block-list"><li>特定のシートのデータを、別のシートに丸ごと転記する</li><li>複数のシートを1枚の集計シートにまとめて集約する</li><li>「ステータスが完了の行だけ」のように条件付きで転記する</li></ul>



<p class="wp-block-paragraph">手作業とVBAの違いを、簡単な表で比べてみます。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>手作業</th><th>VBA</th></tr></thead><tbody><tr><td>10シートの集約</td><td>約30分</td><td>数秒</td></tr><tr><td>貼り付けミス</td><td>起きやすい</td><td>起きない</td></tr><tr><td>翌月の再実行</td><td>また30分</td><td>ボタン1つ</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">一度コードを作ってしまえば、翌月以降は実行するだけです。この「作り置き」ができるのがVBAの強みですね。</p>



<h2 class="wp-block-heading"><span id="toc2">VBEの起動とマクロを書く準備</span></h2>



<p class="wp-block-paragraph">コードを書く前に、VBE（Visual Basic Editor）という編集画面を開きます。VBEは、VBAのコードを書くための専用エディタです。</p>



<h3 class="wp-block-heading"><span id="toc3">VBEの開き方</span></h3>



<p class="wp-block-paragraph">VBEを開く方法は2つあります。一番早いのは、Excelの画面で <code>Alt + F11</code> を押す方法です。これだけでVBEが立ち上がります。</p>



<p class="wp-block-paragraph">もう1つは、リボンの「開発」タブから開く方法。「開発」タブの「Visual Basic」ボタンをクリックします。</p>



<p class="wp-block-paragraph">「開発」タブが見当たらない場合は、表示設定が必要です。次の手順で追加してください。</p>



<ol class="wp-block-list"><li>「ファイル」→「オプション」を開く</li><li>「リボンのユーザー設定」を選ぶ</li><li>右側の一覧で「開発」にチェックを入れる</li><li>「OK」を押す</li></ol>



<p class="wp-block-paragraph">これで「開発」タブがリボンに表示されます。</p>



<h3 class="wp-block-heading"><span id="toc4">標準モジュールの挿入</span></h3>



<p class="wp-block-paragraph">VBEが開いたら、コードを書く場所を用意します。メニューの「挿入」→「標準モジュール」を選んでください。</p>



<p class="wp-block-paragraph">すると「Module1」という白い画面が開きます。ここにコードを書いていきます。VBEの画面構成をもっと詳しく知りたい方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBEの画面の見方を図解で解説</a>もあわせてご覧ください。</p>



<h3 class="wp-block-heading"><span id="toc5">.xlsmで保存することに注意</span></h3>



<p class="wp-block-paragraph">マクロを書いたブックは、必ず <code>.xlsm</code>（マクロ有効ブック）形式で保存します。普段の <code>.xlsx</code> 形式では、マクロが保存できません。</p>



<p class="wp-block-paragraph"><code>.xlsx</code> のまま保存しようとすると、「マクロなしのブックとして保存されます」という警告が出ます。このまま保存すると、せっかく書いたコードが消えてしまいます。</p>



<p class="wp-block-paragraph">保存時は「名前を付けて保存」で、ファイルの種類を「Excel マクロ有効ブック（.xlsm）」に変えてください。詳しい違いは<a href="https://mashukabu.com/excel-vba-filetype-explanation/">.xlsxと.xlsmの違い</a>で解説しています。</p>



<h2 class="wp-block-heading"><span id="toc6">パターン1：別シートにデータを転記する基本コード</span></h2>



<p class="wp-block-paragraph">最初は一番シンプルな、別シートへの転記です。「Sheet1のデータを、Sheet2の続きに追記する」という、よくあるパターンから見ていきましょう。</p>



<p class="wp-block-paragraph">ここでは、Sheet1のA1からC5までのデータを、Sheet2の末尾に追記する例を使います。</p>



<pre class="wp-block-code"><code>Sub データ転記_基本()

    '--- コピー元とコピー先のシートを指定 ---
    Dim wsFrom As Worksheet '転記元シート
    Dim wsTo As Worksheet   '転記先シート
    Set wsFrom = Worksheets(&quot;Sheet1&quot;)
    Set wsTo = Worksheets(&quot;Sheet2&quot;)

    '--- 転記先の最終行を取得して、次の行を書き込み位置にする ---
    Dim tRow As Long '転記先の書き込み行
    tRow = wsTo.Cells(Rows.Count, 1).End(xlUp).Row + 1

    '--- A1:C5の範囲を、転記先の末尾に値だけコピー ---
    wsTo.Range(&quot;A&quot; &amp; tRow &amp; &quot;:C&quot; &amp; tRow + 4).Value = wsFrom.Range(&quot;A1:C5&quot;).Value

    MsgBox &quot;転記が完了しました&quot;

End Sub</code></pre>



<p class="wp-block-paragraph">このコードを書いたら、<code>F5</code> キーかメニューの「実行」でマクロを動かします。Sheet2の続きにSheet1のデータが追記されれば成功です。</p>



<p class="wp-block-paragraph">自分の環境に合わせて変えるのは、次の3か所。</p>



<ul class="wp-block-list"><li><code>Worksheets("Sheet1")</code> … 転記元のシート名</li><li><code>Worksheets("Sheet2")</code> … 転記先のシート名</li><li><code>Range("A1:C5")</code> … コピーするデータの範囲</li></ul>



<h3 class="wp-block-heading"><span id="toc7">コードの仕組みを理解する</span></h3>



<p class="wp-block-paragraph">このコードのポイントは、別シートを操作するときに必ずシート名を付けている点です。<code>wsFrom.Range(...)</code> のように、どのシートのどの範囲かを明示しています。</p>



<p class="wp-block-paragraph">シート名を付けずに <code>Range("A1")</code> と書くと、今表示しているシートを指してしまいます。別シート操作では、シートの指定を省略しないようにしましょう。</p>



<p class="wp-block-paragraph">最終行は <code>Cells(Rows.Count, 1).End(xlUp).Row</code> で取得しています。これは「A列の一番下から上に詰めて、最初にデータがある行」を返す定番のテクニックです。最終行の取得方法をもっと詳しく知りたい方は、<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">VBA最終行の取得</a>もあわせてご覧ください。</p>



<p class="wp-block-paragraph">また、<code>コピー先.Value = コピー元.Value</code> のように範囲ごと値を代入しています。セルを1つずつコピーするより、この書き方のほうがずっと高速です。</p>



<h2 class="wp-block-heading"><span id="toc8">パターン2：For Eachで全シートを集計シートに集約する</span></h2>



<p class="wp-block-paragraph">次は、複数のシートを1枚にまとめる集約です。「月別シートを、集計シートに全部まとめたい」というニーズに応えます。</p>



<p class="wp-block-paragraph">ここでは、「集計」という名前のシートを用意しておきましょう。そして、それ以外の全シートのデータを、集計シートに順番に追記していきます。</p>



<pre class="wp-block-code"><code>Sub 全シート集約()

    '--- 集約先シートを指定 ---
    Dim wsSum As Worksheet '集約先シート
    Set wsSum = Worksheets(&quot;集計&quot;)

    '--- 全シートを1枚ずつ処理する ---
    Dim ws As Worksheet '処理中のシート
    For Each ws In Worksheets

        '--- 集計シート自身は処理しない ---
        If ws.Name &lt;&gt; &quot;集計&quot; Then

            '--- 各シートの最終行を取得 ---
            Dim lastRow As Long '各シートのデータ最終行
            lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row

            '--- 集約先の書き込み位置（最終行の次）を取得 ---
            Dim tRow As Long '集約先の書き込み行
            tRow = wsSum.Cells(Rows.Count, 1).End(xlUp).Row + 1

            '--- 2行目から最終行までを集約先に転記（1行目は見出しとして除外） ---
            ws.Range(&quot;A2:C&quot; &amp; lastRow).Copy wsSum.Range(&quot;A&quot; &amp; tRow)

        End If

    Next ws

    MsgBox &quot;全シートの集約が完了しました&quot;

End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると、集計シート以外の全シートのデータが、集計シートに1つにまとまります。シートが何枚あっても、コードはそのままで動きます。</p>



<p class="wp-block-paragraph">ちょっとむずかしく見えますが、やっていることはシンプルです。「1枚ずつシートを取り出して、集計シートの末尾に貼る」を全シートで繰り返しているだけにすぎません。</p>



<h3 class="wp-block-heading"><span id="toc9">コードの仕組みを理解する</span></h3>



<p class="wp-block-paragraph">ここで使っている <code>For Each ws In Worksheets</code> は、全シートを1つずつ取り出すループです。<code>ws</code> には、処理中のシートが順番に入っていきますね。For Eachの基本は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">VBA For Eachの使い方</a>で解説しています。</p>



<p class="wp-block-paragraph">処理の流れは次の3ステップです。</p>



<ol class="wp-block-list"><li><code>For Each</code> で全シートを1枚ずつ取り出す</li><li><code>If ws.Name <> "集計"</code> で集計シート自身を除外する</li><li>各シートの2行目以降を、集計シートの末尾にコピーする</li></ol>



<p class="wp-block-paragraph">集計シート自身を除外するガードは、必ず入れてください。これがないと、集計シート自身のデータも集計シートに貼り付けてしまいます。</p>



<p class="wp-block-paragraph">見出し行を除くため、コピー範囲の開始位置は <code>A2</code> です。各シートの1行目が見出しの場合、この指定でデータ部分だけをまとめられます。</p>



<p class="wp-block-paragraph">ここでは書式ごとコピーする <code>Copy</code> を使いました。値だけでよければ、パターン1のように <code>Value</code> での代入のほうが高速です。</p>



<h2 class="wp-block-heading"><span id="toc10">パターン3：条件に合うデータだけを別シートに転記する</span></h2>



<p class="wp-block-paragraph">最後は、条件付きの転記です。「ステータスが完了の行だけ、完了シートに移したい」のように、特定の値の行だけを抜き出します。</p>



<p class="wp-block-paragraph">ここでは、Sheet1のC列に入った「ステータス」を見て、「完了」の行だけを「完了」シートに転記する例を使いましょう。</p>



<pre class="wp-block-code"><code>Sub 条件付き転記()

    '--- 転記元と転記先のシートを指定 ---
    Dim wsFrom As Worksheet '転記元シート
    Dim wsTo As Worksheet   '転記先シート
    Set wsFrom = Worksheets(&quot;Sheet1&quot;)
    Set wsTo = Worksheets(&quot;完了&quot;)

    '--- 転記元の最終行を取得 ---
    Dim lastRow As Long '転記元のデータ最終行
    lastRow = wsFrom.Cells(Rows.Count, 1).End(xlUp).Row

    '--- 転記先の書き込み開始行を取得 ---
    Dim tRow As Long '転記先の書き込み行
    tRow = wsTo.Cells(Rows.Count, 1).End(xlUp).Row + 1

    '--- 2行目から最終行まで1行ずつ判定する ---
    Dim i As Long 'ループ用の行カウンター
    For i = 2 To lastRow

        '--- C列が「完了」の行だけ転記する ---
        If wsFrom.Cells(i, 3).Value = &quot;完了&quot; Then
            wsTo.Range(&quot;A&quot; &amp; tRow &amp; &quot;:C&quot; &amp; tRow).Value = _
                wsFrom.Range(&quot;A&quot; &amp; i &amp; &quot;:C&quot; &amp; i).Value
            tRow = tRow + 1 '転記したので書き込み行を1つ進める
        End If

    Next i

    MsgBox &quot;条件に合うデータの転記が完了しました&quot;

End Sub</code></pre>



<p class="wp-block-paragraph">実行すると、C列が「完了」の行だけが、完了シートに集まります。条件を変えたいときは、<code>If wsFrom.Cells(i, 3).Value = "完了"</code> の部分を書き換えます。</p>



<p class="wp-block-paragraph">たとえば「金額が10000以上の行だけ」にしたいなら、<code>wsFrom.Cells(i, 4).Value >= 10000</code> のように変えるだけです。</p>



<h3 class="wp-block-heading"><span id="toc11">コードの仕組みを理解する</span></h3>



<p class="wp-block-paragraph">このコードは、1行ずつ条件をチェックしていく作りです。<code>For i = 2 To lastRow</code> で、2行目から最終行までを順番に見ていきます。</p>



<p class="wp-block-paragraph">ポイントは、転記先の書き込み行 <code>tRow</code> を変数で管理していること。条件に合う行を転記するたびに、<code>tRow = tRow + 1</code> で1つ進めます。これで、転記先に隙間なく詰めて書き込めます。</p>



<p class="wp-block-paragraph"><code>Cells(i, 3)</code> の <code>3</code> はC列を意味する数字です。判定する列を変えたいときは、この数字を変えます。1ならA列、2ならB列という対応です。</p>



<p class="wp-block-paragraph">行と列を数字で指定する <code>Cells</code> の使い方をもっと詳しく知りたい方は、<a href="https://mashukabu.com/excel-vba-range-cells/">VBA RangeとCellsの違い</a>をご覧ください。ループ処理の中では、この <code>Cells</code> が便利です。</p>



<h2 class="wp-block-heading"><span id="toc12">VBAのシート転記でよくあるエラーと対処法</span></h2>



<p class="wp-block-paragraph">シート転記のコードでつまずきやすいエラーを、3つにしぼって紹介します。</p>



<h3 class="wp-block-heading"><span id="toc13">実行時エラー9：インデックスが有効範囲にありません</span></h3>



<p class="wp-block-paragraph">これは、指定したシート名が存在しないときに出るエラーです。原因のほとんどはシート名のタイプミスです。</p>



<p class="wp-block-paragraph">たとえば、コードでは「集計」と書いているのに、実際のシート名が「集計表」だと、このエラーになります。全角と半角の違いや余分なスペースも、よくある原因なので注意しましょう。</p>



<p class="wp-block-paragraph">シート名を確認するには、次のコードが便利です。</p>



<pre class="wp-block-code"><code>Sub シート名を確認()

    Dim ws As Worksheet '確認用のシート
    For Each ws In Worksheets
        Debug.Print ws.Name '各シート名をイミディエイトウィンドウに出力
    Next ws

End Sub</code></pre>



<p class="wp-block-paragraph">これを実行すると、全シートの正確な名前がイミディエイトウィンドウに表示されます。表示された名前を、コードにそのままコピーすれば確実でしょう。</p>



<h3 class="wp-block-heading"><span id="toc14">実行時エラー13：型が一致しません</span></h3>



<p class="wp-block-paragraph">これは、データの型が合っていないときに出ます。たとえば、文字が入ったセルを数値として比較しようとした場合などです。</p>



<p class="wp-block-paragraph">条件付き転記で「金額が10000以上」と判定するとき、その列に文字列が混ざっているとこのエラーが起きます。判定に使う列には、数値だけが入っているか確認してください。</p>



<h3 class="wp-block-heading"><span id="toc15">実行時エラー1004：Rangeの指定が不正</span></h3>



<p class="wp-block-paragraph">Range指定の書き方が間違っているときや、保護されたシートに書き込もうとしたときに出ます。</p>



<p class="wp-block-paragraph">転記先シートが保護されていないか、まず確認しましょう。シートの保護がかかっていると、VBAでも書き込めません。</p>



<p class="wp-block-paragraph">その他のエラーについては、<a href="https://mashukabu.com/vba-error-guide/">VBAマクロのエラー解決ガイド</a>で頻出エラー別にまとめています。</p>



<h3 class="wp-block-heading"><span id="toc16">大量データは画面更新を止めると速い</span></h3>



<p class="wp-block-paragraph">エラーではありませんが、データ量が多いと処理が遅く感じることもあるでしょう。そんなときは、画面更新を一時的に止めると体感速度が上がります。</p>



<pre class="wp-block-code"><code>Sub 高速化のひな形()

    Application.ScreenUpdating = False '画面更新を止める

    '--- ここに転記・集約の処理を書く ---

    Application.ScreenUpdating = True '画面更新を元に戻す

End Sub</code></pre>



<p class="wp-block-paragraph">処理の前後で画面更新をオフ・オンにするだけです。最後に必ず <code>True</code> へ戻すのを忘れないでください。</p>



<h2 class="wp-block-heading"><span id="toc17">まとめ</span></h2>



<p class="wp-block-paragraph">VBAで複数シート間のデータを転記・集約する方法を、<strong>3つのパターン</strong>で解説しました。最後にポイントを整理します。</p>



<ul class="wp-block-list"><li>パターン1：別シートへの単純転記は、シート名を明示して <code>Value</code> で範囲ごと代入する</li><li>パターン2：全シート集約は <code>For Each</code> でループし、集計シート自身を除外する</li><li>パターン3：条件付き転記は1行ずつ判定し、書き込み行を変数で管理する</li><li>別シート操作では、必ずシート名を付ける</li><li>マクロを書いたら <code>.xlsm</code> 形式で保存する</li></ul>



<p class="wp-block-paragraph">まずはパターン1から、自分の業務のシート名に書き換えて試してみてください。動くコードが1つできれば、あとは応用が効きます。</p>



<p class="wp-block-paragraph">ループ処理をもっと深く知りたい方は<a href="https://mashukabu.com/excel-vba-howto-use-for/">VBA For~Next文の使い方</a>を、VBAで業務全体を自動化したい方は<a href="https://mashukabu.com/excel-vba-automation-guide/">Excel VBAで仕事を自動化する方法</a>もあわせてご覧ください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-copy-data-between-sheets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
