[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『実行時エラー1004』(紅天使)
実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです。
Set cell=.Cells(Rows.Count, 3)←黄色
↑
Rows.Count=1048576と表示されます。
シート(ws)の指定が必要かと思いまして
Set cell=ws.Cells(Rows.Count, 3)
としてみたり
Set cell=.Cells(Rows.Count, 3).End(xlUp)
としてみたけどエラーとなりました。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
とりあえず、Cellsの前にピリオドが付いているということは、With文でシートを指定しているはず。 そうならば、Rowsの前にもピリオドを付けましょう。 省略するとActiveSheetを参照するので、指定したシートのCellsと違うシートのRowsとなって、別親参照はできないため、エラーになりますよ。
(???) 2020/01/24(金) 09:37
全体を見ないとわかりませんが、
Sub 実験01() Dim cell As Range With ActiveSheet Set cell = .Cells(Rows.Count, 3) End With Debug.Print cell.Address(0, 0) End Sub
で問題なく動作しますね。
Withステートメントに何を指定しているか
Cellはどのように定義しているのか
wsは何が代入されているのか
等を調べてみてはどうでしょうか?
(もこな2) 2020/01/24(金) 09:47
>別親参照はできないため、エラーになりますよ。 この場合は別シートの最大行数(数値)をCellsに渡しているのでエラーにはならないと思うが。 A.Ranege(B.Cells(〜),B.Cells(〜)) のようにシートが異なるセルそのものを与えるとエラーだが。 (ねむねむ) 2020/01/24(金) 09:57
エラーになるパターンを具体にあげればこんな場合
With Range("A2:A10") Set Cell = .Cells(Rows.Count, 3) End With
最大行数を超えたセルが指定されちゃう。
Withに何が指定されているかが重要 (´・ω・`) 2020/01/24(金) 10:03
もう一回確認、指摘のとおりWithのシートではなくて
ActiveSheetを参照してました
Set cell=.Cells(.Rows.Count, 3)
↑
Rowsの前にピリオドに修正しました
他も教えてもらえますか??
自己学習で最終行の4行目取得できるか脱線してやってみました
Set cell = .Cells(.Rows.Count, 3).End(xlUp).Row + 4
↑
としてみたけどダメでした
Set cell = .Cells(.Rows.Count+4, 3)
↑
これもダメでした
(紅天使) 2020/01/24(金) 10:22
cellの型宣言と、With文を書いてください。
CellsとRows、両方にActiveSheetを付けるとどうなりますか?
(???) 2020/01/24(金) 10:30
Withステートメントで対象にしているシートが所属するブックがxls形式
アクティブシートが所属するブックがxlsx形式
だったりすると、最大行が65536のブックに対して、1048576行目を指定することになり、???さんが指摘されているようなエラーが生じます。
よって、個人的には極力「WS.Cells(WS.Rows.Count, 3)」のように、Withステートメントを使わなくても、対象シートの辻褄は合わせた方がミスが置きにくいと思います。
■2
>Set cell = .Cells(.Rows.Count, 3).End(xlUp).Row + 4
>↑
>としてみたけどダメでした
そりゃダメです。
「Cells(.Rows.Count, 3).End(xlUp).Row + 4」で返ってくるのは【数値】です。
setするものではありません。
結局なにを取得したいのかが肝です。(だから「Cellはどのように定義しているのか」って言ってます)
Sub 実験2() Dim セル As Range Dim 行番号 As Long
With ActiveSheet Set セル = .Cells(.Rows.Count, 3).End(xlUp).Offset(4) 行番号 = Cells(.Rows.Count, 3).End(xlUp).Row + 4 End With
Debug.Print "取得したセルのアドレスは " & セル.Address(0, 0) Debug.Print "取得した行番号は " & 行番号
End Sub
■3
ちなみに、落ち着いて考えればわかるとおもいますが
Set cell = ActiveSheet.Cells(ActiveSheet.Rows.Count+4, 3)
↑みたいにした場合、C列の1048576+4行目となり、最大行を超えているのでそんなセル無いって怒られますね。
(もこな2) 2020/01/24(金) 10:53
横から失礼します。
(´・ω・`)さんが指摘されているように、 With Range("A2:A10") Set Cell = .Cells(Rows.Count, 3) End With ではエラーになります。
そこがポイントなのに、 | 構文は社外持出禁止でごめんなさい | 似たものが探せませんでした という回答は無いんじゃないですか?
With ○○ の○○がワークシートなのか、セル範囲なのか がポイントです。 それなのに、持ち出せないとか何とか、ヘチマなことを言っている。(どうやら死語のようだが)
一字一句同じものを示せというのではなく、 ワークシートなのか、 セル範囲なのか、 を確認しているのに、それすら回答できませんか?
似たものって WorksheetオブジェクトもRangeオブジェクトは使ったことが無いんですか?
セル範囲としたら、1行目が含まれていなければエラーになるわけだが、 その点、どうですか?
(γ) 2020/01/24(金) 12:38
再度確認、Withは同じブックのシートSet wsを参照してました
が、自分の参照したいシートはSet whでした
Set cell=wh.Cells(wh.Rows.Count, 3)
↑
と直すと、エラー出なくなりました
あれっ、でも
Set cell=.Cells(.Rows.Count, 3)
↑
これでもエラーでないのは何でだろ??
>■2
定義はDim cell As Rangeでした
セルを取得ってことですね
だから最終行の4行目取得するときは
↓
Set cell = .Cells(.Rows.Count, 3).End(xlUp).Offset(4)
>■3
あ〜ほんとだ
最大値に足してもダメですね(恥)
■2、■3と脱線に付き合ってくれて感謝します
>セル範囲としたら、1行目が含まれていなければエラーになるわけだが、
>その点、どうですか?
定義はDim cell As Rangeです
With wsです
↑
wsはSet wsで特定のシートを指定してます
(紅天使) 2020/01/24(金) 15:38
ws があるブックが旧バージョンのブック(xls)なんでしょうね。たぶん Rows.Count は Application.Rows.Count か 新しい形式のブック(xlsx)の ActiveSheet.Rows.Count になのでしょう。たぶん 確定情報が与えられないので、たぶんとしか言えないですが。 (´・ω・`) 2020/01/24(金) 16:15
■5
>これでもエラーでないのは何でだろ??
Sub 実験03() Dim cell As Range '←オブジェクト型(Range型) Dim ws As Worksheet, wh As Worksheet '←オブジェクト型(Worksheet型) Set ws = ThisWorkbook.Worksheets("Sheet1") Set wh = ThisWorkbook.Worksheets("Sheet2")
ws.Activate
Set cell = wh.Cells(wh.Rows.Count, 3) '←OK With wh Set cell = .Cells(.Rows.Count, 3) '←OK End With
End Sub
「With wh」ですから展開すると↓になりますよね?
Set cell = wh.Cells(wh.Rows.Count, 3)
したがって、全く同じですからエラーにならなくて当たり前です。
■6
で、本当に↓がエラーになるんですか?
Sub 実験04() Dim cell As Range Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet2")
ThisWorkbook.Activate Worksheets("Sheet1").Activate
With ws Set cell = .Cells(Rows.Count, 3) End With
End Sub
ちょっと俄には信じられないので、どうしても、wsにセル範囲が格納されていたとか、65536行目までしか無いブックのシートを指定していたとかしか思えないです。
もしかしたらワークシートじゃないシートがアクティブだったとか?
(もこな2) 2020/01/24(金) 16:37
Dim ws As Worksheet
Set ws = Worksheets("A") ↑ wsはこうなってます すごく長い構文でwhはかなり前に ↓ Dim wh As Worksheet
Set wh = Worksheets("B") ↑ となってます
Withはwhでなくwsです
でもSet cell = .Cells(.Rows.Count, 3)でも問題ありませんでした
>■5
実験02、03、04はエラーありません
全部構文のせれたらいいんだけど
エラーは他の構文が影響してたりしますか?
With ws.UsedRange If 条件 Then .Clear Set cell = .Cells(1) Else Set cell = .Cells(.Rows.Count, 3) End If End With
>■6
>もしかしたらワークシートじゃないシートがアクティブだったとか?
そうなんですかね
同じブックでないものは確かに開いてました
(紅天使) 2020/01/24(金) 18:07
問題は、そこじゃなくて
ActiveSheet.Rows.Count 何らかのシートオブジェクト.Rows.Count
が一致してないならエラーになることもあるってことだけです。
極端な話「ws」と「wh」が別ブックのシートだとしても、65536行しかないブックに対して、1048576行目の操作をするような命令になってなければ問題はでないです。
したがって、1048576行目まであるブックに65536行目の操作を命令しても問題にはなりません。(撤退するので返答は要りません)
(もこな2) 2020/01/24(金) 19:05
>同じブックでないものは確かに開いてました
それぞれのブックの最大行数が違っていたのでしょうね。
ファイルの拡張子が違うと最大行数も違うのです。
普段から拡張子を表示しない設定にしていたらなかなか気づかないところです。
(佳) 2020/01/25(土) 12:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.