[[20180220235541]] 『オブジェクトエラーについて』(five-o) ページの最後に飛ぶ

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

 

『オブジェクトエラーについて』(five-o)

教えてください
下記の部分でオブジェクトエラーが出て困っていますどこが間違ってるのでしょうか?

    Call .Range(Cells(i, 3), Cells(i + 1, Columns.Count).End(xlToLeft)).Sort(Key1:=.Range(Cells(i, 3)), Order1:=xlAscending, Orientation:=xlSortRows)

Sub ソート()
'
Dim i As Long

    For i = 89 To 112 Step 2
    With ActiveSheet
    Call .Range(Cells(i, 3), Cells(i + 1, Columns.Count).End(xlToLeft)).Sort(Key1:=.Range(Cells(i, 3)), Order1:=xlAscending, Orientation:=xlSortRows)
    End With
    Next i

End Sub

宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 > .Range(Cells(i, 3), Cells(i + 1, Columns.Count).
     ↑     ↑      ↑
   ➀   ➁            ➂

 1のRangeは、どこのシートか書いてある
 2、3のCellsには、書いて無いのでどこのシートか解らない。

 最近では珍しい?久しぶりに見た、何のためか解らない Call。
 なんで????

 >:=.Range(Cells(i, 3))
             ↑
 これも上と同じだけど Cells(i, 3) の中に何が入っているんですか?
 ひょっとして、
 :=.Cells(i, 3),
 これ?

(BJ) 2018/02/21(水) 01:10


 > 最近では珍しい?久しぶりに見た、何のためか解らない Call。
 > なんで????

 珍しいかも知れないですが、メソッドを呼び出すんですから、
 Callを使うことにそこまで不思議に思わないですけど(私は)。

(半平太) 2018/02/21(水) 07:51


 >メソッドを呼び出すんですから、
 >Callを使うことにそこまで不思議に思わないですけど(私は)。

 そういうもんなんですか。
 知りませんでした。
 今まで調べようともしなかったけれど、
 ありがとうございました。
(BJ) 2018/02/21(水) 08:33

(メソッド呼び出すのにCall付けるってルールあったのか、、、知らなかった)
スマホからなので試せないですけど、With ActiveSheet ってしてるから、標準モジュールに書いているなら、Cells(i, 3)でも、.Cells(i, 3)でも同じになるような気がします。

2行ごとにC列の値をキーに並び替えって
って読んだのですが、なにやりたいんですかね?
(Sortメソッドの引数が正しいのかは、検証してないですが。
(もこな2) 2018/02/21(水) 08:52


 >標準モジュールに書いているなら、Cells(i, 3)でも、.Cells(i, 3)でも同じになるような気がします。 

 97の時は、エラーになったと思うので、そういうのを否定したくなるんです。
 97以降(2000以降?)で、たまたま?ActiveSheetだから、通るみたいですが。
 後々のためにもしっかり書き方を覚えた方がいいんじゃないかと。
(BJ) 2018/02/21(水) 09:14

PCの前にもどりました。
私もActive○〇に対する操作という記述は好みじゃ無いですし、BJさんの仰る書き方〜はその通りだとおもいます。

とりあえず、
 ループの中に「With ActiveSheet」いれちゃうと同じこと何度もするので、ループ外へ出す。
 省略してActive○〇に対する操作という記述にしない(withステートメント使ってるんだから.を忘れない)
 Valueプロパティもちゃんと記述する。
という趣味を前面に押し出してSample作ろうとして、いろいろしらべてたら。。。

【引用元】http://officetanaka.net/excel/vba/tips/tips148.htm
>セルを並べ替えるとき、Excel 2003まではRangeオブジェクトのSortメソッドを使いました。
>Excel 2007では、新しくSortオブジェクトが新設されました。
>また、Sortオブジェクト内にSortFieldオブジェクトというのもあります。
>ザックリ言うと、Sortオブジェクトは「並べ替えに関する」オブジェクトで、
>SortFieldオブジェクトは「並べ替えの条件に関する」オブジェクトです。手順としては、
>1.まず、並べ替えの条件を指定する → SortFieldオブジェクト
>2.次に、その条件で並べ替えを実行する → Sortオブジェクト

ってことなので、記述自体が、Excel 2003までのものになってるってことじゃないでしょうか。

引用元にはRangeオブジェクトのSortメソッドが使えないとは書いてないですし、手元に実データがないからテストしておらず、sortメソッドで記述すると実際にエラーになるかわからないですけど、とりあえず、SortFieldオブジェクト、Sortオブジェクトの操作をするように記述を修正してみては如何でしょうか?

(もこな2) 2018/02/21(水) 10:31


エラーの直接原因は、親オブジェクトを明示しなかったためのようですし、それを解決しても、Excelバージョンが変わったので古いコードでは通らないという壁に突き当たりそうですね。

元データが判らないので試していませんが、こんな感じになるでしょう。

 Sub ソート()
    Dim i As Long

    With ActiveSheet
        For i = 89 To 112 Step 2
            .Sort.SortFields.Clear
            .Sort.SortFields.Add Key:=.Cells(i, 3), SortOn:=xlSortOnValues, Order:=xlAscending
            .Sort.SetRange .Range(.Cells(i, 3), .Cells(i + 1, .Columns.Count).End(xlToLeft))
            .Sort.Orientation = xlLeftToRight
            .Sort.Apply
        Next i
    End With
 End Sub
(???) 2018/02/21(水) 11:09

 何か、展開が読めないんですけど、

 エラーの原因は、BJさんの書き込みで明らかになっていると思っているんですけど。

 > >:=.Range(Cells(i, 3))
 >             ↑
 > これも上と同じだけど Cells(i, 3) の中に何が入っているんですか?
 > ひょっとして、
 > :=.Cells(i, 3),
 > これ?

 こういう書き方は無いです。(第2引数があれば別ですけど)
    ↓
 Range(Cells(i, 3))

 ※Cells(i, 3).Value にアドレス情報が入っている時は例外的に成立します。(例:"A1" とか "Z3" とか)
 ※・・と言ってもエラーにならないだけで、意図とは違った結果ですよね?

     強いてやればこうですけど
            ↓  
 Range(Cells(i, 3).Address) 、それは単に Cells(i, 3) と同じです。

 >RangeオブジェクトのSortメソッドが使えないとは書いてないですし
   Sortメソッドは、XL2007以降も問題なく使えます。
   Sortオブジェクトに慣れるまで、ずーっと私は使っていました。

(半平太) 2018/02/21(水) 11:13


あ?、元の命令のままでも使えますね。 親オブジェクトを書いていない数カ所のドットを正すだけで動きました。 Sortメソッドって、消されていなかったんですね!
(???) 2018/02/21(水) 11:22

トピックと関連が薄い内容の書き込みを[[20180221163017]]に移設しました。
(もこな2) 2018/02/21(水) 16:40

>下記の部分でオブジェクトエラーが出て困っていますどこが間違ってるのでしょうか?

すでに回答は出てますが、話しが広がり過ぎて問題がどこなのかが分かり難いと思うので、、、、

>.Range(Cells(i, 3), Cells(i + 1, Columns.Count).End(xlToLeft))
↑と同じように、

>.Range(Cells(i, 3))
↑ここも盲目的に書かれたんだと思いますが、
2つ目の引数がない(基本的には左上と右下とを指定する)ので
操作対象となるオブジェクトとしてエクセル君が理解できないよ。
というエラーだと思います。
※Rangeプロパティのヘルプ参照のこと
参考URL>>
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheet-range-property-excel

エラーメッセージが、
もう少しわかりやすく言ってくれるとありがたいですよね^^;
でも、この辺は慣れるしかないです><

ただ、今回の件の場合、

「操作対象のセル範囲に対して、並び替え キーとなる行:=その1行目」

と書きたいので、
「その」の部分をWithで括ってあげると文章が読みやすくなると思います。

Sub ソート2()

    '
    Dim i As Long
    Const n As Long = 2

    With ActiveSheet
        For i = 89 To 112 Step n
            With .Range(.Cells(i, 1), .Cells(i, .Columns.Count).End(xlToLeft)).Resize(n)
                .Sort Key1:=.Rows(1)
            End With
        Next
    End With
End Sub

※今のままだと横にスクロールしないと読めない><
(まっつわん) 2018/02/21(水) 14:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.