エクセルで作成された、項目(A1)+セル内容(A2)が不規則なデータを、指定したセル(もしくはフォーム)に自動で振り分ける方法やソフトはないでしょうか?

例:
一行目 名前 住所 年齢 趣味
二行目 山田 東京 20 映画
三行目 住所 趣味 
四行目 千葉 釣り
五行目 年齢 
六行目 30

変換後:

一行目 名前 住所 年齢 趣味
二行目 山田 東京 20 映画
三行目  
四行目     千葉    釣り
五行目  
六行目         30


  
上記の様な、きちんとしたレイアウトに成形したいと考えています。(空行はあっても無くても構いません)

回答の条件
  • 1人2回まで
  • 登録:2006/08/31 10:27:03
  • 終了:2006/08/31 13:40:38

ベストアンサー

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/08/31 10:52:29

ポイント23pt

前回と同様マクロです。

1行目と2行目は 基本とし 3行目から 振り分けするようにしました。


Sub Macro1()

'

' Macro1 Macro

'

' Keyboard Shortcut: Ctrl+q

'

For a = 3 To 10000 Step 2

b1 = Range("A" & a)

b2 = Range("B" & a)

b3 = Range("C" & a)

b4 = Range("D" & a)

Range("A" & a) = ""

Range("B" & a) = ""

Range("C" & a) = ""

Range("D" & a) = ""

c1 = Range("A" & a + 1)

c2 = Range("B" & a + 1)

c3 = Range("C" & a + 1)

c4 = Range("D" & a + 1)

Range("A" & a + 1) = ""

Range("B" & a + 1) = ""

Range("C" & a + 1) = ""

Range("D" & a + 1) = ""

Select Case Range("A1")

Case b1

Range("A" & a + 1) = c1

Case b2

Range("A" & a + 1) = c2

Case b3

Range("A" & a + 1) = c3

Case b4

Range("A" & a + 1) = c4

End Select

Select Case Range("B1")

Case b1

Range("B" & a + 1) = c1

Case b2

Range("B" & a + 1) = c2

Case b3

Range("B" & a + 1) = c3

Case b4

Range("B" & a + 1) = c4

End Select

Select Case Range("C1")

Case b1

Range("C" & a + 1) = c1

Case b2

Range("C" & a + 1) = c2

Case b3

Range("C" & a + 1) = c3

Case b4

Range("C" & a + 1) = c4

End Select

Select Case Range("D1")

Case b1

Range("D" & a + 1) = c1

Case b2

Range("D" & a + 1) = c2

Case b3

Range("D" & a + 1) = c3

Case b4

Range("D" & a + 1) = c4

End Select

Next a



End Sub

id:WATANABE

項目を増やしたい場合は、b4 = Range("D" & a)の次にb5 = Range("E" & a)の様に順次対応していけばよいのでしょうか?

2006/08/31 12:14:25

その他の回答(4件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/08/31 10:52:29ここでベストアンサー

ポイント23pt

前回と同様マクロです。

1行目と2行目は 基本とし 3行目から 振り分けするようにしました。


Sub Macro1()

'

' Macro1 Macro

'

' Keyboard Shortcut: Ctrl+q

'

For a = 3 To 10000 Step 2

b1 = Range("A" & a)

b2 = Range("B" & a)

b3 = Range("C" & a)

b4 = Range("D" & a)

Range("A" & a) = ""

Range("B" & a) = ""

Range("C" & a) = ""

Range("D" & a) = ""

c1 = Range("A" & a + 1)

c2 = Range("B" & a + 1)

c3 = Range("C" & a + 1)

c4 = Range("D" & a + 1)

Range("A" & a + 1) = ""

Range("B" & a + 1) = ""

Range("C" & a + 1) = ""

Range("D" & a + 1) = ""

Select Case Range("A1")

Case b1

Range("A" & a + 1) = c1

Case b2

Range("A" & a + 1) = c2

Case b3

Range("A" & a + 1) = c3

Case b4

Range("A" & a + 1) = c4

End Select

Select Case Range("B1")

Case b1

Range("B" & a + 1) = c1

Case b2

Range("B" & a + 1) = c2

Case b3

Range("B" & a + 1) = c3

Case b4

Range("B" & a + 1) = c4

End Select

Select Case Range("C1")

Case b1

Range("C" & a + 1) = c1

Case b2

Range("C" & a + 1) = c2

Case b3

Range("C" & a + 1) = c3

Case b4

Range("C" & a + 1) = c4

End Select

Select Case Range("D1")

Case b1

Range("D" & a + 1) = c1

Case b2

Range("D" & a + 1) = c2

Case b3

Range("D" & a + 1) = c3

Case b4

Range("D" & a + 1) = c4

End Select

Next a



End Sub

id:WATANABE

項目を増やしたい場合は、b4 = Range("D" & a)の次にb5 = Range("E" & a)の様に順次対応していけばよいのでしょうか?

2006/08/31 12:14:25
id:rikuzai No.2

りくっち回答回数1366ベストアンサー獲得回数1412006/08/31 11:18:14

ポイント23pt

同シートのE~Hに変換後のデータを表示するとして、

E1:H2は元データをそのままコピーし、

E3=IF(ISERROR(MATCH(E$1,$A2:$D2,0)),"",INDEX($A$1:$D$6,ROW(),MATCH(E$1,$A2:$D2,0)))

と記入してエンター、コピー。

E3:H6を選択して貼付け。

以上でどうでしょうか。

id:WATANABE

関数の内容自体は把握できませんでしたが、希望通りの事ができました。

2006/08/31 12:35:35
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012006/08/31 10:52:37

ポイント22pt

手順1)A1~D1をコピーしてE1~H1に貼り付け

  一行目 名前 住所 年齢 趣味 名前 住所 年齢 趣味


手順2)E2に=HLOOKUP(E$1,$A1:$D2,2,FALSE)と書き、下記の結果を確認

  一行目 名前 住所 年齢 趣味 名前 住所 年齢 趣味

  二行目 山田 東京 20 映画 山田

手順3)E2をF2,G2,H2にコピーして以下になるかを確認

  一行目 名前 住所 年齢 趣味 名前 住所 年齢 趣味

  二行目 山田 東京 20 映画 山田 東京 20 映画

手順4)E2~H2をコピーしてE4~H4に貼り付けて確認

  一行目 名前 住所 年齢 趣味 名前 住所 年齢 趣味

  二行目 山田 東京 20 映画 山田 東京 20 映画

  三行目 住所 趣味 

  四行目 千葉 釣り       #N/A 千葉 #N/A 釣り

手順5)E6~H6以下へも同様に貼り付けて確認

手順6)E列~H列を選択してコピーし、新しいシートに、編集→形式を選択して貼り付け→値で貼り付ける

手順7)編集→置換にて#N/Aを消してしまう。

ちょっと手順を踏みますがVBAなどの難しいものを使わず、Excelのバージョンを問わず出来る方法を考えてみましたので、お試しあれ。

id:WATANABE

とてもわかり易いです。

ありがとうございました。

2006/08/31 12:34:34
id:taknt No.4

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/08/31 12:23:54

ポイント22pt

項目を増やす場合は、

Range("A"~~~

となっている個所を その増加数分 コピーして修正したらいいですね。

セル上にあるものを いったん変数に退避させてますので

その退避も増やしたらいいでしょう。

それで A列から順に 今は D列まで 一致する 項目がないか調べて

あったら、そこのセルにセットするようにしていますので それぞれ

チェックする幅とか 広げたらいいですね。

id:WATANABE

ありがとうございました。

2006/08/31 13:38:35
id:rikuzai No.5

りくっち回答回数1366ベストアンサー獲得回数1412006/08/31 13:00:26

ポイント10pt

コメント登録不可になっていますので、申し訳ないですが回答で数式の解説をさせてください。


MATCH関数は指定した範囲の中から探したい条件に合ったセルの場所を返す関数です。

MATCH(E$1,$A2:$D2,0)

は、元の表の一段上の列から名前などのタイトルを探して左から何番目にそれがあるかを返しています。


この数式は当てはまるセルがないとエラーを返すので、

MATCH(E$1,$A2:$D2,0)がエラーだったら空白を返しなさい、としているのが

IF(ISERROR(),"","正しい答え")

の部分です。


MATCH関数で該当する位置が得られたら、

その値を列の番号、行番号を数式自体を入力しているセルの行番号として、

行番号、列番号を直接指定する関数INDEXを使用して表示させています。

INDEX($A$1:$D$6,ROW(),MATCH(E$1,$A2:$D2,0))

↑の部分が相当します。

ROW()はセルの行番号を算出する関数です。


以上が今回ご提案した数式の内訳です。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません