[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドボタンクリック時にソートを使った並べ替え』(海人)
シート「HISTORYmst」内に作成したコマンドボタンをクリック時にソートを行い、
KEY1をB列昇順に、KEY2をA列降順にうまく動作しているのですが、別シートの
「GUESTdecision」で作成したコマンドボタンからシート「HISTORYmst」を同様の
ソートを行いたいのですがうまく動作しません。
違いはSheets("HISTORYmst").Selectを挿入し、ソート前に対象のシートを
選択しているだけなのですが…
以下は上手く動作している、同シート内に作成したコマンドボタン分です。
Private Sub CommandButton1_Click()
Dim lRow As Long Dim lCol As Long Dim myRng As Range With Worksheets("HISTORYmst") lRow = Cells(Rows.Count, 1).End(xlUp).Row lCol = Cells(1, Columns.Count).End(xlToLeft).Column Set myRng = Range(Cells(1, 1), Cells(lRow, lCol)) myRng.sort _ Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range( _ "A2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _ xlSortNormal, DataOption2:=xlSortNormal End With End Sub
エラー内容
実行時エラー'1004';
並べ替えの参照が正しくありません。並べ替えるデータ内にあることと[最優先される
キー]ボックスが空白でないことを確認してください。
お知恵、拝借頂けますでしょうか?
よろしくお願い致します。
[エクセルのバージョン]
Excel2002
[OSのバージョン]
WindowsXP
Private Sub historymstsort_Click()
Sheets("HISTORYmst").Select ←ここを追加 Dim lRow As Long Dim lCol As Long Dim myRng As Range With Worksheets("HISTORYmst") lRow = Cells(Rows.Count, 1).End(xlUp).Row lCol = Cells(1, Columns.Count).End(xlToLeft).Column Set myRng = Range(Cells(1, 1), Cells(lRow, lCol)) myRng.sort _ Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range( _ "A2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _ xlSortNormal, DataOption2:=xlSortNormal End With End Sub
デバッグでは myRng.sort _ 以降でのエラーの様です。
「オブジェクト修飾子 (ピリオドの左側に記述するオブジェクト) を指定せずに使った場合、
Range プロパティは作業中のワークシートのセル範囲を返します。」
と記述されています。(Excel2002のHelpで確認しています)。
が、海人さんが投稿された正常に作動するコード、エラーが発生するコードのいずれも それぞれのシートモジュールに記述されていますよね?
2. シートモジュール内では、
「オブジェクト修飾子 (ピリオドの左側に記述するオブジェクト) を指定せずに使った場合、
Range プロパティは、コードが記述されているモジュールに対応するシート上ののセル範囲を返します。」
↑は、Cellsプロパティでも同じことが言えます。
以下のコードは、シート名「HISTORYmst」のシートモジュールに記述されたコードではなく、 別のシート「GUESTdecision」のシートモジュールに記述されたコードですよね? 上記の「2」と照らし合わせると・・・、
Private Sub historymstsort_Click()
Sheets("HISTORYmst").Select ←ここを追加 Dim lRow As Long Dim lCol As Long Dim myRng As Range With Worksheets("HISTORYmst") lRow = Cells(Rows.Count, 1).End(xlUp).Row ' Cells(Rows.Count, 1)は、シート「GUESTdecision」のセルです lCol = Cells(1, Columns.Count).End(xlToLeft).Column ' Cells(1, Columns.Count) これもシート「GUESTdecision」のセルです Set myRng = Range(Cells(1, 1), Cells(lRow, lCol)) ' ↑これもシート「GUESTdecision」のセル範囲です myRng.sort _ Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range( _ "A2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _ xlSortNormal, DataOption2:=xlSortNormal ' よって、↑は、シート「GUESTdecision」のセル範囲をソートしようとしているのです End With End Sub
「並べ替えの参照が正しくありません。並べ替えるデータ内にあることと[最優先されるキー]ボックスが空白でないことを確認してください。 」
シート「GUESTdecision」は、このエラーメッセージが納得いくようなシートではないですか?
シートモジュールに内で、他のシートのセル範囲を参照する場合は、親オブジェクトである ワークシートオブジェクトの指定をきちんとしなければなりません。
With ステートメントでWorksheets("HISTORYmst")をアドレッシングしているので その準備はされているのですから・・・、
Private Sub historymstsort_Click() Dim lRow As Long Dim lCol As Long Dim myRng As Range With Worksheets("HISTORYmst") lRow = .Cells(.Rows.Count, 1).End(xlUp).Row lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column Set myRng = .Range(.Cells(1, 1), .Cells(lRow, lCol)) myRng.sort _ Key1:=.Range("B2"), Order1:=xlAscending, Key2:=.Range( _ "A2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:= _ xlSortNormal, DataOption2:=xlSortNormal .select End With End Sub
こんなコードでいかがですか?
シート「HISTORYmst」にあるコードもそのまま残す仕様なら、他にも簡単な記述がありますが、 それはまたの機会に・・・。
ichinose
ご指摘の通りです。たいへん勉強になりました。
さっそく修正してみたところ思い通りに動いてくれました。
ありがとうございます。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.