[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オブジェクトエラーについて』(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
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
とりあえず、
ループの中に「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
元データが判らないので試していませんが、こんな感じになるでしょう。
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
すでに回答は出てますが、話しが広がり過ぎて問題がどこなのかが分かり難いと思うので、、、、
>.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.