- ベストアンサー
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 にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。 よい方法をご存知の方がいましたら、ご教授下さい。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>どのような検索ワードを使えばいいでしょうか? 1回目「vba sort 引数」 等で、適当に読んでから 2回目「vba sort Header」 >的確なページが出てこないんですが、 上記でも「Excel Selection.Sort Header」と結果は大差ないかと思いますが、幾つかのページを拾い読みしながら、的確なキーワードを設定していくしか無いでしょう。 http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page19.htm http://q.hatena.ne.jp/1087187790 http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_menu.htm Selection.Sort は用例の一つなので、Range("A1:Z100").sort などの使い方もあり、Sort メソッドのみで検索する方が良いと思います。
その他の回答 (5)
- chie65536
- ベストアンサー率41% (2512/6032)
ついでなので、Sortメソッドの仕様も書いておきます。 Function Sort([Key1], [Order1 As XlSortOrder = xlAscending], [Key2], [Type], [Order2 As XlSortOrder = xlAscending], [Key3], [Order3 As XlSortOrder = xlAscending], [Header As XlYesNoGuess = xlNo], [OrderCustom], [MatchCase], [Orientation As XlSortOrientation = xlSortRows], [SortMethod As XlSortMethod = xlPinYin]) 上記の「Order1 As XlSortOrder = xlAscending」は「Oder1はXlSortOrder型のパラメータで省略時はxlAscending」と言う意味です。 さらについでに、XlYesNoGuess型の仕様も。 Enum XlYesNoGuess xlGuess = 0 xlYes = 1 xlNo = 2 End Enum SortメソッドのHeaderパラメータは「Header As XlYesNoGuess = xlNo」ですので「XlYesNoGuess型のパラメータで省略時はxlNo」となります。 つまり、Headerは「列挙型XlYesNoGuessのメンバ、xlGuess、xlYes、xlNoのいずれかを指定可能」となります。 なお、ヘルプファイルがインストールされて居ない場合(Excel2000以降のOfficeに限りますが)Visual Basic Editorの画面でF2キーで「オブジェクトブラウザ」を呼び出し、仕様が知りたい単語を双眼鏡の左に入力して双眼鏡を押して見て下さい。上記に書いた位の簡易的な説明が呼び出せます。
- chie65536
- ベストアンサー率41% (2512/6032)
Headerパラメータの意味と動作は以下の通りです。 ・Header:=xlNo 現在のセレクト範囲の先頭行をデータに含め、Key1、Key2、Key3パラメータの行位置は参照しない。 ・Header:=xlYes 現在のセレクト範囲の先頭行をタイトルとしてデータから除外し、Key1、Key2、Key3パラメータの行位置は参照しない。 ・Header:=xlGuess 現在のセレクト範囲の先頭行と、Key1、Key2、Key3パラメータの行位置を比較し、同じ行であれば先頭行をデータに含め、違う行であれば先頭行をタイトルとしてデータから除外する。 Header:=xlGuessを指定した時の動作の例は以下の通りです。 ・範囲の先頭をタイトル行にする 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 Header:=xlGuessで、選択範囲の先頭がB2で「2」、キー位置がC3及びI3で「3」、結果「2≠3」で先頭行がタイトルとなる。 ・範囲の先頭をデータに含める Range("B2:K49").Select Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("I2") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Header:=xlGuessで、選択範囲の先頭がB2で「2」、キー位置がC2及びI2で「2」、結果「2=2」で先頭行がデータとなる。 マクロのコードを良く見て、HeaderにxlGuessを指定していて、Range([範囲]).Selectの先頭行の行番号と、Key1、Key2、Key3の行番号が「同じ行番号」になっていないか、確認してみましょう。
補足
回答ありがとうございます。 3種類のパラメータの説明ありがとうございました。 しかし xlGuess の挙動説明について少々納得できません。 質問文に挙げましたように Header:=xlGuess を指定しているものの、同じ行を指定しているものは1つもありません。 抜粋して記載してありますが、このソートマクロは全て先頭行と同一になる Key は指定していません。 にも関わらず、先頭行をタイトルとは扱わずデータとして処理するシートがあります。 chie65536さんの説明通りだとすれば、今回の件は発現しなかったはずなのです。
Excelは、一度も操作したことがない門外漢ですが、ソースの書き方が気になりました。 そこで、少し、手を入れてみました。 修正は、コードスタイルだけです! ルーチンはそのままです。 Private Sub CommandButton1_Click() Dim I As Integer Dim strSheet As String For I = 1 To 3 strSheet = "Sheet" & Trim(Str$(I)) With Worksheets(strSheet) .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 End With Next I End Sub
お礼
アドバイスありがとうございます。 VBでプログラムを組んだ事はほとんどないのですが、できればExcelマクロで自動記録されたソースのまま使いたいです。(^^; VBAなので変数を宣言したり、For文で繰り返したりも可能なのですね。 こういう使い方もできるのだと勉強になりました。
- galoon
- ベストアンサー率28% (38/133)
ご記述のコードの一部に"Header:=xlGuess"という部分があります。 その"xlGuess"を"xlYes"にして実行してみたらいかがでしょうか。
補足
回答ありがとうございます。 No.1の回答者の補足にも書きましたが、詳細を教えて頂けると助かります。 xlYes がタイトル行指定で、xlNo がデータ指定となるのでしょうか? Header:= に入るのは xlGuess , xlYes , xlNo の3種類でいいのでしょうか?
- hana-hana3
- ベストアンサー率31% (4940/15541)
>変数を説明している一覧などが見つからなかった為、試していません。 Selection.Sort の Sort にカーソルを置いて、[F1] キーでヘルプが出ますし、ネットでも解説が沢山あります。 xlGuess と指定すると自動判別になります。
補足
回答ありがとうございます。 C:\Program Files\Microsoft Office\Office\VBAXL8.HLP ファイルが見つかりません。 ヘルプファイルって容量節約の為にインストールしない所が多いですよね。 初めに書いておけば良かったのですが、企業のPCなのでヘルプファイルが入っていないのです。 Googleで「Excel Selection.Sort Header」の単語で検索掛けても的確なページが出てこないんですが、どのような検索ワードを使えばいいでしょうか? 他にも「Excel 並べ替え マクロ」「Excel ソート マクロ」...etc で検索掛けましたが、ヘルプファイルがあるからなのか詳しい解説は見つかりませんでした。 xlGuessは自動判別なのですね。 では xlYes がタイトル行で、xlNo がデータなのでしょうか?
お礼
度々の回答ありがとうございます。 「Excel VBA Sort Header」に検索ワードを変えた所、的確なページを数件見つける事ができました。 ここまでシビアに検索ワードを指定しなくてもヒットするかと思っていたので、考えが甘かったようです。 参考サイトの掲示ありがとうございました。