プロが教える店舗&オフィスのセキュリティ対策術

*** ソース ***
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 にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。

よい方法をご存知の方がいましたら、ご教授下さい。

A 回答 (6件)

>どのような検索ワードを使えばいいでしょうか?



1回目「vba sort 引数」
等で、適当に読んでから
2回目「vba sort Header」

>的確なページが出てこないんですが、

上記でも「Excel Selection.Sort Header」と結果は大差ないかと思いますが、幾つかのページを拾い読みしながら、的確なキーワードを設定していくしか無いでしょう。

http://t_shun.at.infoseek.co.jp/My_Page/Excel-VB …

http://q.hatena.ne.jp/1087187790
http://t_shun.at.infoseek.co.jp/My_Page/Excel-VB …

Selection.Sort は用例の一つなので、Range("A1:Z100").sort などの使い方もあり、Sort メソッドのみで検索する方が良いと思います。
    • good
    • 0
この回答へのお礼

度々の回答ありがとうございます。

「Excel VBA Sort Header」に検索ワードを変えた所、的確なページを数件見つける事ができました。
ここまでシビアに検索ワードを指定しなくてもヒットするかと思っていたので、考えが甘かったようです。

参考サイトの掲示ありがとうございました。

お礼日時:2006/03/14 13:16

ついでなので、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キーで「オブジェクトブラウザ」を呼び出し、仕様が知りたい単語を双眼鏡の左に入力して双眼鏡を押して見て下さい。上記に書いた位の簡易的な説明が呼び出せます。
    • good
    • 0

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さんの説明通りだとすれば、今回の件は発現しなかったはずなのです。

補足日時:2006/03/14 12:45
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

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

VBでプログラムを組んだ事はほとんどないのですが、できればExcelマクロで自動記録されたソースのまま使いたいです。(^^;

VBAなので変数を宣言したり、For文で繰り返したりも可能なのですね。
こういう使い方もできるのだと勉強になりました。

お礼日時:2006/03/14 12:06

ご記述のコードの一部に"Header:=xlGuess"という部分があります。


その"xlGuess"を"xlYes"にして実行してみたらいかがでしょうか。

この回答への補足

回答ありがとうございます。

No.1の回答者の補足にも書きましたが、詳細を教えて頂けると助かります。

xlYes がタイトル行指定で、xlNo がデータ指定となるのでしょうか?
Header:= に入るのは xlGuess , xlYes , xlNo の3種類でいいのでしょうか?

補足日時:2006/03/14 11:58
    • good
    • 0

>変数を説明している一覧などが見つからなかった為、試していません。



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 がデータなのでしょうか?

補足日時:2006/03/14 11:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A