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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

11875閲覧

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

zendaman999

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/07/21 12:13

「実行時エラー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シートへ型式を選択して貼り付け(値のみ) **というプロシージャになっていますでしょうか?**

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

コード例

vba

1Sub LightCount2() 2 Dim wsX As Worksheet 3 Set wsX = Worksheets.Add(after:=Worksheets(Worksheets.Count)) 4 wsX.Name = "X" 5 6 Dim i As Long 7 For i = 2 To Sheets.Count - 1 8 With Worksheets(i) 9 If IsNumeric(.Name) Then '数字ではないシート名は対象外 10 Dim rng As Range 11 Set rng = .Range("B20").CurrentRegion 'B20の周りのデータが入ったセル範囲 12 Set rng = rng.Resize(, rng.Columns.Count - 1).Offset(0, 1)'セル範囲を変更 13 wsX.Range("A" & i).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value '値の代入 14 End If 15 End With 16 Next i 17End Sub

投稿2020/07/22 02:56

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zendaman999

2020/07/22 10:01

hatena19様、回答ありがとうございます。 まだまだ圧縮できるということですね。 selectやactivateは使わないと先にすすなまいものと思っていました。 setなるものも、まだどういう意味か分からないので調べてみようと思います。
hatena19

2020/07/22 11:13

「VBA 高速化 Selectしない」をキーワードにWEB検索するといろいろ解説ページか見つかります。
zendaman999

2020/07/22 12:10

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

2020/07/22 13: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
zendaman999

2020/07/22 21:52

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

0

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

VBA

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

投稿2020/07/21 13:00

TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zendaman999

2020/07/21 13: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をコピペしていなければならない) この抜けがなければ第一段階達成なんですがこういうのは改善できるのでしょうか
guest

0

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

投稿2020/07/22 03:20

編集2020/07/22 03:20
mako1972

総合スコア383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zendaman999

2020/07/22 09:58

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

2020/07/22 10:13

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

0

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

VBA

1Range("B20:C20").Copy

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

投稿2020/07/22 01:20

編集2020/07/22 01:27
radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zendaman999

2020/07/22 12:16 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問