• 締切済み
  • 暇なときにでも

Excel2000のSORTマクロの質問

ワークシート内にSortキー指定セルを3つ設定し、これをマクロで読み取って、最大3個までの sortを実行しています。 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, Key2:=Range(strKey2), _ Order2:=xlAscending, Key3:=Range(strKey3), Order3:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin 注)strKey1,strKey2,strKey3にはSortキーを行うセル番号(E11など)が入ります。 これですと、strKey2 と strKey3 に値が入っていないと「1004 アプリケーション定義またはオブジェクト定義のエラーです」と出るので、IF文を使って Sort命令自体を3つに分けて処理しています。 そこで質問なのですが、Selection.Sort 命令以降を『文字列変数』で記述して、strKey1,strKey2,strKey3の入力内容によって命令文を操作して、1つのsort命令で処理したいのですが、可能なのでしょうか? つまり、strKey2 と strKey3 が未入力ならば、 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin …のようになるように、文字列として書きたいのですが、strKey1だけ指定する場合、 strSortString = "Key1:=Range(""" & strKey1 & """), Order1:=xlAscending, " & _ "Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, " & _ "SortMethod:=xlPinYin" Selection.Sort strSortString と書きたいのです。 実際に上のようにやってみますと 「1004 入力した文字列は参照名または定義名として正しくありません。」と出ます。 基本的にsort命令はこのような使い方はできないのでしょうか? 分かりにくい説明ですみませんが、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1045
  • ありがとう数1

みんなの回答

  • 回答No.3

>2003ではキー2、キー3が未入力でもうまく行くのでしょうか? キー1が入力されていれば、うまくいきます。キー2だけが未入力という場合でもOKでした。 A1~D1を列見出しにした表を作り、セルF1、F2.F3に見出しの文字列をキーとして入力後、下のマクロを実行しました。 エラーになるのは、 ○セルF1が未入力の場合 ○入力した文字列が、表の見出しの文字列と違う場合 ○データが無い場合 でした。 なお、#2のマクロでは表中のセルが選択されていないとエラーになるので、念のためRange("A2").Selectを追加しました。 これでエラーになってしまうと、バージョン違いであきらめざるを得ないかもしれません。 ただ、F1~F3を同じ文字列にしてみるとどうなりますか、エクセルの”並べ替え”ではできませんが、マクロからだとなぜかできてしまいます。キーが一つか二つの場合は、第1キーと同じ文字列を複数指定するようにマクロを組めば、ご希望の処理ができるかもしれません。 Sub test2() Dim strKey1 As String, strKey2 As String, strKey3 As String strKey1 = Range("F1").Value strKey2 = Range("F2").Value strKey3 = Range("F3").Value Range("A2").Select Selection.Sort Key1:=strKey1, Order1:=xlAscending, Key2:=strKey2, _ Order2:=xlAscending, Key3:=strKey3, Order3:=xlAscending, _ Header:=xlYes, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

何度もアドバイスありがとうございました。 当方ではどうしてもエラーになってしまいますので、バージョンを上げるとか、色々やってみようと思います。

関連するQ&A

  • 記述を簡略化させたい

    お世話になります。 下記の記述をスマートにさせたいのですが、ご教示お願いします。         記 Sub 優先順位() Range("A16:Y25").Select Selection.Sort Key1:=Range("Y16"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A43:Y52").Select Selection.Sort Key1:=Range("Y43"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A70:Y79").Select Selection.Sort Key1:=Range("Y70"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A97:Y106").Select Selection.Sort Key1:=Range("Y97"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A16").Select End Sub

  • エクセルマクロのソートについて

    こんにちわ! エクセルマクロのソートについて質問です。 プロシャージャを使ってソート使いまわそうと思うのですが、範囲、並び替えキーを変えたいと思うのですが可能でしょうか? Sub Sort()    Range("A1:c10000").Sort _ Key1:=Range("a1") , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 一応、動作はしませんが下記のようなイメージで動かしたいです。 Sub Sort() Dim key As String Dim hanni As String key = Range("a1") hanni = Range("A1:c10000") 'セルhanniの範囲のデータをkey列をキーに昇順に並べ替えます hanni.Sort _ Key1:=key _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 可能でしょうか? わかる方おりましたらアドバイスの程お願いします。

  • 下記のマクロの説明(意味)を教えてくださ。

    Range("A4").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Sort Key1:=Range("A5"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlStroke, DataOption1:=xlSortNormal

  • 回答No.2

3列の表を作り、表の最上行は各セルに、a,b,cと列見出しを入れました。これで以下のマクロだとうまくいくようですが、これでいかがでしょうか。 Sub test() Dim strKey1 As String, strKey2 As String, strKey3 As String strKey1 = "a" strKey2 = "" strKey3 = "" Selection.Sort Key1:=strKey1, Order1:=xlAscending, Key2:=strKey2, _ Order2:=xlAscending, Key3:=strKey3, Order3:=xlAscending, _ Header:=xlYes, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin End Sub

共感・感謝の気持ちを伝えよう!

質問者からの補足

アドバイスありがとうございます。 やはりエラーになります。 2003ではキー2、キー3が未入力でもうまく行くのでしょうか? 2000では確実にエラーになります。

  • 回答No.1

当方エクセル2002ですが、掲示されている(最初の)マクロを実行してもエラーになりませんでした。そのかわり、strKey2 と strKey3 が未入力の場合、1番目のキーに指定したセルの値もソートされてしまいました。 エラーはSortメソッドで起こっているのでしょうか。 引数の Header:=xlGuess を Header:=xlYes に変えてみるとどうなるでしょうか。 見当違いでしたらすみません。

共感・感謝の気持ちを伝えよう!

質問者からの補足

アドバイスありがとうございました。 引数の Header:=xlGuess を Header:=xlYes に変えてみましたが、やはりエラーになりました。 そもそも、strKey2が未入力の場合、「Key2:=Range(strKey2)」がオブジェクトとして認識されないようなのです。 まぁ、この部分は置いておくとして(^^;…、今回の私の質問のポイントは、「Sort命令に文字列変数を渡すことはできないのか?」ということでした。 変数で渡せれば、元となるキー内容によって、キー1~3までのどこまでを渡せばいいのかが判断できるので、上のようなエラーが起こることがなくなる…と考えたからです。 元々のExcelの仕様なのか、何か裏ワザがあるのか、引き続き情報をお持ちの方、よろしくお願いします。

関連するQ&A

  • マクロを使用してソートしたいのです。

    どなたか教えてください。 マクロの自動記録ですと、 Range("A1:E942").Sort Key1:=Range("E1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal このようになるのですが、データー件数が毎回異なるのです。上の件数だと942件ですが、次回行うときは、958件となったり致します。「E列」を昇順でソートするにはどのように行ったら良いのでしょうか?

  • マクロの解析してください。

    仕事で使うようになったファイルにマクロが登録してありました。 一体、何をしているのかわかる方お願いします。 Selection.Sort Key1:=Range("A4"), Order1:=xlAscending, Key2:=Range("B4") _ , Order2:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False _ , Orientation:=xlTopToBottom, SortMethod:=xlPinYin End Sub と、あるのですが宜しくお願いします。

  • 並べ替えのマクロで対象行の範囲を行を増やした分だけ可変にして増やしたい。

    マクロ超初心者です。エクセル2003においての質問です。 作成した〔日付順〕のボタンを押すことで並べ替えをしたいと思い,以下のマクロを「記録」から作成したのですが, 9行~153行の間に行を挿入した場合,並べ替えの対象となる行も同じように増えてほしいのですが,常に9行~153行のままで増えてくれません。 可能なら9行より前に行を挿入した場合も同じように可変して欲しいです。 全くのマクロ初心者でどう変えればいいのか分かりません。 また,「記録」から作成したマクロには操作内容が全て存在するようなのですが, 消してもいい不要な部分も分からないので教えて頂ければありがたいです。 よろしくお願いします。 (出来れば以下を書き直して全て貼り付けて頂けるとかなり助かります。) sub 日付順()    Rows("9:153").Select    Selection.Sort Key1:=Range("I9"),Order1:=xlAscending,Key2:=Range("J9") _       ,Order2:=xlDescending,Header:=xlGuess,OrderCustom:=1,MatchCase:= _       False,Orientation:=xlTopToBottom,SortMethod:=xlPinYin,DataOption1:= _       xlSortNormal,DataOption2:=lxSortNormal    Selection.Sort Key1:=Range("H9"),Order1:=xlAscending,Key2:=Range("B9") _       ,Order2:=xlDescending,Key3:=Range("M9"),Order3:=xlAscending,Header _       :=xlGuess,OrderCustom:=1,MatchCase:=False,Orientation:=xlTopToBottom _       ,SortMethod:=xlPinYin,DataOption1:=xlSortNormal,DataOption2:= _       xlSortNormal,DataOption3:=lxSortNormal End Sub

  • Excelのマクロでソートがうまく動かない

    *** ソース *** Sheets("Sheet 1").Select Range("B2:H92").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("H3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select Sheets("Sheet 2").Select Range("B2:K49").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("I3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select ... 以下省略 ************* 上記のように複数のシートを一括してソートを行うようにマクロを組んでいます。 ですがマクロを実行するとタイトル行も含めてソートを行うなど、おかしな挙動になってしまいます。 ソートの条件としては「範囲の先頭行」を「タイトル行」で行わせたいのですが、「データ」でソートを行うシートが出てしまうのです。 太字にすると回避できるなど試したのですが、うまくいかなかったです。 Header:=xlYes にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。 よい方法をご存知の方がいましたら、ご教授下さい。

  • エクセル VBA 集計方法

    各シート毎に下記の内容にて集計をしたいのですが、A2のセルにデータがない場合集計をしない方法がわからないのでご存じの方宜しくお願い致します。 Sheets("Sheet1").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True Sheets("Sheet2").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True Sheets("Sheet3").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True End Sub

  • エクセル・並び替えのマクロ

    エクセルで並び替えのマクロを作ったのですが ___A ______B ______C ______D ______E ______F _____________G 1 (株)カネカ【東証1部 : 4118.T】 2 日付 __始値 _高値 _安値 _終値 _出来高 ___調整後 3 07/07 1,030 1,069 ___941 __974 30,772,000 ___974 4 07/06 1,057 1,093 1,016 1,033 26,904,000 1,033 5 07/05 1,080 1,086 1,023 1,051 26,541,000 1,051 6 07/04 1,113 1,209 1,087 1,098 36,317,000 1,098 7 07/03 1,096 1,128 1,020 1,124 23,988,000 1,124 8 07/02 1,098 1,147 1,020 1,105 28,609,000 1,105 9 07/01 1,100 1,158 1,078 1,082 17,808,000 1,082 このような表で マクロ記録開始 セルA3をクリック データ→並び替え 優先されるキー:日付・昇順 データ範囲の先頭行:タイトル行 マクロ記録終了 で、できたマクロが Sub Macro1() Range("A3").Select Range("A1:G9").Sort Key1:=Range("A3"), Order1:=xlAscending,Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 1行目、2行目の(株)カネカ、日付、始値…、が8行目、9行目になってしまいます そこで、マクロの Range("A1:G9")を Range("A3:G9")に書き換えて Sub Macro2() Range("A3").Select Range("A3:G9").Sort Key1:=Range("A3"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 日付が、07/07、07/01、07/02、07/03、07/04、07/05、07/06 の順番になってしまいます どうしたらよいのでしょう?

  • VBA ファイルを読み込む際のSortメソッドの使い方

    tabで区切られたテキストファイルを読み込み、日時の列を昇順で並び替える処理をしようとしました。 sortメソッドを使って並び変えようとしましたが、上手くいきません。。 既に開いているエクセル上では簡単なsortメソッドを使って並び替えはできました。↓のようなマクロ記録を使って。 Range("A1:A11").Select Range("A1:C11").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin,DataOption1:=xlSortNormal ファイルを読み込んで、sortメソッドを使うには何か特別な方法があるのでしょうか?どなたか教えて下さい。よろしくお願いします。

  • VBAでのエラー(新しいマクロの記録)

    新しいマクロの記録で、work1にてソート等を行って、 新しいマクロ(ソート等)を作成しました。 このマクロは単体で正常に動作するのですが、 sheet1の別のマクロにカット&ペーストで追加し、 動作させたところエラーになってしまいました。 パス的な問題だと思いますが、いまいち理解できません。 以下、ソートの中身 Sheets("work1").Select Columns("A:H").Select Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range("C2") _ , Order2:=xlAscending, Key3:=Range("F2"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _ xlSortNormal, DataOption3:=xlSortNormal

  • エクセル2010マクロについて教えてください!

    パソコンが代わってEXCEL2003から2010に代わってしまい今までできていたマクロができなくなってしまいました。 小規模な会社なので私だけしかEXCELを使る人がいなく、困っています。 2003の内容を表示しますので、誰か教えてください。 エラー1004 RangeクラスのSortメソッドが失敗 ActiveSheet.PivotTables("ピボットテーブル1").PivotSelect "花[すべて]", xlLabelOnly lection.Sort Order1:=xlAscending, Type:=xlSortLabels, OrderCustom:=1, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin 誰か助けてください。 よろしく御願いします。

  • エクセルのVBAソートについて

    はじめましてm(__)m 昇順ソートで「0」を覗いてソートをかける方法をお教え頂けないでしょうか? 現在、下記方法でソートしております。 どうぞ宜しくお願い致します。 Sub J列目() Range("A9:L65536").Sort _ Key1:=Range("J9") _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub

専門家に質問してみよう