• ベストアンサー

【エクセル】縦に続いた表を横にして整理したい

表題の通りですが、エクセル2003で、以下のようなことがしたいです。 [元データ]   A     B       1  氏名   田中 2  住所   東京 3  電話番号 *** 4  登録日  *** 5 6  氏名   鈴木 7  住所   埼玉 8  電話番号 *** 9  登録日  *** 10 11  氏名   佐藤 12  住所   埼玉 13  電話番号 *** 14  15 氏名   工藤 のように一人分のデータが、空白セル1マス空けて、延々と続いた様な表があります(3万行くらい)。 これを下記のように変更したいのです [整理後]   A    B    C    D    E 1 氏名   住所   電話番号  登録日 1 田中   東京   ***   *** 2 鈴木   埼玉   ***   *** 3 佐藤   埼玉   ***   (空白) 4 工藤    5 のような感じです。 3つ目の佐藤氏のデータのように元データに登録日という項目が無い場合があります。 それ以外の項目に関して順番や有無の違いはありません、1データの最終行にある登録日という 項目だけ有ったり無かったりします。 項目だけは縦のものを横に貼り付け、で出来たのですが、それが意外のデータを効率よく移すには どうしたら良いでしょうか。 関数、マクロを教えていただけたらありがたいです。こうしたら良いというアイデアだけでも助かります。どうか宜しくお願いします。 (説明不足のところがありましたらすいません…補足致します)

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

  • ベストアンサー
  • noah7150
  • ベストアンサー率46% (116/251)
回答No.2

VBAのサンプル。 理解できればですが・・・ Sub Macro1() Dim iWS As Worksheet Dim oWS As Worksheet Dim iRow As Long Dim oRow As Long Dim iPos As Long iRow = 1 oRow = 2 iPos = 0 Set iWS = ActiveWorkbook.Sheets(1) Set oWS = ActiveWorkbook.Sheets(2) Do While iWS.Cells(iRow + iPos, 1) <> "" If iWS.Cells(iRow + iPos, 1) <> "氏名" Then MsgBox "カラム異常 行=[" & iRow + iPos & "] 内容=[" & iWS.Cells(iRow + iPos, 1) & "]" End If While iWS.Cells(iRow + iPos, 1) <> "" Select Case iWS.Cells(iRow + iPos, 1) Case "氏名" oWS.Cells(oRow, 1) = iWS.Cells(iRow + iPos, 2) Case "住所" oWS.Cells(oRow, 2) = iWS.Cells(iRow + iPos, 2) Case "電話番号" oWS.Cells(oRow, 3) = iWS.Cells(iRow + iPos, 2) Case "登録日" oWS.Cells(oRow, 4) = iWS.Cells(iRow + iPos, 2) Case Else MsgBox "カラム異常 行=[" & iRow + iPos & "] 内容=[" & iWS.Cells(iRow + iPos, 1) & "]" End Select iPos = iPos + 1 Wend iRow = iRow + iPos + 1 iPos = 0 oRow = oRow + 1 Loop Set iWS = Nothing Set oWS = Nothing End Sub

aisenyou
質問者

補足

ありがとうございます。VBAはまだ初心者なのですが。 教えていただいたプログラムで出来ました。 ただ説明不足で申し訳ありません。各データを区切る空白の行が 1行だけではなく、2行の場合も存在するのです。3行はありま せんでした。 この場合どうすれば良いでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#204879
noname#204879
回答No.5

Sheet1     A     B    C 1  氏名   田中     1 2  住所   東京 3  電話番号 01-23-4567 4  登録日  2008/01/23 5 6 7  氏名   鈴木     7 8  住所   埼玉 9  電話番号 02-34-5678 10 登録日  2007/08/09 11 12 氏名   佐藤    12 13 住所   埼玉 14 電話番号 03-45-6789 15 16 氏名   工藤    16 1.Sheet1 の空き列(此処ではC列とする)の1行目に次式を入力し   て、此れを下方にズズーッとドラッグ&ペースト   =IF(A1="氏名",ROW(),"") Sheet2   A   B    C      D 1 氏名 住所 電話番号  登録日 2 田中 東京 01-23-4567 2008/01/23 3 鈴木 埼玉 02-34-5678 2007/08/09 4 佐藤 埼玉 03-45-6789 5 工藤 6 以下は Sheet2 における操作です。 2.セル A2 に次の[条件付き書式]を設定     数式が    =ISERROR(A2)     フォント色  白 3.セル A2 に次式を入力して、此れを右方にズズーッとドラッグ&ペ   ースト   =IF(OFFSET(INDIRECT("Sheet1!"&ADDRESS(SMALL(Sheet1!$C:$C,ROW(A1)),1)),COLUMN(A1)-1,1)=0,"",OFFSET(INDIRECT("Sheet1!"&ADDRESS(SMALL(Sheet1!$C:$C,ROW(A1)),1)),COLUMN(A1)-1,1)) 4.セル D2 を yyyy/mm/dd に書式設定 5.範囲 A2:D2 を下方にズズーッとドラッグ&ペースト

aisenyou
質問者

お礼

丁寧に教えて頂き、ありがとうございました。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

1人あて4行(空白行も入れて5行)ばかりなら、作業列を使わず行の計算だけで出来ます。 氏名は =INDEX($A$1:$B$100,(ROW()-1)*5+1,2) しかし補足で、どうもソウでないらしい(大事なことだから、質問に初めからしっかり書いておくこと)からこの方法は使えない。 ーーーーーー 例データ(空白行数イレギュラーの場合) 第1行目は空白行にする。(データを入れない) A2:B100の一部 氏名 田中 1 住所 東京 電話番号 *** 登録日 *** ーーー --- <===空白行の代わりの表示 ーーー --- 氏名 鈴木 2 住所 埼玉 電話番号 &&& 登録日 *** ーーー --- ーーー --- ーーー --- 氏名 木村 3 住所 神奈川 電話番号 ーーー C列は =IF(A2="氏名",MAX($C$1:C1)+1,"") 下方向に式を複写 結果 氏名に連番を振っている。 F2に =INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0),2) G2に =INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0)+1,2) H2に =INDEX($A$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0)+2,2) 下方向に式を複写 結果 F2:H4 田中 東京 *** 鈴木 埼玉 &&& 木村 神奈川 ーーー 上記は抜き出し問題で私が回答している手法の「imogasi方式」(Googleで照会のこと)と同じ手法で出来た。 ーー もしA列の氏名が当てにならないなら、上記C列n式の変わりに =IF(AND(A1="",A2<>""),MAX($D$1:D1)+1,"") なら使えるだろう。 塊で最終空白行の次行を氏名行とするという意味である。

aisenyou
質問者

お礼

丁寧に教えてもらい、ありがとうございました。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.1です。 条件は正確に書いてください。 A3に入れる式を↓に換えればいけるはずです。 =IF(D3="","",IF(A2="",MAX(A$1:A2)+1,A2))

aisenyou
質問者

お礼

返事大変遅くなりました。。 出来ました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

各データが誰のデータなのかを管理する情報があれば出来ると思います。 私でしたら、次の様にします。 先頭に作業列を2列追加します(A,B列を追加)。 A1とA2に 1 A3に =IF(D3="","",IF(D2="",A1+1,A2)) と入れて下までコピー。 これでA列が個人No.になり、誰のデータなのか特定できます。 次にB列を作業列として使います。 B1に =A1&C1 と入れて下までコピー これで、「1住所」の様に個人No.データの項目名が1つになった情報ができました。これをVlookupで整理します。 F~J列を使うとして説明します。 G1~J1に「氏名」「住所」「電話番号」「登録日」と、データの項目名と同じ物を入力します。 そしてF2に 1 G2に =IF(ISNA(VLOOKUP($F2&G$1,$B:$D,3,FALSE)),"",VLOOKUP($F2&G$1,$B:$D,3,FALSE))  と、入れてJ2までコピー 最後に、F2:J2を下までコピー。 コレでいかがでしょう。

aisenyou
質問者

補足

ありがとうございます。出来ました。 ただ説明不足で申し訳ないです。各データの区切りの空白行が 2行になっている場合もありました。。 3行はありません1行か2行になります。。すいませんがこの場合も 教えていただけないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで質問です。

    エクセルで質問です。 sheet1に     A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     C      佐藤    東京 4  2     B      鈴木    埼玉 5  3     A      加藤    千葉 6  4     B      本多    東京 このようなデータがたくさんあります。(左の数字は行番号、上のアルファベットは列番号) これを別シートにグループ順に   A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     A      加藤    千葉 4  2     B      鈴木    埼玉 5  3     B      本多    東京 6  4     C      佐藤    東京 と表示させる方法はありますか。 エクセルに詳しくないのですが どなたか助けていただければと思います。

  • エクセルの表の集計について

    エクセルの『集計』や『ピボットテーブル』を使わずに、関数でやる方法があれば教えてください。 1 名前  住所  りんご  みかん 2 山田 東京   1    3 3 鈴木 神奈川  3   8 4 佐藤 埼玉   4    10 5 山田 東京   5    5 6 佐藤 埼玉   6    5 とエクセルに表があるとします。 (7行目以降はデータが追加されるとします。) 別シートに下記のように名前ごとにりんご・みかんの数の合計を表に反映するようにしたいのです。 1 名前 住所  りんご  みかん 2 山田 東京   6   8 3 鈴木 神奈川  3  8 4 佐藤 埼玉   10  15 説明不足のところがありましたら補足いたしますので、お願いいたします。

  • エクセルで2つのリストを統合するには?

    エクセルの別々のシートにある2つのリストを統合したいのですが、過去の質問などを見てもうまくいきません。具体的には 【表1】 番号 氏名 住所 A 佐藤 東京 B 高橋 神奈川 C 渡辺 埼玉 D 田中 千葉 E 小林 山梨 【表2】 番号 氏名 年齢 B 高橋 22 D 田中 45 という2つの表で、これを 番号 氏名 住所 年齢 A 佐藤 東京 B 高橋 神奈川 22 C 渡辺 埼玉 D 田中 千葉 45 E 小林 山梨 のようにまとめたいのです。 「データの統合」を使ってみましたがうまくいきませんでした。よろしくお願いします。

  • エクセルのデータ整理で。

    2日続きで教えてもらいに来ました^^;よろしくお願いします。 エクセルのデータの整理をしております。 Sheet1,Sheet2のデータをSheet3へ反映したいと考えております。 Sheet1には、以下のようなデータがあります。   A   B   C  D   住所 氏名 年齢 家族数 1 東京 鈴木 30 3 2 埼玉 田中 33 5 3 千葉 高橋 40 2 4 東京 伊東 31 4 Sheet2には、以下のようなデータがあります。   A   B   C  D   住所 氏名 年齢 家族数 1 埼玉 林  22 1 2 千葉 森  29 2 3 東京 岡  25 3 4 東京 南  27 1 これらのうち、Aに「東京」とあれば、Sheet3に1行目から順に抽出したい。以下のようにしたいのです。   A   B   C  D 1 東京 鈴木 30 3 2 東京 伊東 31 4 3 東京 岡  25 3 4 東京 南  27 1 アドバイスお願いします。

  • エクセルSheet1,2を使っての行ごとでの値の返し方

    Sheet1にデータを行ごとに入れていきます。 Sheet2にSheet1のデータを行ごとに返します。 例えば下記のようなデータがSheet1にあります。 行/列  A     B     C    D     登録番号 申込み日  氏名   住所  1  h1234  15年2月  山田太郎 東京都品川区   2  k0022  14年8月  田中次郎 千葉県浦安市   3  m3651  15年1月  鈴木三郎 埼玉県川口市   4  g7890  13年6月  佐藤四郎 神奈川県横浜市 Sheet2のA1にSheet1の行3のデータを返すため3と入れます。登録番号を入れたいので、次のような関数を入れてみましたがうまく出来ませんでした。 =IF(ISNUMBER(A1),INDIRECT(Sheet1!A3&A1),"") 何がいけないのかわかりませんでした。 それに、出来れば登録番号の数字(全て4桁です)返したいのですが、さらに、MIDを使えばよいのですか?説明が十分かどうかわかりませんがアドバイス宜しくお願い致します!

  • SQL文で複数列の更新をしたい。

    SQL初心者です。 全レコードを対象にNULLが入ってるフィールドを半角スペースに更新したいのですが、SQL文で記述するにはどうしたらいいのでしょうか? 例えば 氏名 住所  電話番号    誕生日   血液型 田中 渋谷  03-1234-1111  NULL    A 佐藤 新宿  NULL      19450412  NULL 鈴木 池袋  03-1234-2222  19700522  B            ↓ 氏名 住所  電話番号    誕生日   血液型 田中 渋谷  03-1234-1111        A 佐藤 新宿          19450412   鈴木 池袋  03-1234-2222  19700522  B こんな感じです。 知恵をお貸しください。よろしくお願いいたします。

  • エクセルで質問です

    エクセルで質問です。 sheet1に     A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     C      佐藤    東京 4  2     B      鈴木    埼玉 5  3     A      加藤    千葉 6  4     B      本多    東京 このようなデータがたくさんあります。(左の数字は行番号、上のアルファベットは列番号) これを別シートにグループ順に   A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     A      加藤    千葉 4  2     B      鈴木    埼玉 5  3     B      本多    東京 6  4     C      佐藤    東京 と表示させる方法はありますか。 sheet1には都度入力されるので、並べ替えなどではなく vlooupとか関数の活用で何とかならないものでしょうか。 エクセルに詳しくないのですが どなたか助けていただければと思います。

  • 2010エクセルでマクロを使い別シ-トの参照

    オフィス2010エクセルでマクロを使い別シ-トの参照をしたいのですが方法がわかりません。 シ-ト1のデ-タをシ-ト2で行ごとに表示させたいです シ-ト1 1 佐藤 電話番号 住所 2 鈴木 電話番号 住所 3 斉藤 電話番号 住所 シ-ト2   1 佐藤 電話番号 住所  行ボタン  シ-ト2では行ボタンで次のボタンで2の鈴木さんが表示するようにしたいです マクロを使わなくても可能であれば助かります よろしくお願いします

  • EXCELマクロVBAについて

    Excel2007、XPを使用しています。 AからE列に下記のような情報が入力されています。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/10 11111 / 田中 / 東京都 / 00000000000 / 2012/08/09 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/11 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 A列のIDでくくったとして、 E列の注文日が最大のみの行を表示させたいです。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 このようなことはマクロで可能なのでしょうか? 恐れ入りますがご教授お願い致します。

  • L列で条件に該当する場合の、A列のデータ種類数

    A列には「文字列」が入力されています。 L列には計算式が入力され、計算結果が数字で表示されています。 L列の計算結果が「0より大きい」「0より小さい」という条件に該当する、A列のデータの種類数をカウントする関数を教えてください。データ行数は「1行目から100行目」でお願いします。 A列 L列 田中 100 鈴木 -50 田中 70 佐藤 80 佐藤 -70 工藤 -15 L列で「0より大きい」 → A列のデータの種類数は田中、佐藤なので 「2」という計算結果を導き出したい。 L列で「0より小さい」 → A列のデータの種類数は、鈴木、佐藤、工藤なので、「3」という計算結果を導き出したい。 Excel2013を使っていますが、2007にも対応できる計算式だと、なおありがたいです。 お手数をおかけいたしますが、よろしくお願いします。 

このQ&Aのポイント
  • 紙詰まりの表示が出ているにも関わらず実際には紙詰まりがない場合、以下の対処方法を試してみてください。
  • まずは背面のカバーを開け、内部に紙詰まりがないか確認してください。
  • さらに、プリンターの他の箇所も確認し、紙詰まりがないことを確認してください。もし紙詰まりがないにも関わらず表示が消えない場合は、プリンターの設定をリセットしてみてください。
回答を見る

専門家に質問してみよう