質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

「実行時エラー424 オブジェクトが必要です」が出ます。

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 402

zendaman999

score 9

「実行時エラー424 オブジェクトが必要です」
と太字の部分に黄色い帯がかかって止まります。

Selection.Resize(, Selection.Column.count - 1).Select

調べたら

このエラーは、変数代入のコードをコピペしたときにSetを付け忘れて起こるケースが圧倒的に多いです。
そのため、エラーの箇所を確認したら、Setで代入していない処理がないかを確認するのがおすすめです。

ということみたいですが、setを付けられる場所がりません。
あとは、変数の宣言をしていない変数が存在する場合みたいなことも書いてありました。
イミディエイトウィンドウなるものも出してみましたが空欄でした。

どうしてでるのかわかりません。よろしくおねがいします。

Sub LightCount2() '7月21日

    Worksheets.Add(after:=Worksheets(Worksheets.count)).Name = "X"

    Dim i As Long
    For i = 2 To Sheets.count

        Sheets(Sheets(i).Name).Select '数字ではないシート名は対象外 
        Range("B20").CurrentRegion.Select 'B20の周りのデータが入ったセルを選択(A20:C20)
        **Selection.Resize(, Selection.Column.count - 1).Select '選択範囲をA20:B20に**
        Selection.Offset(0, 1).Select '選択範囲をB20:C20にする
        Selection.Copy '選択範囲のデータをコピー
        Worksheets("X").Range("A" & i).Select 'Xシートの"A2"を選択
     Selection.PasteSpecial xlPasteValues'形式を選択して貼り付け(値のみ)
    Next i
End Sub

(文字列ではない)1のシートのB20セルを選択
その周りにあるデータが入っているセルを拡張(A20:C20)
その一番右のセルの選択を解除、選択範囲を一つ右にずらす(B20:C20)
(B20:C20)をコピー、XシートのA2シートへ型式を選択して貼り付け(値のみ)

**というプロシージャになっていますでしょうか?**
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

Sheets(Sheets(i).Name).Select '数字ではないシート名は対象外 
だとシート名が数字以外の場合でも対象になってしまいますよね。
数字のシート名だけを対象にしたいなら、IsNumeric関数でチェックすべきだと思います。

あと、
Activate や Select を使用しない方法にしましょう。
Selectすると遅くなるだけでなく、コードが読みづらくなるし、想定外に選択箇所が変更されてエラーの原因になりやすいです。

コード例

Sub LightCount2()
    Dim wsX As Worksheet
    Set wsX = Worksheets.Add(after:=Worksheets(Worksheets.Count))
    wsX.Name = "X"

    Dim i As Long
    For i = 2 To Sheets.Count - 1
        With Worksheets(i)
            If IsNumeric(.Name) Then '数字ではないシート名は対象外
                Dim rng As Range
                Set rng = .Range("B20").CurrentRegion 'B20の周りのデータが入ったセル範囲
                Set rng = rng.Resize(, rng.Columns.Count - 1).Offset(0, 1)'セル範囲を変更
                wsX.Range("A" & i).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value '値の代入
            End If
        End With
    Next i
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 21:10

    書き換えていただきましたプロシージャで走らせたのですが、offsetの行で「アプリケーション定義またはオブジェクト定義エラーです」のMSGがでました。
    どこが違うのでしょう
    RaiseもErrorも使っていないのに何が原因ででるのでしょうか

    キャンセル

  • 2020/07/22 22:13

    考えられる可能性としては、
    B20セルの周りにデータがない(空欄)である、ということです。
    2列以上のデータがあるならエラーなく通ります。

    データがない場合は何もしないのなら、
    If rng.Columns.Count > 1 Then
    Set rng = rng.Resize(, rng.Columns.Count - 1).Offset(0, 1) 'セル範囲を変更
    wsX.Range("A" & i).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value '値の代入
    End If

    キャンセル

  • 2020/07/23 06:52

    hatena19様 回答ありがとうございます。

    仰るとおり、電球が交換されない日(空欄)のシートも作ってありました。
    IF文を追加していただいたので試してみます。

    キャンセル

+1

「実行時エラー424 オブジェクトが必要です」とならないよう、以下の修正が必要です。

Selection.Resize(, Selection.Columns.Count - 1).Select
'Selection.Resize(, Selection.Column.Count - 1).Select


 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/21 22:52

    TanakaHiroaki様 返信ありがとうございます。

    仰るところを修正して改善されたのですが、次に「実行時エラー1004、Rangeクラスのselectメソッドが失敗しました」のエラーがでて、調べたところ、

    Worksheets("X").Range("A" & i).Select の部分を下記に変更
        ↓
    Worksheets("X").Activate'まず、アクティブにする
    Worksheets("X").Range("A" & i).Select

    で2番目のエラーは改善されました。

    が、しかし

    本来、数字の最後のシートが終わったら止まるかと思っていたのですが、
    ①文字列のシートがアクティブになっており、B20が選択されているところで
    「実行時エラー1004、アプリケーション定義またはオブジェクト定義エラーです」
    のMSGでとまりました。

    ②しかも、2番目シートの1つのセル(B21)のコピーがXシートに反映されていませんでした。(空欄)
    (B20:C20をコピペしていなければならない)
    この抜けがなければ第一段階達成なんですがこういうのは改善できるのでしょうか

    キャンセル

0

そもそもB20:C20をコピーしたいのであれば下記で良いと思います。

Range("B20:C20").Copy


またForの最後がSheets.Countになっていますが、
これではシート「X」も含まれるのでSheets.Count-1が正しいです。
※「数字ではないシート」と仰いますが構成が記載されていないのでわかりません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 19:18 編集

    これは毎日行が増減する管球の使用本数なので特定のセルを選択してカレントリージョンで
    まずいらない部分も含めて拡張し、いらない列をカットしています。
    それをコピーしてXシートへ累積させるかたちでペースト(オートフィルター用の表を作る)
    シートの構成は1枚目が文字列で名前、2~4が数値で名前、5枚目は文字列、6枚目
    は文字Xのシートで毎日使用した電球型番と本数を累積していく、最後に削除する仮のシートになります。
    1の数値からスタートして4でループを抜けてくれるようにしたかったのです。

    キャンセル

0

よくわからないのですが、そもそもVBAでセレクトしないといけない処理はおそらく
ないですよ。
セレクトしないで処理してください!!!

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 18:58

    mako1972様、回答ありがとうございます。
    selectがないと先に進まないと思っていました。
    使わない方向で考えていこうとおもいます。

    キャンセル

  • 2020/07/22 19:13

    シートの選択で使うぐらいですかね。
    マクロの自動記録では
    バリバリ使われます。
    手作業をコードにおこしてるので
    しょうがないですけど。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る