• 締切済み

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 何卒宜しくお願いいたします。

みんなの回答

回答No.7

> 「WorksheetFunctionクラスのVLookupプロパティを取得できません」が出たので、この原因から それについては >> その時のエラーは「1004 ~~プロパティを取得できません。」です。 と、前の回答で書いたつもりですよ。 Vlookup関数が「返すべき値を見つけられない」のが原因です。 もう一度、記載しておきますが 「Cells(m,4)の値と完全一致するセルがCZ列に存在するか?」 まずは、ご確認ください。

sasakishigeru
質問者

お礼

ご指摘のとおりやったらうまくいきました。ありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.6

検査値:現シート.Cells(m, 4).Value 範囲 :Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)) 列番号:4 検索方法:False ならば Cells(m, 7).Value = WorksheetFunction.VLookup _  ( _  現シート.Cells(m, 4).Value, _  Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)), _  4, _  False _  ) と思います。

sasakishigeru
質問者

お礼

ご教示ありがとうございます。結果、「WorksheetFunctionクラスのVLookupプロパティを取得できません」が出たので、この原因から調べてみます。

回答No.5

すいません。 やはり個人的に読み辛いので書き換えます。 こちらからの疑問も幾つかあるので、それも含めて。 というか、一部しか見えないので、何とも言えないところもあります。 Sub ボタン1_Click() Dim 現シート As Worksheet Dim 行(8) As String   Dim m As Long ~   行(1) = 4     ' 次行もまとめて、m = 4 で良いのでは。   m = 行(1)     ' 他のところで 行(1) を使うなら別ですが。   ' きっとこの前に変数「現シート」には何かが代入されていると信じて   現シート.Activate  'これを付けるなら、次式のシート指定は無意味。   Cells(m, 7) = WorksheetFunction.VLookup(Cells(m, 4), Range("CZ4:DC15"), 4, False) '  あるいは With でまとめる '  With 現シート '    .Cells(m, 7) = WorksheetFunction.VLookup(.Cells(m, 4), .Range("CZ4:DC15"), 4, False) '  End   ~ End Sub Range(Cells(行, 列)) ← Range(  )を使う理由がわかりません。 Cells(行, 列)だけで指定できます。 同様、参照範囲が固定されているのであれば、 そんなに回りくどい書き方は全く必要が無いです。 Range("CZ4:DC15")で充分です。 で。 肝心のエラーの件。 上記に書き換えてもエラーが出る場合、 考えられる理由はいくつかありますが、 現段階で考えやすいエラー理由は・・・ 「そもそも、VLOOKUP関数でエラーが返っている」です。 ワークシート上でVLOOKUP関数を完全一致指定で使っているとき、 参照範囲の1列目に「完全一致するデータが無い」と、 「#N/A」エラーが返りますね。 要するに、セルに入力しようとした計算式がエラーを返したからエラー停止。 この状態である可能性が考えやすいです。 なお、その時のエラーは「1004 ~~プロパティを取得できません。」です。 というわけで、まず確認すべきは、 Cells(m,4)の値と完全一致するセルがCZ列に存在するか?です。 これを回避するにはエラー無視が手っ取り早いです。 一度、Vlookup関数の返り値を変数にとって、 それを評価して、セルに入力します。 Dim mm As Variant On Error Resume Next  ' エラー無視   ' 次行がエラーだと代入せずに進むので、「エラーの時mmは空白」   ' 計算が正常終了したら、返り値を代入   mm = WorksheetFunction.VLookup(Cells(m, 4), Range("j4:m10"), 4, False) On Error GoTo 0  'エラー処理を初期値に戻す   ' mmが空白じゃなかったら、セルに入力   If Not mm = "" Then Cells(m, 7) = mm  これで強引に回避できます。 ただし、これだと「その他のエラー」も無視してしまうので注意です。

sasakishigeru
質問者

お礼

ご教示ありがとうございます。結果、「On Error Resume Next」でVLookupは素通りしたようです。これを削除すると、「WorksheetFunctionクラスのVLookupプロパティを取得できません」が出たので、この原因から調べてみます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

現シートがフクティブだからRange、Cellaの現シートへの参照は要らないですね 現シート.Activate Cells(m, 7).Value = WorksheetFunction.VLookup(Cells(m, 4), Range(Cells(4, 104), Cells(15, 107)), 4, False)

sasakishigeru
質問者

お礼

ご教示ありがとうございました。「今度はWorksheetFunctionクラスのVLookupプロパティを取得できません」が出てきました。後は自力で調べて解決できそうです。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

With 現シート   .Activate   Cells(m, 7).Value = WorksheetFunction.VLookup(.Cells(m, 4), .Range(.Cells(4, 104), .Cells(15, 107)), 4, False) End With

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

VLookup の引数は  検査値  範囲  列番号  検索方法 です。 検査値:現シート.Cells(m, 4).Value 範囲 :Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)) 列番号:4 検索方法:False ですか?

sasakishigeru
質問者

補足

ご教示ありがとうございます。ご指摘のとおりです。 なお、CZ4:DC15"ではなくCellsを使用しているのは、他の場所で例えばCells(x, 104)としてLoopを廻すコードもあるため、纏めてエラーを潰したいためです。

回答No.1

まずは、変数mにどんな値が入っているか?から確認が必要ですね。 んで、変数mにはちゃんと数値が入っているものと仮定して、 「.Select」が邪魔をしているように見えます。 ココはむしろ省略しなきゃならないところです。 つまり、   Cells(m, 7) = WorksheetFunction.VLookup(現シート.Range(現シート.Cells(m, 4)), 現シート.Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)), 4, False) こんな感じ。 どうしても何かつけたいなら「.Value」をどうぞ。 あとは好みの問題ですが、全体的に読みづらくないですか?   Cells(m, 7) = WorksheetFunction.VLookup(現シート.Cells(m, 4).Value, 現シート.Range("CZ4:DC15"), 4, False) と素直に書く方がまだ読みやすいかと。

sasakishigeru
質問者

補足

ご教示ありがとうございます。selectを消去したのですが、同じ結果でした。今のコードは次のとおりで、同じ所でエラーとなりました。他に何を試してみたらよろしいでしょうか? Sub ボタン1_Click() Dim 現シート As Worksheet Dim 行(8) As String Dim m As Long ~ 行(1) = 4 m = 行(1) 現シート.Activate Cells(m, 7) = WorksheetFunction.VLookup(現シート.Range(現シート.Cells(m, 4)), 現シート.Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)), 4, False) ~ End Sub

関連するQ&A

  • 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

  • なぜエラーになるのかわかりません。

    コードとしては問題ないはずなのに なぜエラーになるのかわかりません。 Private Sub Worksheet_Activate() Cells(1, 1).Select End Sub というコードで、 実行時エラー1004 rangeクラスのselectメソッドが失敗しました。 となります。

  • VBAの実行時エラー91!どうしよう?

    excelVBAでファイル内の各シートを確認して、条件に合うシートのデータをコピーするところで、「実行時エラー'91'オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ました。 確認したのですが、なかなか分かりません。どなたがご指導お願いできませんか。 コードは以下のとおりです。 Sub Tenki(theBook As Workbook, mySheet As Worksheet) Dim K_Sheet As Worksheet Dim DstRange As Range For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました! If K_Sheet.Name <> "C" Then Set DstRange = mySheet.Range("A" & _ mySheet.Range("A1").CurrentRegion.Rows.Count + 1) K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select Range("B7:K48").Copy DstRange.PasteSpecial Paste:=xlPasteValues End If Next Application.CutCopyMode = False End Sub どうぞよろしくお願いします。

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • VBA VLOOKUPとセルのコピーができません

    助けてください マクロでVLOOKUPを使い、データを持ってこようとしてますが上手くいきません やりたいこと:Sheet3(在庫を貼付)にある4列目の数値を、Sheet1のG列で照合し、Sheet1の9列目に持ってきたい Sheet1:cells(6,9)にVLOOKUPの式を入れる 関数で言えば=VLOOKUP($G,Sheet3!C:F,4,FALSE) cells(6,9)をcells(7,9)からcells(2000,9)までコピー これを実行すると 「アプリケーション定義またはオブジェクト定義のエラーです。」 とでて止まってしまいます ActivesheetsやWorkbooks、WorksheetsやSheetsで設定したりしてもエラーは変わりますが 止まってることには変わりありません どうしたら動くようになりますか? Sub vlook() Dim Nname As String macx = "ルーチンワーク20130223.xlsm" 'マクロ用ファイル「ルーチンワーク20130223.xlsm」がある Sheets(1).Select Workbooks(macx).Activate Worksheets(1).Activate ddir = Cells(33, 2) 'cells(33,2)にフォルダ情報がある Nname = Dir(ddir & "在庫推移.xlsx") '在庫推移.xlsxというVLOOKUPしたいファイルがある Workbooks.Open Filename:=ddir & Nname Workbooks(Nname).Activate Sheets(1).Select Worksheets(1).Activate 'VLOOKUPで在庫を持ってくる ActiveCell.FormulaR1C1 = "=VLOOKUP(RC7,'在庫を貼付'!C[-6]:C[-3],4,FALSE)"   '自動記録マクロから持ってきてます Worksheets(1).Activate Sheets(1).Select Range(Cells(6, 9)).Copy Destination:=Sheets(1).Range(Cells(7, 9)) 'この行でエラーが出る

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!

  • VBA どうしてなのでしょうか?

    どうしてなのかまったくわかりません… Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Activate Range("G5").Activate End Sub は良いのに Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Range("G5").Activate End Sub はエラーがでます… この理由をご存知の方いらっしゃいますか?? よかったら教えていただけませんか?

  • 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 ---------------------

  • 実行時エラーについて

    Konkon_mと申します よろしくお願いします エクセルの質問なんですが、今回ワークシートから別のワークシートに表と数値を貼り付けるマクロを作成したのですが終了時に、『実行時エラー'1004' WorksheetクラスのPasteメソッドが失敗しました』のエラーがでるのです 一応、コピー&貼り付けはきちんと終了しているようなのですがすごく気になります 作成したマクロを載せますので、わかる方がいらっしゃいましたら教えていただけないでしょうか? 宜しくお願いします ChDir "H:\A\B" Workbooks.Open FileName:="\\PRO800\Home Directory\B\B\コピー.xls" ActiveWindow.WindowState = xlMinimized Range("B3:D10").Select Selection.Copy ActiveWindow.WindowState = xlMinimized ActiveWindow.WindowState = xlNormal ActiveWindow.WindowState = xlMinimized Windows("コピー.xls").Activate ActiveWindow.WindowState = xlNormal Range("B3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("B3:D10").Select Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("A1").Select ActiveWorkbook.Save ActiveWindow.Close ActiveWindow.WindowState = xlNormal Range("B3").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A3").Select ActiveWindow.WindowState = xlMaximized End Sub

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

専門家に質問してみよう