(Excelマクロ・関数)2つ以上の列の内容を別の列に交互に表示する

下の画像のように、セルの内容を交互に表示する方法をマクロと関数の両方について解説します。
また、ページの後半では3列以上の場合についても解説していますので、併せて参照してください。




このページで解説する項目は次の通りです。上から順番に解説します。

①マクロの場合

複数の方法がありますが、For Nextを使うのが簡単で手っ取り早いでしょう。

コード例

Public Sub test()
'A列とB列の値を、C列に交互に表示する
'変数定義
Dim i As Long, k As Long, tmp As Long

tmp = 1 '1行目からスタート

For i = 1 To Range("A10000").End(xlUp).Row
    Cells(tmp, 3).Value = Cells(i, 1).Value
    tmp = tmp + 2 '1,3,5,7,...
Next i

tmp = 2 '2行目

For i = 1 To Range("B10000").End(xlUp).Row
    Cells(tmp, 3).Value = Cells(i, 2).Value
    tmp = tmp + 2 '2,4,6,8,...
Next i

End Sub

コードの解説

8~11行目で、A列の1行目から最終行までの値を、C列の1行目、3行目、5行目、…へ代入します。
また、15~18行目で、B列の1行目から最終行までの値を、C列の2行目、4行目、6行目、…へ代入します。
長整数型の変数tmpはC列における行の位置を決定しています。

マクロで交互に表示させることはさほど難しいことではありません。ただ、関数の場合はやや複雑な式を書く必要があります。

②関数の場合

貼り付ける関数

1行目と2行目は、イコールでそれぞれのセルの値を引っ張ってきます。

3行目は、次の関数を貼り付けます(関数の内容については、後述します)。
=IF(MOD(ROW(),2)=1,INDIRECT(ADDRESS(ROW()/2+1,1,1)),INDIRECT(ADDRESS(ROW(B1)/2+1,2,1)))

4行目以降は、3行目をオートフィルで引っ張って、セルの内容をコピーすればOKです。

関数の解説

ここでは上記の関数における各部分のはたらきについて解説します。IF関数・MOD関数・ROW関数・INDIRECT関数・ADDRESS関数それぞれのはたらきについては別のサイトの情報を参照してください。

解説

=IF(MOD(ROW(),2)=1,INDIRECT(ADDRESS(ROW()/2+1,1,1)),INDIRECT(ADDRESS(ROW()/2,2,1)))のうち、MOD(ROW(),2)=1は条件式、INDIRECT(ADDRESS(ROW()/2+1,1,1))は真の場合の表示内容、INDIRECT(ADDRESS(ROW()/2,2,1))は偽の場合の表示内容です。

MOD(ROW(),2)=1は、現在の行が奇数行か偶数行かを判定します。奇数行の場合は1が返るので「真」の場合の式が実行され、偶数行の場合は0が返るので「偽」の場合の式が実行されます。なお、ROW関数は引数を省略すると、関数が入力されているセルの行を対象とします。

奇数行の場合の実行内容は、INDIRECT(ADDRESS(ROW()/2+1,1,1))です。ADDRESS関数で参照したいセルの位置を求め、INDIRECT関数でそのセルの値を表示しています。ROW()/2+1は、3行目の場合は、3÷2+1より「2」となりますので、Cell(2,1)すなわち、A2の値が表示されます。
下の画像は、ADDRESS関数の部分のみ抜粋しています。

偶数行の場合の実行内容は、INDIRECT(ADDRESS(ROW()/2,2,1))です。基本的には奇数行の場合と同じですが、ADDRESS関数で引っ張ってくる列はB列(2)となっています。ROW()/2は、4行目の場合は、4÷2より「2」となりますので、Cell(2,2)すなわち、B2の値が表示されます。



③関数の場合(3列以上)

2列の場合までは上の関数で処理できます。
では、3列、4列…と増えていく場合はどうしたらいいでしょうか。
基本的な関数は変わりません。A列~C列それぞれ「あまりの数」が異なることに着目して、以下のように式を組み替えればOKです。
=IF(MOD(ROW(),3)=1,INDIRECT(ADDRESS(ROW()/3+1,1,1)),IF(MOD(ROW(),3)=2,
INDIRECT(ADDRESS(ROW()/3+1,2,1)),INDIRECT(ADDRESS(ROW()/3,3,1))))


注意点として、A列・B列については、ROW()/3+1とする必要があるのに対し、C列についてはROW()/3としなければなりません。これが例えば4列になった場合は、C列までROW()/4+1とし、D列のみROW()/4とします。
ただ、当然のことながら、列が増加するに応じて数式も長くなりますので、その点は注意してください。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください