it-swarm-ja.com

2つのExcel列を1つにマージする方法(他の方法)

A列とB列に示されているリストがあり、Dに示されているようにマージしたいと思います。

Enter image description here

どうやってやるの?

ここでは、アルファベット(a、b、c、d、e、f、g、h)がプレースホルダーとして使用されています。 column Dで本当に必要なのは、A1、B1、A2、B2、A3、B3、A4、B4です。

6
claws

保守がそれほど簡単ではない数式ベースのソリューションは、Dで次の数式を使用することです。

_=INDEX($A$1:$B$5,QUOTIENT(ROW()+1,2),IF(MOD(ROW(),2)=0,2,1))
_

フォーマットを追加して、部分的に説明しましょう。

_=INDEX(
   $A$1:$B$5,
   QUOTIENT(ROW()+1,2),
   IF(MOD(ROW(),2)=0,2,1)
   )
_

したがって、INDEXは座標によって範囲内のセルを返します。引数は次のとおりです。

  1. _$A$1:$B$5_-範囲。2つの列が必要です。
  2. QUOTIENT(ROW()+1,2)-現在の行番号を2で整数除算します。これにより、(1)の範囲の行番号が得られます。
  3. IF(MOD(ROW(),2)=0,2,1)-(2)からの整数除算の余り。これにより、(1)の範囲の列番号が得られます。

このソリューションは実際には柔軟ではなく、以下をサポートするにはわずかな改善が必要です。

  • 2列以上
  • 隣接していない列
  • 特定の範囲になります(たとえば、D5から開始します)
8
default locale

デフォルトロケールの優れた答え に基づいて(そしてAHCの要求に応じて)、いくつかの変数を定義し、式を調整することで柔軟性を追加できます。

デフォルトのロケールの結果から始めましょう。

enter image description here

残念ながら、ここで使用されている数式は、列が3つ以上ある場合、または出力が範囲と同じ行で開始されない場合に壊れます。

いくつかの変数を定義して、出力を開始する行と範囲内の列数を指定しましょう。

enter image description here

上に表示されている灰色のボックスは、変数を示しています。セルG1、G2、G3の場合、各セルを順番にクリックして範囲に名前を付け、黄色で強調表示されたボックスをクリックします。関連する範囲名を入力します:StartRowNumOfCols、およびRangeIncHeaders

これで、元の数式を変数を使用する新しい数式に置き換えることができます。

=INDEX( $A$1:$B$4, ROUNDUP((ROW()-StartRow+1)/NumOfCols,0)+IF(RangeIncHeaders="Yes",1,0), MOD(ROW()-StartRow,NumOfCols)+1 )

enter image description here

次に、3番目の列を挿入しましょう。式で参照されている範囲を$A$1:$C$4に変更して、3つの列があることを確認します。 NumOfColsも3に設定します。

例として、出力を下に移動して、行1ではなく行5から開始するようにします。StartRowを5に設定します。

enter image description here

最後に、行ヘッダーのオンとオフを切り替えられるようにしたい場合があります。その場合は、RangeIncHeadersYesに設定してください。

enter image description here

3
Andi Mohr

マクロを使用してもかまわない場合は、ここにアイデアがあります。

Sub MergeColumnsAlternating()
  Dim total, i, rowNum as Integer
  total = 4 '' whatever number of rows you need to merge.
  i = 1
  For rowNum = 1 to total
    Range("D" & i) = Range("A" & rowNum)
    i = i + 1
    Range("D" & i) = Range("B" & rowNum)
    i = i + 1
  Next rowNum
End Sub

私はVBAに非常に錆びており(ほとんど覚えていません)、長年オフィスを使用していませんが、とにかく貢献したいと思っていました。

3
Martín Canaval

ColumnAの各変更の小計、フィルターをかけ、小計行を選択して(たとえば、Countを探して)これらのセルを空白にし、フィルターを削除し、ColumnBを1行下に移動してから、2つの列を連結します。

さらに詳細に:

すべての代替行が空白の場合、インターリーブの要件を満たすのは簡単です。小計にはすでに行を追加する機能があり、これを実現するために使用できます。質問では、各セルが異なるように見えるため、各変更のカウントにより、各エントリの小計が作成されます。 [データに隣接する繰り返しがある場合は、「ヘルパー」列を使用できます(ヘルパー列は一時的にのみ必要なので、ここではColumnDと言います)。キーを言う1からD1そして、塗りつぶしハンドルを必要なだけ下にドラッグします–問題の行4 – Ctrl 落ち込んでいる。]

各変更の小計(可能な場合はColumnA、それ以外の場合はColumnD)は、次のように小計を挿入します。

SU539258 first example

フィルタリングを使用すると、小計を含む行を選択して(たとえば、テキストフィルタ、含む、キー「カウント」、OK)、空白にすることができます(は必須ですが、その内容は必須ではありません)。不要な場合は、列ラベルを同時に削除できます。

真ん中の小さな画像は、交互の空白行が達成されたことを示しています。その後、小計が削除され、Shiftキーを押しながら列Bの上部にセルが挿入されます。

元のデータはそのままで(間隔は空けられていますが)、右側の画像のような式(必要に応じてコピー)などを使用して、ColumnDエントリを連結によってColumnAおよびBから「移動」できます。元のデータがテキストまたは値であった場合、ColumnDの数式をコピー/貼り付けの特殊/値に置き換えることができます。

結果を達成するためのより良い方法があるかもしれませんが、それは列AとBに何があるかを知らずに判断するのは困難です(たとえば、式[リレーショナル参照の有無にかかわらず?]、テキストまたは値?)。

SU539258 second example

2
pnuts

A1 = a
B1 = b

私が理解しているのは、D1では、A1、B1である「ab」としての出力が必要であるということです。そして、=A1&B1のような式が必要です。

1
Sumeet Pujari

Excelに以下のような列があると仮定すると、

A1 B1
------- --------
1 a
2 b
3 c

次に、C1列の式=INDEX($A:$B,CEILING(ROWS(C$1:C1)/2,1),2-MOD(ROWS(C$1:C1),2))を適用します。 c1で必要な結果が得られます。

1
Srikanth Reddy