• 締切済み

実行時エラー '424'  オブジェクトが必要です

デバッグ中で、下記のエラーが出て、進めません。 実行時エラー '424' オブジェクトが必要です。 Dim x1, x2, st1, st2, st3 As String x1 = Cells(41, 5).Value Set st1.Value = Application.WorksheetFunction.VLookup(x1, Range(Cells(102, 2), Cells(106, 4)), 3, False) x1  Cells(102, 2)  Cells(106, 4)には値が入っています。 アドバイス宜しくお願い致します。

みんなの回答

回答No.2

こんにちは。 コードを見る限りは、まだ入門編の段階でしょうから、本来、型の宣言は無視しても構いません。慣れるまでは、データ型の宣言はしなくてよいです。データ型の意味が分かるようになるまでは、かなり練習が必要です。データ型で、返る答えが違ってくることがあるからです。 >Dim x1, x2, st1, st2, st3 As String >「型」はひとまとめには書けません。は知りませんでした。 書けないわけではなく、ただ指定されていない型がVairantになるだけです。 これは、VBAの仕様です。なお、あえて、型の宣言をナシにしても初級段階ではよいです。 Application.関数名は、古い書き方ですが、エラー値が返る時に、実行時エラーになりません。しかし、この場合の、st1 は、Variant にしないといけません。それは、エラー値が入るからです。これは、上級です。 st1 = WorksheetFunction.VLookup(x1, Range(Cells(102, 2), Cells(106, 4)), 3, False) 範囲の書き方は、上記のようにしても間違いありません。Applicationが省略されています。Applicationは、もちろん、Excelのオブジェクトということです。 A1スタイルのほうが、読みやすいなら、Range("B102:D106")としても良いし、Cellsスタイルで、行番号、列番号を入れても良いです。ただし、RangeとCellsを組み合わせた場合は、お互いが連結しあっていませんから、シートを指定する時は、出来る限り、ActiveSheet など、シートを With ステートメントで括ったほうがエラーは出にくいです。(分からなければ、無視して構いません。) >x1  Cells(102, 2)  Cells(106, 4)には値が入っています。 検索値が、範囲の中に値が必ずあるというなら、エラー回避は不要です。 '// Sub Test1()   Dim x1, x2, st1, st2, st3 'データ型を省きます   x1 = Range("E41").Value   If x1 <> "" And WorksheetFunction.CountIf(Range("B102:B106"), x1) > 0 Then 'エラー回避(空白でないことと、"B102:B106"の範囲に、値があることの確認    st1 = WorksheetFunction.VLookup(x1, Range("B102:D106"), 3, False)    MsgBox st1, vbInformation   Else    MsgBox "値が見つかりません。", vbExclamation   End If End Sub '// なお、角括弧は、直接、Rangeの役割はなく、Evaluate関数の省略形ですから、たとえ使えたとしても、有効性が限定されますから、VBAで、利用する時は細心の注意が必要です。上記で書いたRangeとCellと同じく、そのまま用いると、親オブジェクトのシートは、ActiveSheetだけになってしまいますし、パラメータが文字型ではないので、応用力がありません。。(これも、意味が分からないのでしたら、無視して構いません。ただ、なるべく標準的な書き方を学んでください。)

tassi7
質問者

お礼

重ねて丁寧にコメント戴きありがとうございます。 エラーは回避できました。 エラー回避の方法も参考にさせて戴きます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

問題点1:DIM宣言の仕方が間違っている 問題点2:Setの使い方が間違っている 問題点3:範囲指定の仕方が間違っている 変数定義に関しては、どの変数をどの型で宣言したいのかよくわからないので、ここでは全てバリアント型としておきます。データ内容を知っているご自身で調整なさってください。参考までに、Dim宣言は複数の変数をまとめて扱えますが、「型」はひとまとめには書けません。仮に、全て文字型ならば、x1 As String,x2 As String,…と面倒でも一つ一つ書く必要があります。省略するとバリアント型になります。 以下修正サンプル: Dim x1 As Variant,x2 As Variant '…以下略 x1 = Cells(41,5).Value st1 = Application.VLookup(x1, [B102:D106], 3, False) MsgBox st1 抜き出したst1をどうしたいのか不明なので、ここでは簡易的に、メッセージボックスに結果を表示する形にしています。

tassi7
質問者

お礼

初歩的なミスですみません。「型」はひとまとめには書けません。は知りませんでした。 大変ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAで実行時エラー1004が出ます

    VBAで実行時エラー1004が出ます。 「Rangeメソッドは失敗しました。Worksheetオブジェクト」です。 あらゆる可能性を調べたのですが、分かりません。誰か教えて頂けますでしょうか? 下記コードの「Cells(m, 7) =・・・」の部分がエラーになりました。 Sub ボタン1_Click() Dim 現シート As Worksheet ~ 現シート.Activate Cells(m, 7) = WorksheetFunction.VLookup(現シート.Range(現シート.Cells(m, 4)).Select, 現シート.Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)).Select, 4, False) ~ End Sub 何卒宜しくお願いいたします。

  • VBA 実行時エラー1004(その2)

    毎度お世話になっております。 シート「sheet2」のA列のリスト内容を、シート「M_得意先」のリストからVLOOKUPして、指定のセルに書き出していくというコードを作成してみたのですが、VLOOKUPを実行する段階でエラーが出てしまいます。 少し変更して、同一シート内でのVLOOKUPは問題なく実行できたのですが...原因をご存知の方教えてください。 Dim b As String Dim endRcell2 As Long Dim cnt10 As long Sheets("sheet2").Select Sheets("sheet2").Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell2 = ActiveCell.Row cnt10 = 2 Do ↓実行時エラー1004が出る行 b = Application.WorksheetFunction.VLookup(Sheets("Sheet2").Range("A" & cnt10).Value, Sheets("M_得意先").Range(Cells(1, 1), Cells(endRcell, 2)), 2, False) ↑実行時エラー1004が出る行 Sheets("sheet2").Range("E" & cnt10).Value = b cnt10 = cnt10 + 1 Loop Until cnt10 = endRcell2

  • 実行時エラー”1004”アプリケーション定義または

    次のようなコードで10の平均と20の平均はエラーにならないのですが75の時のみエラーになります Sheets(SN).Cells(gyou, 22)のセルにはすべて数字があるのですがエラーになります。 エラー”1004”アプリケーション定義またはオブジェクト定義のエラー au = 100 sk1 = 10 sk2 = 20 sk3 = 75 If WorksheetFunction.Sum(Range("V90:V99")) <> 0 Then Sheets(SN).Cells(au, 24).Value = Application.WorksheetFunction.Average(Sheets(SN).Range(Cells(au - (sk1 - 1), 22), _ Sheets(SN).Cells(au, 22))) End If If WorksheetFunction.Sum(Range("V75:V99")) <> 0 Then Sheets(SN).Cells(au, 25).Value = Application.WorksheetFunction.Average(Sheets(SN).Range(Cells(au - (sk2 - 1), 22), _ Sheets(SN).Cells(au, 22))) End If If WorksheetFunction.Sum(Range("V25:V99")) <> 0 Then Sheets(SN).Cells(au, 26).Value = Application.WorksheetFunction.Average(Sheets(SN).Range(Cells(au - (sk3 - 1), 22), _ Sheets(SN).Cells(au, 22))) エラーの原因を教えてくださいよろしくお願いします。

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • ExcelマクロでVLOOKを実行したい

    ExcelマクロでVLOOKを実行したい 同一シートにある「全体」の表から必要な項目をVLookで抜き出したくて 下記のマクロを作成しました。 「Sheet1」のA列(A2以下)には検索値(数字6ケタ)を入れています。 A2の検索値でヒットした値はB2・C2に入りましたが、A3以下の検索値は スルーされてしまいます。どこを直したら良いのか、ご教授ください。 よろしくお願いします。 ----------------------------------------------------------------------- Sub 検索して値を取得する() Dim 範囲 As Range Dim 検索値, i As Long Dim 出荷日 As Date Dim 商品名 As String Set 範囲 = Worksheets("全体").Range("E7:HG1000") Set 検索値 = Worksheets("Sheet1").Cells(i + 2, 1) If 検索値.Value <> "" Then 商品名 = Application.WorksheetFunction.VLookup(検索値, 範囲, 2, False) 出荷日 = Application.WorksheetFunction.VLookup(検索値, 範囲, 160, False) Cells(i + 2, 2).Value = 商品名 Cells(i + 2, 3).Value = 出荷日 i = i + 1 End If End Sub

  • マクロに関するエラー(オブジェクトが必要です。)

    マクロは始めてで、いろいろ調べながら作ってみたのですが、 Set検索値の行でオブジェクトが必要ですというエラーが出て、 先に進めなくなりました。 申し訳ないのですが、何方かエラーの対処法を教えていただけないでしょうか。 よろしくお願いします。 ========================== Sub test() Worksheets("2月分").Activate Dim 検索値 As Integer Set 検索値 = Worksheets("2月分").Cells(4, 18) Worksheets("テスト").Activate Dim B As Range Dim C As Range For Each B In Range("B13,B413") ' 第一条件 If B.Value >= 検索値 Then GoTo Continue End If ' 第二条件 If B.Offset(0, 1).Value < 検索値 Then ' Offset(0, 1) は B列の隣のC列の値を取得 GoTo Continue End If Dim aValue As String aValue = B.Offset(0, 2).Value Worksheets("2月分").Cells("D19").Value = aValue Continue: Next End Sub

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • 実行時エラー '1004' の解決方法を教えて下さい。

    Excel97, Windows98SEを使用しています。 ブック内にいくつかのシートがあり、その中のシートAとシートBの2シートを使って作業しています。 シートの名前は決まったものではありませんが、必ずシートAの右側にシートBがあります。 シートBのセルO5に、シートBのセルB5を検索値として、 シートAのセルB17から、B列の最終データ(途中空白有り)までを範囲として、VLOOKUP関数を入力しようとしています。 そこで下記のように書いたのですが、 実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラーです。 と出てしまい「デバッグ」をクリックすると、  Range("O5")").FormulaR1C1 = _… の部分が黄色くマークされてしまいます。 Sub test()  Dim 前回シート As String  Dim 前回オーダ As String  ActiveSheet.Previous.Select 'シートAを選択  前回シート = ActiveSheet.Name  前回オーダ = ActiveSheet.Range(Cells(17, 2), Cells(Range("B65536").End(xlUp).Row, 2)).Address  MsgBox 前回オーダ'どこを参照するのか確認するために試しに入れています。  ActiveSheet.Next.Select 'シートBを選択  Range("O5").FormulaR1C1 = _   "=IF(ISERROR(VLOOKUP(RC2,'" & 前回シート & "'!" & 前回オーダ & ",1,FALSE)),"""",IF(VLOOKUP(RC2,'" & 前回シート & "'!" & 前回オーダ & ",1,FALSE)="""","""",""●""))" End Sub どこをどのように修正すればエラーが出なくなりますでしょうか? ご存知の方、どうぞよろしくお願いいたします。

  • 「実行時424 オブジェクトが必要です」が出ます

    全く理解できていない初心者です。 あるサイトで見つけたマクロです。 「検索結果のセルをすべて選択する」 Sub SelectTargets() Dim Target As String Dim FoundCell As Range, SearchArea As Range Dim Addr As String Dim FoundAddr() As String Dim i As Long Target = Application.InputBox("検索文字列入力", "検索", Type:=2) If Target = "False" Then Exit Sub Set SearchArea = ActiveSheet.UsedRange * Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell Is Nothing Then Exit Sub Addr = FoundCell.Address Do ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言 FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納 Set FoundCell = SearchArea.FindNext(After:=FoundCell) i = i + 1 If FoundCell Is Nothing Then Exit Do Loop Until FoundCell.Address = Addr '配列に格納されたアドレスをカンマ区切りで結合し、セル範囲を一括選択 Range(Join(FoundAddr, ",")).Select '---(1) End Sub ↑家のエクセル(2010)では完璧でできるのですが、会社のエクセル(2003)では、「実行時424 オブジェクトが必要です」とエラーメッセージが出ます。 コードの入力ミスがありました。 上から2行目  Dim foundcell As Range, sercharea( 正 seacharea)As Range 後は、入力ミスはなさそうなのですが、実行キーを押すと 「実行時424 オブジェクトが必要で」と出ます。 黄色のマーカーが出るのが、*印を置いた ↓に出ます。 Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) 後、気になるのがコードを入力して 「target」「searcharea」「foundcell」「foundaddr」「addr」などが頭文字が大文字になりません。 無理やり大文字にしてみたりしましたが… 「オブジェクトが必要です」に関係あるのかないのかも分かりませんが、なぜ、エラーが出てしまうのか? 入力ミスが原因なのか? 何が足りないのか?何か不要なコードがあるのか? どの用意すればいいのか教えていただけませんか? よろしくお願いします。

  • WorksheetFunctionオブジェクト

    VBAで以下のロジックを実行すると、 ”アプリケーションの定義またはオブジェクトのエラーです”というエラーが発生します。 何が悪いのでしょうか? Private Sub ComboBox1_Change() For i = 1 To 5  Sheets(1).Cells(i, 3) = Application.WorksheetFunction.VLookup(Cells(i, 1), Range(Cells(1, 4), Cells(3, 5)), 2) Next i End Sub

専門家に質問してみよう