[[20200124092032]] 『実行時エラー1004』(紅天使) ページの最後に飛ぶ

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

 

『実行時エラー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 >


エラー箇所だけでなく、変数宣言やWith文を省略せずに貼ってください。

とりあえず、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


Rows.Countは、そのままでもActiveSheetの行数になるので、問題では無かったようです。すいません。

cellの型宣言と、With文を書いてください。
CellsとRows、両方にActiveSheetを付けるとどうなりますか?
(???) 2020/01/24(金) 10:30


■1
>もう一回確認、指摘のとおりWithのシートではなくてActiveSheetを参照してました。
いや、ねむねむさんがコメントされているとおり、Withステートメントで指定されているのが 【(同じブックの)シートオブジェクト】であれば
「Rows.Count」でも「.Rows.Count」で1048576が返るだけなので問題にはならないはずです。

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


>■1

再度確認、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

■4
どうしても肝心なところを隠したいんでしょうか・・・
>再度確認、Withは同じブックのシートSet wsを参照してました
>が、自分の参照したいシートはSet whでした
>wsはSet wsで特定のシートを指定してます
↑であれば、「ws」と「wh」が【何型で定義】されてて、【何が入ってる】んだって話です。
シート名を隠すにしても、Sheet1とかにすればいいじゃないですか。

■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


>■4

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.