人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルで作成された、項目(A1)+セル内容(A2)が不規則なデータを、指定したセル(もしくはフォーム)に自動で振り分ける方法やソフトはないでしょうか?
例:
一行目 名前 住所 年齢 趣味
二行目 山田 東京 20 映画
三行目 住所 趣味
四行目 千葉 釣り
五行目 年齢
六行目 30

変換後:

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



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


●質問者: WATANABE
●カテゴリ:コンピュータ
✍キーワード:A1 エクセル セル ソフト データ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●23ポイント ベストアンサー

前回と同様マクロです。

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

◎質問者からの返答

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


2 ● りくっち
●23ポイント

同シートの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を選択して貼付け。

以上でどうでしょうか。

◎質問者からの返答

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


3 ● kn1967
●22ポイント

手順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のバージョンを問わず出来る方法を考えてみましたので、お試しあれ。

◎質問者からの返答

とてもわかり易いです。

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


4 ● きゃづみぃ
●22ポイント

項目を増やす場合は、

Range("A"???

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

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

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

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

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

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

◎質問者からの返答

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


5 ● りくっち
●10ポイント

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


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()はセルの行番号を算出する関数です。


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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ