dポイントプレゼントキャンペーン実施中!

エクセルのばらばらのセルを整列するには?

現在エクセルに 
郵便番号 郵便番号 
住所    住所
氏名    氏名
スペース スペース
郵便番号 郵便番号
住所    住所
氏名    氏名 
スペース スペース
郵便番号 郵便番号
住所   住所
氏名   氏名 
スペース スペース
となっているんですが、これを
郵便番号、住所、氏名
郵便番号、住所、氏名
郵便番号、住所、氏名
郵便番号、住所、氏名
郵便番号、住所、氏名
のように横一列に自動で整形したいのですが、
どうしたらいいでしょうか?

A 回答 (9件)

W = Cells(Y, X)


If W = "" Or Len(W) = 0 Then        ← セルの値が何かあるかどうか
If J > 0 Then
I = I + 1
Print #1, I & "," & Chr(34) & J & Chr(34) & "," & Z   ← CSVファイルへ出力するコマンド、「&」は文字連結 (2)
J = 0                          
Z = ""  
End If
Else
J = J + 1
Z = Z & "," & Chr(34) & W & Chr(34)           ← 退避させる処理  (1)
End If

(1)において、
1セル目は:空っぽ””(=Z)とA1セル郵便番号の連結を行いZへ退避
2セル目は:郵便番号(=Z) とA2セル住所 の連結文字列を行いZへ退避
3セル目は:郵便番号 と住所(=Z) とA3セル氏名の連結文字列を行いZへ退避

4セル目は:空白行であるため((2))、Zの内容を出力します。Zはクリアします。

これの繰り返しです。
Iは全体いくつの住所データが存在したかをカウントアップ、しています。(=整合性チェックに使ってください。)
Jは有効な情報をいくつ連結させたかをカウントアップ、しています。

(1)の後に
Print #1, I & "," & Chr(34) & J & Chr(34) & "," & Z
を記載すると全体の動きが把握できるかと思います。
    • good
    • 0
この回答へのお礼

全部は分かりませんが、すこし何をやってるのか解りました。
有難うございました。

お礼日時:2010/05/24 01:46

対応例)


必要としている範囲のセルを1つずつ判定し、文字連結します。
必要なときに改行して出力。連結していた文字列はクリアします。

Public Sub AA()
Dim W As String
Dim Z As String
Dim I As Long
Dim J As Long
Dim X As Long
Dim Y As Long

I = 0
J = 0
Z = ""

Sheets(1).Select
Range("A1").Select
Open ThisWorkbook.Path & "\" & "編集結果.CSV" For Output As #1
For X = 1 To 3
For Y = 1 To 200
W = Cells(Y, X)
If W = "" Or Len(W) = 0 Then
If J > 0 Then
I = I + 1
Print #1, I & "," & Chr(34) & J & Chr(34) & "," & Z
J = 0
Z = ""
End If
Else
J = J + 1
Z = Z & "," & Chr(34) & W & Chr(34)
End If
Next Y
If J > 0 Then
I = I + 1
Print #1, I & "," & Chr(34) & J & Chr(34) & "," & Z
End If
Next X
Close #1

MsgBox ("完了")

End

End Sub

-----------------
For X = 1 To 3
For Y = 1 To 200
の「3」はA列(A1に対する1番目)からC列(3番目)を意味します。
「200」は同じ考えで行。
Chr(34)は「”」のことです。

ブックと同じフォルダに"編集結果.CSV"を作ります。
1,"4",,"郵便","住所","住所2","氏名"
2,"3",,"郵便","住所","氏名"
3,"3",,"郵便","住所","氏名"
こんな感じで出来上がります。
順、項目数、その内容。項目数列が4のときは住所が2つとかになる想定です。
見出しはありません。

できるだけ簡単なコマンドを使っています。
処理ロジックは理解していただきたくお願いします。
(体裁は勘弁してください。)

※関数を使うとほとんどが決まった動きしかしないので
パターン変わると使えないこと多いです。

間に空白行2行あっても大丈夫です。

この回答への補足

有難うございます。
動かすと、全体で項目が4つそろっていると上手く縦から横にならびますが、
4項目中3項目、住所が1個だけとかだと、
改行されて出力されてしまいます。
参考にさせて頂き考えてみます。

補足日時:2010/05/23 21:26
    • good
    • 0
この回答へのお礼

項目中に空白があっても改行しない処理はどこでやっているのでしょうか?

お礼日時:2010/05/23 21:42

このズレだと空白から空白が1行分、または郵便番号から郵便番号が1行分という見方になりますので回答例にある3行セットの考え方が使えなくなりそうです。

でもできないこともないです。空白はそのままでよいでしょう。例外はこれくらいでしょうか。少し時間下さい。
    • good
    • 0

補足)



>スペースの量が不規則なのでそれを正してから出ないとだめですよね?
これだと不規則なところもなんとかしてね、と解釈されてしまいがち。
本題は縦2列情報を横情報にする事なので、
揃っている前提でその先を教えてほしい、というところが本来の筋ではないでしょうかね?。(=空白行不規則なところを揃えるのは別の質問でもいい話では?)

今回の質問を見ると、
コピーの貼り付けで「行と列を逆にして貼り付け」を繰り返せば手作業でたぶんできます。
またその時にコピーの範囲が3行×3列ずつとか一定で決まっていると
範囲セル位置が変わっていくだけなので、マクロ化対応が可能になってきます。

不規則な空白行があるかどうかは重要なポイントなのです。

郵便番号、住所、氏名、かならず3行そろっていること、もそうです。
住所、氏名、だけというパターンがあっては自動化は困難になってきます。

この回答への補足

申し訳ありません。
空白を消してみると、A列とB列が違ってしまうのです。

郵便番号 郵便番号 
住所    住所
住所2   氏名
氏名   郵便番号
郵便番号  住所 
住所    氏名
氏名

A列B列が同じ行で揃うように自動で揃う処理をしなければならないです。。

今回はむずかしいでしょうか・・・   

補足日時:2010/05/20 01:17
    • good
    • 0

こんばんは!


一気に!という方法ではないので、参考になるかどうか判りませんが・・・
↓の画像で説明させていただきます。
2段階でまとめるようにしてみました。

まず、A・B列の空白を無視して、D・E列に表示させます。
それをG~I列に表示するようにしてみました。

D1セルに
=IF(COUNTA(A$1:A$1000)<ROW(A1),"",INDEX(A$1:A$1000,SMALL(IF(A$1:A$1000<>"",ROW($A$1:$A$1000)),ROW(A1))))

これは配列数式になってしまいますので、この画面から直接D1セルにコピー&ペーストしただけではエラーになると思います。

D1セルに貼り付け後、F2キーを押す、又はD1セルでダブルクリック、又は数式バー内で一度クリックします。
編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定します。
数式の前後に{ }マークが入り配列数式になります。
このD1セルをとなりのE1セルまでオートフィルでコピーし、そのまま下へオートフィルでコピーします。

そして、G1セルに
=INDEX($D$1:$E$1000,INT(ROW(A2)/2)*3+COLUMN(A1)-3,IF(MOD(ROW(A1),2)=0,2,1))&""
(これは配列数式ではありません)
という数式を入れ、I1セルまでコピーし、そのまま下へコピーすると
画像のような感じになります。

最後にG~I列全てを範囲指定し → コピー → 「形式を選択して貼り付け」 → 好みの位置に貼り付け
他の列を削除して完了です。
尚、数式は元データの1000行目まで対応できるようにしています。

以上、長々と書きましたが
参考になれば幸いです。m(__)m
「エクセルのばらばらのセルを整列するには?」の回答画像5
    • good
    • 0

[回答番号:No.3]への補足、



後で気付いたことですが、空白行数が一定ではないのですね。
それなら、先に空白行だけを一気に削除(これは簡単にできます!)しておくことをお薦めします。
    • good
    • 0

添付図参照


D1: =OFFSET(A$1,(ROW(A1)-1)*2,)
D2: =OFFSET(B$1,(ROW(A1)-1)*2,)
E1: =OFFSET(A$2,(ROW(A1)-1)*2,)
E2: =OFFSET(B$2,(ROW(A1)-1)*2,)
F1: =OFFSET(A$3,(ROW(A1)-1)*2,)
F2: =OFFSET(B$3,(ROW(A1)-1)*2,)
範囲 D1:F2 を下方にズズーッとドラッグ&ペースト
「エクセルのばらばらのセルを整列するには?」の回答画像3
    • good
    • 0

んでは,簡単な数式だけで出来る別の手で。



手順:
A列のデータをDEF列に並べます。
D1に
=IF(ISERROR(E2),NA(),A1)
E1に
=IF(ISERROR(F2),NA(),A1)
F1に
=IF(AND(A1<>"",A2=""),A1,NA())
を記入,D1:F1を選んで下向けにつるつるっとオートフィルドラッグ。

D:F列を列選択
Ctrl+Gを押し
現れたダイアログでセル選択のボタンをクリックして
現れたダイアログで数式のエラー値を選んでOKし
すかさず編集メニューの削除で上に詰めます。
(一番下にゼロが幾つか並んだのは,手で削除してください)

B列についても同様にHIJ列に並べ替えて,あとは合わせてください。
並べ替えたあと全体をコピーし,その場で型式を選んで貼り付けの「値」で貼り付けて結果を値に変えてやれば,コピーも移動も自由です。


#更に別の手
オートフィルタなどを使って空白行を全て除去してデータを上に詰め,先の回答の数式を少し自力で改修していただいても出来ます。
データを一度WORDにコピーして,置換の機能を使って「何個かまとまった改行(空白行)」を「1行の空白行」に置換(実際には段落記号3連続を段落記号2連続に置換,を数回繰り返すなど)して元のご相談に掲示されたスタイルのデータに整備し,それをエクセルに貼り戻して前回の数式そのままを使うといった方法もあります。
どんなやり方でも結果が出れば勝ちですから,色々手を動かしてみてください。




#それで。
>たぶん、下のスペースの量が一定でないからだと思います。

何て言うか,とっても「ひとごと」みたいですね。それでそんな具合に「実はこうなんです,ほんとはこうだったんです」と後出しされたら,出来なくて当たり前ですし回答する側も「またどうせ違うんじゃない?」と,マジメに回答するだけ無駄じゃない?とも思っちゃいますよね。
とは言え,今回のご質問に関して言えば最初の例示もあまりに「簡単に書かれすぎている」ので,どうせ実際は違うんだろうなこのままじゃ出来ないだろうなと,1回無駄にする気持ちでこれで出来たらむしろお互いラッキーと思って回答してましたから特に構いません。少なくとも,ご質問を投げっぱなしでそのままどこかにトンズラされちゃう方では無かった事だけでも,判って良かったです。

この回答への補足

>とっても「ひとごと」みたいですね
申し訳ありません。
先ほどの関数が難しくて、それが動かない理由はスペースが一定じゃないからかなという意味です。

後出しになって申し訳ないのですが、整列などの手動操作なしで、自動で行いたいんです。
スペースの量が不規則なのでそれを正してから出ないとだめですよね?
それをスペース量を自動でパターン化する方法をとったあと、例の数式をつかえばいいのでしょうか?

補足日時:2010/05/18 17:25
    • good
    • 0

AB列にその格好でデータがあります。


=INDEX($A:$B,INT((ROW(A1)-1)/2)*4+COLUMN(A1),2-MOD(ROW(A1),2))
と式を入れて,右にあと2つ,そして下にコピーするとできます。

この回答への補足

=INDEX($A:$B,INT((ROW(A1)-1)/2)*4+COLUMN(A1),2-MOD(ROW(A1),2))
むずかしい式ですね。。
最初の2個までは綺麗に揃いましたが、それ以上は上手く揃いません。
たぶん、下のスペースの量が一定でないからだと思います。

郵便番号 郵便番号 
住所    住所
氏名    氏名
スペース スペース
郵便番号 郵便番号
住所    住所
氏名    氏名 
スペース スペース
スペース スペース
郵便番号 郵便番号
住所    住所
氏名    氏名 とか・・・

補足日時:2010/05/18 14:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!