

*** ソース ***
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 にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。
よい方法をご存知の方がいましたら、ご教授下さい。
No.5ベストアンサー
- 回答日時:
>どのような検索ワードを使えばいいでしょうか?
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 メソッドのみで検索する方が良いと思います。
度々の回答ありがとうございます。
「Excel VBA Sort Header」に検索ワードを変えた所、的確なページを数件見つける事ができました。
ここまでシビアに検索ワードを指定しなくてもヒットするかと思っていたので、考えが甘かったようです。
参考サイトの掲示ありがとうございました。
No.6
- 回答日時:
ついでなので、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キーで「オブジェクトブラウザ」を呼び出し、仕様が知りたい単語を双眼鏡の左に入力して双眼鏡を押して見て下さい。上記に書いた位の簡易的な説明が呼び出せます。
No.4
- 回答日時:
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さんの説明通りだとすれば、今回の件は発現しなかったはずなのです。
No.3
- 回答日時:
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文で繰り返したりも可能なのですね。
こういう使い方もできるのだと勉強になりました。
No.1
- 回答日時:
>変数を説明している一覧などが見つからなかった為、試していません。
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 がデータなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Visual Basic(VBA) Excel_マクロ_現在開いているシートにマクロを実行したいです 1 2023/02/14 23:54
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) Excelのマクロ ブック間である範囲をコピー Workbooks(“a.xlsx“).Sheets 3 2022/05/12 17:02
- Visual Basic(VBA) マクロを短くする 1 2023/01/15 00:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
【エクセル】区切り位置で分割...
-
エクセル、正数のみの集計[(負...
-
更新前と更新後の差分をVBAを使...
-
Excel関数:「0」を除いた標準...
-
Excel関数で、範囲内の最後のセ...
-
値の入っているセルのうち、一...
-
SUMIFで数値が入力されているセ...
-
Excelのマクロで行を間引きたい
-
ピボットテーブル 0個の行を...
-
《エクセル2000》重複している...
-
エクセルで何種類のデータがあ...
-
エクセル 8ケタの数字から日数...
-
日付の数を月ごとにカウントし...
-
Excelで複数列かつ複数行分の一...
-
EXCEL 売上予測の求め方
-
エクセルで電話番号を - で分...
-
Excel VBA で、2行1単位のデー...
-
エクセルの最小値抽出方法について
-
あるexcel表からチェックボック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
【エクセル】区切り位置で分割...
-
更新前と更新後の差分をVBAを使...
-
Excel関数:「0」を除いた標準...
-
SUMIFで数値が入力されているセ...
-
値の入っているセルのうち、一...
-
Excel関数で、範囲内の最後のセ...
-
ピボットテーブル 0個の行を...
-
エクセル、正数のみの集計[(負...
-
エクセルに入力された日付「S40...
-
入力するとかってにセルの色が...
-
《エクセル2000》重複している...
-
エクセル 8ケタの数字から日数...
-
エクセルで何種類のデータがあ...
-
SUMPRODUCT関数 行が増えても...
-
Excelのマクロで行を間引きたい
-
複数の候補列から、検索値と一...
-
エクセルVBAを使ってセルに日付...
-
エクセルで電話番号を - で分...
-
Excelで複数列かつ複数行分の一...
おすすめ情報