• 締切済み

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命令はこのような使い方はできないのでしょうか? 分かりにくい説明ですみませんが、よろしくお願いします。

みんなの回答

  • sakenomo
  • ベストアンサー率52% (35/67)
回答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

Hna-kao
質問者

お礼

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

  • sakenomo
  • ベストアンサー率52% (35/67)
回答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

Hna-kao
質問者

補足

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

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.1

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

Hna-kao
質問者

補足

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

関連するQ&A