[[20081203013021]] 『コマンドボタンクリック時にソートを使った並べ替』(海人) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コマンドボタンクリック時にソートを使った並べ替え』(海人)

シート「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 _ 以降でのエラーの様です。


1.HELPには、

 「オブジェクト修飾子 (ピリオドの左側に記述するオブジェクト) を指定せずに使った場合、

 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.