web-dev-qa-db-ja.com

複数の行を1つの列に統合する方法

これが私の状況です。 38kの顧客アカウントのリストを取得し、新しいWebサイトにインポートできる特定のテンプレートに情報を並べ替える必要があります。しかし、データの提示方法はそれを困難にします...

1人の顧客用に保存されたすべてのアドレスは個別の行です。したがって、請求先住所または配送先住所が異なる場合は、2行になります。時々3行。これらの行を1行の下の列(アドレス1、アドレス2など)に移動する必要があります。したがって、CustomerAに3つの保存済みアドレスがある場合、それらの3行を取得して、1行の3列に移動する必要があります。それが理にかなっていることを願っています。

数式、ピボットテーブル、またはVBA(この分野のJon Snowと同じくらい知っています)が最善のルートであるかどうかはわかりません。ピボットテーブルを試しましたが、うまくいきません。 Index/Matchが最善の解決策かもしれないと思っていました。アドレス列ごとに数式を複製するだけで済みますが、それで作業は完了します。ただし、複数の行に対応する方法がわかりません。

以下は私が受け取ったデータの例です。 20行目は、行を移動するために必要なテンプレートです。列g_useridは顧客ごとに一意ですが、1人の顧客の住所が複数行ある場合、その値はスプレッドシートに複製されます。 customer_noと同じです。

http://www.filedropper.com/excelhelp

Or view this image

さらに詳しい情報が必要な場合はお知らせください。さらに説明させていただきます。

編集-投稿したスプレッドシートから、行2と3を取得し、住所情報を行1の新しい列に移動する必要があります。したがって、住所は2列、都市は1、州は1、郵便番号は1、国です。は1です。これにより、これら2行から合計12列のデータが作成されます。

1
Bschacht

助けてくれてありがとう。でも、別の方法で解決しました。

「-1」、「-2」、「-3」を「一意の」顧客IDに連結しただけです。次に、追加する必要のある新しい列ごとに、一意の1、2、3の値に対してVLOOKUPを実行しました。

この試練から得られた評判のために、この間ずっと仕事が価値があることを願っています。

0
Bschacht

私はこのようなタスクにVBAを使用するのが好きです。サンプルテーブルに表示されているように一意のユーザーIDがあるとすると、次のようになります。

Sub Addresses_To_Columns()

    Dim lastRow As Long
    Dim addressCount As Integer: addressCount = 0

    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    For i = lastRow To 3 Step -1
        If Cells(i, 1).Value = Cells(i - 1, 1).Value Then
            addressCount = addressCount + 1
            Range(Cells(i - 1, 10), Cells(i - 1, (addressCount * 6) + 10)) = Range(Cells(i, 4), Cells(i, (addressCount * 6) + 4)).Value
            Rows(i).Delete
        Else
            addressCount = 0
        End If
    Next i

End Sub

これはこれを変えるでしょう: enter image description here

これに: enter image description here

このコードは、特定の形式に合うようにカスタマイズする必要があります。また、これは概念実証として迅速に行われ、いくつかの一般的なベストプラクティスが欠落している可能性があることにも注意してください。このコードには重複行を削除するための削除コマンドが含まれているため、このコードを試す前にデータをバックアップしてください。

0
Porcupine911

私があなたの質問を正しく理解していれば、非常に簡単な解決策です。明らかに最初にスプレッドシートをバックアップしてください。

1)必要な数の新しい列を正しい場所に追加します。新しい列がNであるとしましょう。

2)顧客IDが列Aにあり、同じ顧客の新しい住所を持つ行は、その行の列Aに同じ番号があると想定しています。そして最後に、各顧客の最初の行に住所以外の最も完全な詳細があると仮定します。つまり、名前の電話などです(そうでない場合は、最初に顧客番号で、次に名前で並べ替えて、並べ替えを使用します)。

3)セルN2に、次の数式を入力します。

=if(and(a3=a2,a1<>a2),h3,"")

ここで、Hはアドレスのある列です。次の行に同じ顧客番号がある場合。 (a3 = a2)、そしてこの行が新しい顧客、つまり前の行(a1 <> a2)とは異なる顧客番号である場合、これは次の行からアドレスを取得し、その顧客のメイン行に配置します。そのアドレスの他のすべての部分について繰り返して、すべての情報が移動されるようにします。つまり、同じ式ですが、N2の代わりにO2で、h3の代わりにi3を参照します。

4)3番目のアドレスに対して同様の式を実行します。つまり、列XがX2タイプの3番目のアドレスの新しい列であると仮定します。

=if(and(a4=a2,a1<>a2),h4,"")

基本的に同じですが、代わりに2行下の情報のみを取得します。

5)これで、すべてのアドレスが各顧客の「メイン」行に表示されるはずです。次に、これらすべてのアドレスをコピーし、[形式を選択して貼り付け]-値を使用して同じ場所に貼り付ける必要があります。これにより、数式が削除され、入力したかのようにアドレスがデータとして保持されます。

6)次に、顧客名で並べ替えを使用して、名前が空白になっているすべての行を1か所にまとめます(これらは単なる追加のアドレスであるため)。次に、必要なすべてのデータが正しい行にあることを確認した後、これらの行をすべて削除します。出来上がり

0
noodle
  1. 結合されたコンテンツを配置するための空白のセルを選択し、数式バーに数式= CONCATENATE(TRANSPOSE(B2:B19))と入力し、数式の一部であるTRANSPOSE(B2:B19)を選択して、F9キーを押す必要があります。以下のスクリーンショットに示すように、数式が変更されていることがわかります。

enter image description here

  1. 数式バーの数式から中括弧を削除し、Enterキーを押します。
0
user764661