• ベストアンサー

1列のデータを3列に

名前1 住所1 TEL1 名前2 住所2 TEL2 名前3 住所3 TEL3 といった順番で1列に並んだデータがあります。これを 名前1 住所1 TEL1 名前2 住所2 TEL2 名前3 住所3 TEL3 というように3列に属性ごとに整理したいのですが、 やり方がうまく思いつきません。 データの量がかなりあるので手でコピペは厳しいです。 順番は規則正しく、空欄もありません。 簡単だと思って引き受けたのですが… どうか助けて下さい、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.3

上記がSheet1のA列として、Sheet2のA1に =OFFSET(Sheet1!$A$1,(ROW()-1)*3+COLUMN()-1,0) と入力 B1,C1にコピー後、行方向にコピーしてください。 データが終わった行で再度コピーして、 形式を選択して貼り付けで、値として貼り付ければ終了です。

tektiterecords
質問者

お礼

回答ありがとうございます。 回答の関数を調べるのに没頭してしまい、お礼が遅くなってしまいました。 とても参考になりました、ありがとうございます。No.4の方の回答と同じようで微妙に違うところにエクセルの奥深さを感じました。

その他の回答 (6)

noname#95859
noname#95859
回答No.7

色々な案が出ていますが、こんなのはどうでしょうか? A列をそのままB列、C列にコピーします。そしてA列、B列の先頭にセルを挿入して、その下の情報を下に押し下げて、下記のようにします。 このとき、D列を設けて欲しい行に1をつけます。 3つおきですから、オートフィルで簡単につけれます。 (6つのセル(縦に1xx1xx)を選んで、オートフィルを実行.....xはスペースを意味します) A---------B-------C--------D ------------------名前1   ---------名前1----住所1 名前1----住所1----TEL1-----1 住所1----TEL1-----名前2 TEL1-----名前2----住所2 名前2----住所2----TEL2-----1 住所2----TEL2 TEL2 (-は無視してください。スペースを入れるときちんと表示されなかったので、やむなく「-」を入れました) 以上を終えた後、D列でソートします。 後は不要な行を削除します。

tektiterecords
質問者

お礼

回答ありがとうございます。 私が最初にやろうとしていたのに最も近いやり方でした。 D列を使ってオートフィル&後でソートする っていう発想が私には足りませんでした。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

レスが多いのでやめようと思いましたが、「数千行」ということで、これも役に立つかなって思いました。 シートタブのところを右クリックすると、「コードの表示」というのがありますから、そこで、開いた画面に、以下を貼り付けてください。 一応、オプションが付けてあります。 Opt =1 は、1列右に行くという意味です。 0 なら、上書きしてしまいます。 myTopCell は、一番、上のセルが、どこか、ということです。以下では、A1 になっています。 Sub 配列編集()  Dim i As Long  Dim myTopCell As String  Dim Rng As Range  Dim myArray As Variant  Dim Opt As Integer  'オプション-隣の列 Opt 列目に書き出し上書きしない  Opt = 1 '0 なら上書き  '先頭のセル・アドレス  myTopCell = "A1"  '  Set Rng = Range(myTopCell, Range(myTopCell).End(xlDown))  myArray = Rng.Value  Application.ScreenUpdating = False  If Opt = 0 Then Rng.ClearContents  For i = LBound(myArray, 1) To UBound(myArray, 1)   Rng.Cells(1, 1).Offset((i - 1) \ 3, _   Opt + (i + 2) Mod 3).Value = myArray(i, 1)  Next i  Application.ScreenUpdating = True  Set Rng = Nothing End Sub

tektiterecords
質問者

お礼

回答ありがとうございます。 VB(VBA?)はさっぱりわからないので、これから勉強しようと思います。いろいろな方法があるんですね。 確認はできていませんが、ありがとうございました。

  • Quattro99
  • ベストアンサー率32% (1034/3212)
回答No.5

B列にデータがあるとして、A1に「1」、A2に「A1+100」、A3に「A1+10000」(足す数はデータの量に応じて適当に変えてください)と入力し、A1~A3を選択した状態で下にオートフィルすると、1、101、10001、2、102、10002...というふうになると思いますので、そうなったら、A列とB列を選択してソートすれば、名前1、名前2...、住所1、住所2...、TEL1、TEL2...と並ぶはずですので、あとはコピー&ペーストで出来るかと思います。

tektiterecords
質問者

お礼

回答ありがとうございます。 データが増えるとA2、A3をすごい数にしなければならないですが、工夫すればなんとかなるいい例ですね。 全く思いつきませんでした、ありがとうございます。

  • hirumin
  • ベストアンサー率29% (705/2376)
回答No.4

「Sheet1」のA列にデータがあるとした場合、別のシートに [A1]セル =INDIRECT("Sheet1!A"&ROW()*3-3+COLUMN()) という式を入れて下さい。 これを[B1][C1]にもコピーします。 これで1列目に情報が表示されるはずです。 後は必要な分だけ行(下)方向に式をコピーするだけです。 試してみて下さい。

tektiterecords
質問者

お礼

回答ありがとうございます。 回答の関数を調べるのに没頭してしまいお礼が遅くなってしまいました。 とても参考になりました、ありがとうございます。No.3の方の回答と似ているようで微妙に違うところにエクセルの奥深さを感じました。

回答No.2

めんどうだったらなかった事にしてください。   1    2    3   4 A 名前1 B 住所1 C TEL1 だとしたときに 名前1の横のセルA2に=B1、A3に=C1を入力し、   1    2    3   4 A 名前1 住所1 TEL1 B 住所1 C TEL1 ↑状態でA2~C4をコピーして、D2以降のセルにペースト。このままではB.C行が消せないので、A2~?4(最後)までのセルをコピーして、同じ位置に形式を選択して“値”をペースト。あとはB,Cの行を消していく。消していくのが面倒ですかね??

tektiterecords
質問者

お礼

早速の回答ありがとうございます。 私も同様に考え、無駄になった行を消してるんですが なんせデータが数千件あるもんで… なんとかがんばってみます。

  • Turbo415
  • ベストアンサー率26% (2631/9774)
回答No.1

もっと、いいやり方があるかもしれませんが。 まずデータがB列に999行あるとします。そしてA列に1から連番を振ります。(フィル機能を使えば簡単です。) その状態で、D1セルに1を入れD2に=D1+3と入れそれを縦にコピーします。また、E1セルに2を入れE2に=E1+3としてそれを縦にコピーします。さらに、F1セルに3を入れF2に=F1+3としてそれを縦にコピーします。 そのあと、G1に=vlookup(D1,$A$1:$B$999,2,false)と入れそれをG2セルから縦にコピーします。その後、H1にvlookup(E1,$A$1:$B$999,2,false)としてそれをH2セルから縦にコピーします。さらに、その後、I1にvlookup(F1,$A$1:$B$999,2,false)としてそれをI2セルから縦にコピーします。 すると、GからIの列にご希望のように並びますから、G1からI333までをコピーして、別のシートなどの任意の所に「形式を指定して貼り付け」で「値」を指定して貼り付ければOKです。単なる貼り付けだと、元データを消すとエラーになりますが、「値」で貼り付ければ元のデータは消してもエラーになりません。 参考までに。

tektiterecords
質問者

お礼

回答ありがとうございます。vlookupは思いつきませんでした。 さっそく試してみたいと思います、ありがとうございました。

関連するQ&A