みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【Excel VBA】並べ替え

Excel2003を使用しています。

あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。

Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。
抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?

   A列  C列  D列
2  0000  あ  100
3  1200  い  200
4  1500  う  300

       ↓

2  1200  い  200
3  1500  う  300
4  0000  あ  100

データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。

よろしくお願いします。

投稿日時 - 2007-12-13 16:29:17

QNo.3595318

困ってます

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

こんばんは。

私は、どうもご趣旨が、まだ良く分かっていないので、オオボケしているのかもしれませんが、マクロで書けば以下のようなことではないでしょうか?つまり、0の文字列化を施せば済むと思うのですが、そういうことではないでしょうか?それで、元に戻すなら、マクロで、rng.Value = rng.Value とすれば戻ります。

Sub TestZero2Text()
Dim rng As Range
Dim c As Range
Set rng = Range("A1", Range("A65536").End(xlUp))

'0 の文字列化
For Each c In rng
 If Not IsEmpty(c) And c.Value = 0 Then
   c.Value = "'" & Format$(0, "0000")
 End If
Next c

rng.Resize(, 4).CurrentRegion.Sort _
     Key1:=Range("A2"), _
     Order1:=xlAscending, _
     Header:=xlYes, _
     OrderCustom:=1, _
     MatchCase:=False, _
     Orientation:=xlTopToBottom, _
     SortMethod:=xlPinYin, _
     DataOption1:=xlSortNormal
  '0の数値化
  rng.Value = rng.Value
Set rng = Nothing
End Sub

投稿日時 - 2007-12-13 19:54:49

お礼

Wendy02 さん、こんにちは。
お礼が遅くなり、申し訳ありません。

>0の文字列化を施せば済むと思うのですが、そういうことではないでしょうか?

0が最初にならないようにすれば済む話なのですね。
どうも頭が固くていけません(^_^;)
教えていただいたコードで試してみたところ、D列の数値がソートされなかったのですが、アドバイスをいただいていましたので、自分で処理できました。
ありがとうございました。

投稿日時 - 2007-12-17 15:34:20

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

したいことの全貌が良く見えない。
文章表現で考える気があるなら
下記の点を補足してみてください。
ーー
一番判らないのが
1行だけの話か
「最初の行を最後の行にまわす」、でよいのかな。
余分なことが沢山書いてあるが、この1行で済むのでは。文章表現に気をつけてください。そうでないなら、肝心な点の表現不足と思います。
ーー
それより最初の行は第2行目に決まりですか?
最終行は、質問の一部から察すると、その下に別のデータが続くのか。同判別するのか。
ーー
プログラムロジックは
<行削除ーシフト法>
(1)最初の行のデータをを退避する。  
(2)最初の行を行削除
(3)最終行に行挿入、
(4)退避データをセット
では都合が悪いのか。
ーー
<シフトさせない法>
または最初の行を記憶して、シートに書き込まない
次から普通にコピー(書き込み)
最後に最初の行のデータを書き出す
こういうのは都合が悪いのか。
ーーー
>テキストファイルから必要なデータを抽出し
システム担当がやったのか、質問者がやるのか。書かなくても質問に影響ないと思うが、後者なら、質問者の自由度ガ高まるから聞く。
ーー
>抽出したデータをコピーするという
「コピー」しているのか。「代入」がお勧め。テキストファイルは値しかないので(書式やその他情報なし)、値の代入で十分。スピードも落ちると思う。多数のセルに一遍に張り付けできないようだからなおさら。一遍にActivesheet.Pasteができるなら良いが。
ーー
>2行目以下に表示されるので
質問者が表示するのではないの。
>このデータが昇順で表示されているので
どこ列か書かないのはおかしい。
ーー
質問ではソート(並べ替え)のような標題をつけているが、そういうパターンでは処理するものでなさそうだ。
本当に修正キーでも作ってやはりソートしなければならないのかな。
並べ替えはエクセル等の術語なので俗な意味で並べ替えを使わぬようにしたほうが良い。読者をミスリードするとおもう。

    

投稿日時 - 2007-12-15 13:11:57

お礼

分かりにくい質問文で申し訳ありません。
幸い今回は他の方からいただいた回答・アドバイスで、無事解決しました。
細かいところまでアドバイスいただきまして、ありがとうございました。

投稿日時 - 2007-12-17 15:57:01

ANo.4

一番シンプルなロジックとしては、#3 ご回答のようにソートした際に
末尾に来てほしいものを「そうなるように置換」してしまえば良いだけ
です。例えば、

0000 ---> ZZZZ

と置換し、ソート実行後に逆置換して元に戻す...です。

投稿日時 - 2007-12-14 00:19:23

お礼

KenKen_SP さん、こんにちは。
お礼が遅くなり申し訳ありません。

>末尾に来てほしいものを「そうなるように置換」してしまえば良いだけ

なるほど~!0000のデータが末尾に来るように置換してしまえば良かったのですね。
恥ずかしながら、そのような考えには全く至りませんでした(^_^;)
アドバイスいただいたように、「そうなるように置換」して、ソート実行後に逆置換して元に戻すという方法で解決しました。
ありがとうございました。

投稿日時 - 2007-12-17 15:52:10

ANo.2

既存の表形態が不明のため自信はないですが、

Rows("2").Cut
Rows(Sheets("Sheet1").UsedRange.Rows.Count + 1).Insert

なんていうのは問題外ですよね・・・

投稿日時 - 2007-12-13 18:08:57

お礼

お礼が遅くなり、申し訳ありません。
教えていただいた方法も参考にさせていただきます。
アドバイスありがとうございました。

投稿日時 - 2007-12-17 15:15:50

ANo.1

A列の『0000』が入力された行の前に、行挿入をした上で、順次、項目を追加していくような処理にすれば、実現できそうですが・・・。

投稿日時 - 2007-12-13 17:04:58

補足

アドバイスありがとうございます。

>行挿入をした上で、順次、項目を追加していくような処理

Excelへのデータコピー(マクロ)は、予め作成されている表に値のみをコピーするので、行を挿入したりするとレイアウトが崩れるような気がするのですが…。
あと、表には数式が入力されている列もあるので、その辺も気になるところです。
やはり、このようなことは難しいですかね。。。

投稿日時 - 2007-12-13 17:13:39

あなたにオススメの質問