• ベストアンサー

「 複数の各レコードごと 」 を、希望順に並び替えるマクロは ?

以前に似た質問をさせて頂きました時は、マクロ以外のご回答を頂きましたので、 今回は、「 マクロの回答 」 をお願いしたいと投稿いたしました。 何卒、ご教授くださいませ。 A列 の 下6桁 を除く数字は、 必ず、 1 ~ 10 です。 その 「 A列を優先キー 」 にて、「 複数の各レコードごと 」 を、 希望順 に入れ替えたいんです。 たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。  * 部分は、 必ず 6 桁 です。 左隅の数字 は 1 ~ 10 までだけ変動します。 このエリアの数は、 2 ~ 3 まで変動します。 ------------------------------------------------   下記例は、エリアの数が 3つ で、     左隅の数字 4、 2、 10  の場合です。 実行前 ( エリア順が 4、2、10 です ) A列 4****** ・ ・ 4****** 2****** ・ ・ 2****** 10****** ・ 10****** ↓↓↓ 実行後1 ( エリア順を 10、4、2 にさせたい。 実際には、エリア順は全部で5通りになります。 ) A列 10****** ・ 10****** 4****** ・ ・ 4****** 2****** ・ ・ 2******

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

  • ベストアンサー
  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.6

こちらが想定してるのと違ってるようですね。 あー。読み直して理解しいました。 A列は 4だけが入ってるのではなくて、4******が入っているのですね。 B列以降はまた別途データが入っている、と。 修正しました。 Sub a() Dim sort_key As String Dim sDataArray As Variant Dim i As Long Dim j As Long sort_key = InputBox("ソートキーを入力してください" & vbCrLf & "1,2,3みたいな感じで入力してください") '/* '/* 入力内容分割 '/* sDataArray = Split(sort_key, ",", -1, vbTextCompare) '/* '/*  256列に暫定ソートキーを設定 '/* For i = 0 To UBound(sDataArray) j = 1 Do Until Cells(j, 1) = "" '桁数の考慮を追加しました。 Select Case Len(Cells(j, 1)) Case 7 '7桁だったら先頭1桁と比較 If Val(Mid(Cells(j, 1), 1, 1)) = Val(sDataArray(i)) Then Cells(j, 256) = i End If Case 8 '8桁だったら先頭2桁と比較 If Val(Mid(Cells(j, 1), 1, 2)) = Val(sDataArray(i)) Then Cells(j, 256) = i End If Case Else MsgBox ("桁数がへんっすー") End Select j = j + 1 Loop Next '/* '/*  暫定ソートキーでソート '/* Cells.Sort Key1:=Range("IV1"), Order1:=xlAscending, Header:=xlGuess '/* '/*  暫定ソートキーを削除 '/* Columns("IV:IV").Select Selection.Delete Shift:=xlToLeft Range("A1").Activate End Sub

oshietecho-dai
質問者

お礼

私の質問内容の不十分で、大変お手数をおかけいたしまして、申し訳ござしませんでした。 誠に、有難うございました。

その他の回答 (5)

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.5

A列 4****** 4****** 4****** 4****** 4****** 4****** 2****** 2****** 2****** 2****** 2****** 10****** 10****** 10****** 上記のような場合、10,4,2の順にしたいばあいは 10,4,2 と入力してください 5パターンに制限されることなく、A列の並べたい順に入力してください。 A列が、3、4の二つしかなく4******,3******の順にしたいときは 4,3 と入力してください

oshietecho-dai
質問者

補足

度々、大変、恐れいります。 >上記のような場合、10,4,2の順にしたいばあいは 10,4,2 と入力してください も試みましたが、同様に、動作する(エラーにはならない)のですが、 全く動かないんですが? 当方のどこかに問題があると思いますが、それが解りません。 1、標準モジュール に貼り付けましたが、よろしいでしょうか? 2、どこかを編集する必要がおありでしょうか? 3、それと、自身なりに IV列を 確認しましたが、空白のままになっている IV列を 削除しているようなんですが? 4、当方は、Excel 2002 です。 ---------------- 恐れ入ります、再確認ですが、 ファイル名は、*******.CSV A列 4062501 4062502 4062504 4062505 2062502 2062503 2062505 10062510 10062511 10062512 上記のような場合、10,4,2の順にしたい場合は、 10,4,2 と入力すればよろしいわけでしょうか? 試みましたが、同様に、動作する(エラーにはならない)のですが、 全く動かないんですが? 以上 よろしくお願い致します。

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.4

こんな感じでしょうか? IV列を暫定で使用してますので、IV列を既に使用済みでしたら別列にしてください。 Sub a() Dim sort_key As String Dim sDataArray As Variant Dim i As Long Dim j As Long sort_key = InputBox("ソートキーを入力してください" & vbCrLf & "1,2,3みたいな感じで入力してください") '/* '/* 入力内容分割 '/* sDataArray = Split(sort_key, ",", -1, vbTextCompare) '/* '/*  256列に暫定ソートキーを設定 '/* For i = 0 To UBound(sDataArray) j = 1 Do Until Cells(j, 1) = "" If Val(Cells(j, 1)) = Val(sDataArray(i)) Then Cells(j, 256) = i End If j = j + 1 Loop Next '/* '/*  暫定ソートキーでソート '/* Cells.Sort Key1:=Range("IV1"), Order1:=xlAscending, Header:=xlGuess '/* '/*  暫定ソートキーを削除 '/* Columns("IV:IV").Select Selection.Delete Shift:=xlToLeft Range("A1").Activate End Sub

oshietecho-dai
質問者

補足

誠に申し訳ございません、動作する(エラーにはならない)のですが、 全く動かないんですが? 私の質問の例でしたら、ソートキーを 3,1,2 と 入力すればよろしいわけでしょうか? それとも 312 でしょうか? よろしくお願い致します。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#2です。関数による回答で、お呼びじゃないのは判りますが、結果はこういうので良いでしょうか。 これをVBAコードでッ実現するのは、たやすいのですが。 結果は下記でよいのか、補足していただければ幸いです。 データ A列  B列 B列は=RANDBETWEEN(1,100)で出したもの 8****** 51 5****** 14 5****** 61 7****** 77 10****** 65 9****** 99 6****** 88 4****** 5 6****** 98 8****** 84 8****** 83 7****** 14 9****** 61 5****** 17 4****** 50 6****** 46 4****** 20 10****** 2 B列でソート(順をランダム化するため 結果 C列は=IF(MID(A1,LEN(A1)-6,1)="0",MID(A1,LEN(A1)-7,2),MID(A1,LEN(A1)-6,1))*1 で出したもの。 A列  B列  C列 4****** 60 4 5****** 74 5 6****** 30 6 7****** 52 7 8****** 35 8 4****** 56 4 5****** 19 5 6****** 14 6 4****** 19 4 5****** 100 5 6****** 56 6 7****** 39 7 8****** 87 8 9****** 81 9 10****** 47 10 8****** 93 8 9****** 100 9 10****** 41 10 C列でソート。 10****** 71 10 10****** 26 10 9****** 14 9 9****** 14 9 8****** 70 8 8****** 46 8 8****** 88 8 7****** 76 7 7****** 48 7 6****** 48 6 6****** 93 6 6****** 57 6 5****** 8 5 5****** 54 5 5****** 86 5 4****** 41 4 4****** 7 4 4****** 13 4

oshietecho-dai
質問者

お礼

どうも、有難うございました。

oshietecho-dai
質問者

補足

すみません、重要な質問内容のミスです。 >たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。 ↓↓↓ 訂正です。 下記例の「 4****** 」は「 4****** だけのレコード全部 ( 4だけが全く同じのデータが続いてます ) 」 を 「 エリア1 」 と 表現させて頂ます。 必ず、左端の数字は同じに続いており、連続ではありません。  ------------------------- 実行前 ( エリア順が 4、2、10 です )  A列 4****** 4****** 4****** 4****** 4****** 4****** 2****** 2****** 2****** 2****** 2****** 10****** 10****** 10****** ↓↓↓ 実行後1 ( エリア順を 10、4、2 にさせたい。 実際には、エリア順は全部で5通りになります。 ) A列 10****** 10****** 10****** 4****** 4****** 4****** 4****** 4****** 4****** 2****** 2****** 2****** 2****** 2****** --------------------------

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

> 複数の各レコードごと 」 を、希望順に並び替えるマクロは  これは書かなくても良い文章です。 また「レコード」は、エクセルせは「行」で表されるので、仰々しい。これをテキスト形式やMDB形式のファイルに変換すれば、レコードという考えが正面に出てくる。「複数の」もソートにおいては当たり前のケースで、書けば却って何か?と思ってしまう。 コンピュターのソートは、基本的に、昇順、降順とソートキー(ソート列、どの列でソートするのか)しか指定できません。 それ以上は、自分がソートしてほしいように、修正キーを各レコード(各行)に(多分別列に)「作る」必要があります。 作ってしまえば、VBAでもコード2行で済んでしまいます。 プログラムなどでは、レコードの後尾などに、フィールドとして、修正キー項目を付け加えたりすることも多い。 かっての、コンピュター作業は、ソート+処理が基本で、これが死命を握ってました。 ーー キーが4(列)つ以上の場合なら、エクセルの質問に値しますでしょうが、本件はこれには関係ないらしい? ーーー 補足要求 (1)本件は、大筋右から7桁目の1桁でソートすればよいが、10の場合は右から7桁目から2桁採らないといけないようですが、これが異例となります。右から7桁目が0の場合だけ2桁採ればよいのでしょうか? ーーー (2)希望通り、ソート後に、右から7桁目が例えば2のものだけを、別シートに分離 したいとかの要求はあるのですか。 (3)>このエリアの数は、 2 ~ 3 まで変動します。 この意味は? データの内容の実情であって、プログラムに影響しないのでは?。 プログラムのことが判らないのだから、やむをえないのだが、質問文に書かなくても良いことが描いてある感じがする。  もっと質問点を絞る訓練が必要。そうしないと、全てVBAコード作ってください式になってしまう。 ーー 要望 関連前問が有るようですが、その番号を書いておけば、問題の意味の 理解に役立つので、書いておいてはどうでしょう。

oshietecho-dai
質問者

補足

すみません、重要な質問内容のミスです。 >たとえば 「 4****** だけのレコード全部 ( 連続してます ) 」 を 「 エリア1 」 と 表現させて頂ます。 ↓↓↓ 訂正です。 下記例の「 4****** 」は「 4****** だけのレコード全部 ( 4だけが全く同じのデータが続いてます ) 」 を 「 エリア1 」 と 表現させて頂ます。  ------------------- >(1)本件は、大筋右から7桁目の1桁でソートすればよいが、10の場合は右から7桁目から2桁採らないといけないようですが、これが異例となります。右から7桁目が0の場合だけ2桁採ればよいのでしょうか? はい、おっしゃられる通りでございます。 >(2)希望通り、ソート後に、右から7桁目が例えば2のものだけを、別シートに分離 したいとかの要求はあるのですか。 「 別シートに分離したい 」は一切ございません。 ただ、後に、このシート上で、A列も含めて、マクロにて置換え、ソート等はいたしますので、各セルのデータ内容は変更されては困ります。 (都合上、もし列が追加された場合は、その列を削除しますので追加は結構です。) >(3)>このエリアの数は、 2 ~ 3 まで変動します。 この意味は? 今回の質問は、エリアの数は、 3 ですが、 2 の場合の時もあるということです。  すみません余分(2の場合は、上下入れ替えの1通りだけです)でした、今回は 3 だけ(下記例だけ) で結構です。 また、「全てVBAコード作ってください式」ではなくて、もちろん関数等と混合しても結構です。 >要望 http://oshiete1.goo.ne.jp/qa2631898.html 未熟な私の判断(使用してみた結果)ですと、 このご回答の場合、A列の数字(1~10)を軸にしていると思いましたので、119通り(エリアの数が3の場合)になると思った次第でございます。 今回の質問で、A列のエリア順(1・2・3)を軸にし、5通り(エリアの数が3の場合)にしたいと思ったからです。

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.1

エクセルで処理すると前提で補足お願いします。 1.ソートしたいものは、全てA列に収まっているのでしょうか? あるいは、A列には1~10のみでB~G(6桁)にのこりの可変”*”が入っているのでしょうか? 2.ソートの順番指定は5通りとのことですが、どのように指定したいのでしょうか?

oshietecho-dai
質問者

補足

即答、誠に有難うございます。 大変恐れいります。 >1.ソートしたいものは、全てA列に収まっているのでしょうか? A列だけを 「 最優先されるキー 」 にてレコードごとをソートしたいのです。 >あるいは、A列には1~10のみでB~G(6桁)にのこりの可変”*”が入っているのでしょうか? 質問画面の例の通りで、B列以降は、他のデータなので、無視されて結構です(但し、各セルのデータ内容が変更されては困ります)。 B列以降は、A列だけを 「 最優先されるキー 」 にてソートされるだけで結構でございます。 >2.ソートの順番指定は5通りとのことですが、どのように指定したいのでしょうか? 例えば、 今回の質問の「1通り」は、エリア順 「 1・2・3 」 → 「 3・1・2 」にしました。 他は、             エリア順 「 1・2・3 」 → 「 3・2・1 」にします。 他は、             エリア順 「 1・2・3 」 → 「 2・3・1 」にします。 他は、             エリア順 「 1・2・3 」 → 「 2・1・3 」にします。 他は、             エリア順 「 1・2・3 」 → 「 1・3・2 」にします。             他は、             エリア順 「 1・2・3 」 → 「 1・2・3 」にします。× 同じなので不必要。  以上で、合計5通りでございます。            よろしくお願い致します。

関連するQ&A