VBAのエラーについて

このQ&Aのポイント
  • Excel VBAのコードで特定の関数を追加するとエラーが発生する問題について質問します。
  • VBA初心者ですが、コードにleft関数を追加したところ「sub または function が定義されていません」というエラーメッセージが表示されます。
  • 同様のエラーが発生しないコードも試しましたが、それでもエラーは解消されません。
回答を見る
  • ベストアンサー

VBAのエラーについて

いつも識者の皆様にはお世話になっております。 Excel VBAのことで質問させてください。 Range("i23").Value = Application.VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0) というコードは通るのですが、 Range("i23").Value = Application.Left(VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0), 2) というleft関数を追加したコードだと「sub または function が定義されていません」というエラーになってしまいます。 VBAを始めたばかりなのですが、何か根本的な勘違いをしていますでしょうか? ちなみに Range("i23").Value = Application.Left(Application.VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0), 2) というコードも通りませんでした。 ご回答よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

直接の間違い箇所のその1は、 間違い: Vlookup(… 正しくは: Application.Vlookup(… です。 しばしば間違いやすい個所ですが、使いたい「Vlookup」の前に直接Application.を修飾して、つながりを明示してやらないとご覧になったエラーになります。 次の間違っている箇所その2は、 間違い: Application.Left(… 正しくは: Left(Application.Vlookup(… なんでもかんでも「関数はApplication.関数名」のように勘違いしてはいけません。(その割にVlookupの前に忘れてた訳ですが) そもそも「Application.Vlookup」のような省略(手抜き)記法を覚えてしまったのが間違いの始まりだったかもしれませんが、これは正確には Application.Worksheetfunction.Vlookup(… のように書きます。 Applicationの中にまずWorksheetFunctionという「ワークシート関数を特にマクロの中でも使う」ためのメンバがあり、それに含まれているVlookupという関数を使います、という意味です。 で、前振りが長くなりましたが、ExcelVBAで使うLeft関数は、WorksheetFunctionの中にはなくて、VBAオリジナルのLeft関数になります。つまりワークシート関数のLeft関数をVBAの中で使っているのではありません。そもそもWorksheetFunctionの中には、VBAで用意されているLeft関数などは、含まれていません。こういったことは、VBE画面で「オブジェクトブラウザ」と使い、WorksheetFunctionのメンバを確認してみることで判ります。 さらに。ちなみに Application.Left と書くと、これはLeft関数じゃなく、エクセルウィンドウの左端の位置を取得するという、全く意味の違う命令としてLeftが作動します。 こういうこともまた、オブジェクトブラウザで確認することができます。

rihitomo
質問者

お礼

できました!ありがとうございます! >そもそも「Application.Vlookup」のような省略(手抜き)記法を覚えてしまったのが間違いの始まりだったかもしれません まったくそのとおりで、お恥ずかしい限りです。 きちんと構文の意味を考えて組むようにします!

その他の回答 (1)

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

Range("i23").Value = Application.Left(VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0), 2) のVLookupに Application. を足せば良いのでは?

関連するQ&A

  • エクセル 別シートから値を検索して挿入 VBA

    いつもお世話になっております。 VBAにて、Sheet1 の【原価】に【商品】をキーにしてSheet2の【原価】を検索して挿入するコードを作成しました。 元々Shee1の【原価】にはすでに数値が入っていますが、下記のコードを実行すると上書きする処理のため、検索にヒットしない商品の【原価】はエラー【#N/A】となります。 ※画像参照願います。 目的はヒットする商品名の【原価】のみが更新される、 ヒットしない場合エラー【#N/A】を出さないようにする。 改良をご教示頂ければ助かります。 Sub データ検索() Application.ScreenUpdating = False Dim I As Long   I = 2 Do While Range("A" & I).Value <> ""  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = _   Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, Worksheets ("Sheet2").Range("A2:B65535"), 2, 0)  I = I + 1 Loop Application.ScreenUpdating = True End Sub

  • VBAでVlookup関数を組もうとしていますがエラーが出ます。VBAに詳しい方、教えてください

    VBAでvlookup関数を下のように組みましたが、(1)でエラーが出ます。VBAに詳しい方、教えてください。 Sub VLLOKUPによる表の検索4() Dim mykensakuchi Dim mykensakuhan Dim gyo As Integer (1) mykensakuchi = Worksheets("sheet1").Range("a" & gyo).Value mykensakuhan = Worksheets("sheet2").Range("b2:e9") saikagyo = Worksheets("sheet1").Range("a" & Rows.Count).End(xlUp).Row gyo = 2 For gyo = saikagyo To 1 Step -1 With Application.WorksheetFunction Range("b:gyo").Value = .VLookup(mykensakuchi, mykensakuhan, 2, False) End With Next End Sub

  • Excel VBA 日付フォーマットを統一したい

    Excel VBAについてお教え下さい。Excel2010を使用しています。 A列に下記のようなデータが入っています。 20141130 20141201 B列に下記のようなデータが入っています。 2014/11/30 2014/12/01 C列にA列の値を変換して表示したいと思っています。 20141130 ⇒ 2014/11/30 20141201 ⇒ 2014/12/01 D列にB列の値を変換して表示したいと思っています。 2014/11/30 ⇒ 20141130 2014/12/01 ⇒ 20141201 下記のようなコードを書いてC列を埋めようと思いました。エラーメッセージが出て、オーバーフローしましたというメッセージでした。 For i To 100 Format(ThisWorkbook.Worksheets("データ").Cells(i, 3).Value, "yyyymmdd") Next i さらに、D列を埋めようと下記のコードを書きました。 Format(ThisWorkbook.Worksheets("データ").Range("D" & i).Value, "@@@@/@@/@@") そうしたら、2014/12/1 といったように、桁数が足りなく、「01」となりません。 質問 やりたい事はA列、B列をどちらかのフォーマットで統一したいと思っています。 どのようなコードを書けば問題は解決されるでしょうか? よろしくお願い致します。

  • Setステートメントをまとめて記述する方法 (エクセル2000VBA)

    お世話になります。 Setステートメントで以下のように書いて、シート名を省略して使っています。  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") これをプロシージャ毎に書くとコードが長くなるので、先頭かどこかに1回書くだけで、全てのプロシージャで使えるようにしたいのですがどうしたら良いでしょうか? このようなプロシージャを実行したいのですが、 Private Sub CommandButton1_Click()  a.Range("A2").Value = "データ1"  b.Range("B4").Value = "データ2"  c.Range("C9").Value = "データ3" End Sub (他にもコマンドボタンやチェックボックス用のプロシージャがあります) Setステートメントだけを先頭に書くと、 「プロシージャの外では無効です」というエラーが出ましたので、 Public Sub hensuu()  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") End Sub のようにしたら、「実行時エラー"424":オブジェクトが必要です」というエラーが出てしまいました。 どのようにしたらエラーが出ず正しく動くようになりますでしょうか?よろしくお願いします。

  • VBAにおけるRank関数について

    たびたびの質問で申し訳ないです。VBAで、sheet"C"のC列に得点のデータがあって、D列に順位を付けていきたいのですが、うまくできません。↓のように書いたら、構文エラーが出てしまいます。どうかご回答よろしくお願いします。 For i = 2 To 43 Worksheets("C").Range ("Di").Value = Application.WorksheetFunction.Rank(Worksheets("C").Range ("Ci").Value. Worksheets("C").Range("B2:B43").0) Next i

  • VBA 初心者

    sheet1から、sheet2データを検索して抽出する練習をしているのですがerror"1104"が表示されます、なぜなのか分からないので投稿しました、よろしくお願いします。 sub test() dim sh1 as worksheets dim sh2 as worksheets dim  i  as  integer set sh1 = thisworkbook.worksheets("sheet1!") set sh2 = thisworkbook.worksheets("sheet2!") b = userform1.textbox1 for i = 1 to 10 sh1 .cells(i,2) = b b = b+1 x = sh1.cells(1,2) sh1.cells(i,3).value = worksheetfunction.vlookup(x,sh2.range("a1:d500"),2,false) next i end sub

  • VBAのVLOOKUPの速度向上について

    VBAでVLOOKUPの速度向上について、お知恵を貸していただきたく存じます。 以下のVLOOKUPのVBAがおそく、速くしたいです。行数は2万行ぐらいです。 何卒よろしくお願い申し上げます。 Dim 範囲A As Range Set 範囲A = Worksheets("取引先").Range("A:H") On Error Resume Next myCnt5 = 2 Do Worksheets("受注データ").Cells(myCnt5, 49).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt5, 48), 範囲A, 6, False) myCnt5 = myCnt5 + 1 If Worksheets("受注データ").Cells(myCnt5, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt6 = 2 Do Worksheets("受注データ").Cells(myCnt6, 51).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt6, 50), 範囲A, 8, False) myCnt6 = myCnt6 + 1 If Worksheets("受注データ").Cells(myCnt6, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt7 = 2 Do Worksheets("受注データ").Cells(myCnt7, 53).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt7, 52), 範囲A, 6, False) myCnt7 = myCnt7 + 1 If Worksheets("受注データ").Cells(myCnt7, 1).Value < 10 Then Exit Do Loop 補足 上記VBAには記載していませんが、Application.ScreenUpdatingの停止、Application.Calculationを手動の設定はしています。

  • エラーを見つけられません。

    エラーを見つけられません。 エクセルで次のコードを書きましたが何も表示されません。 ------------------------- Sub example01() '請求書番号 (請求書1のE2からデータ収集のA2へ) Worksheets("データ収集").Range("a2").Value = Worksheets("請求書1").Range("e2").Value '発行日 (請求書1のE1からデータ収集のB2へ) Worksheets("データ収集").Range("b2").Value = Worksheets("請求書1").Range("e1").Value '会社名 (請求書1のB4からデータ収集のC2へ) Worksheets("データ収集").Range("c2").Value = Worksheets("請求書1").Range("b4").Value '担当者名 (請求書1のB5からデータ収集のD2へ) Worksheets("データ収集").Range("d2").Value = Worksheets("請求書1").Range("b5").Value '請求金額 (請求書1のE31からデータ収集のE2へ) Worksheets("データ収集").Range("e2").Value = Worksheets("請求書1").Range("e31").Value End Sub ------------------------- 原因として何が考えられるでしょうか?何卒宜しくお願い致します。

  • 『続き』 質問番号:701776EXCEL_VBA

    ■質問番号701776の続きです。よろしくお願いいたします。 http://okwave.jp/qa/q7017764.html ■依頼内容 下記コードで アプリケーション定義またはオブジェクト定義のエラー(実行時エラー1004)を修正したい。 エクセルの関数で =IF(ISERROR(A1/B1),"",A1/B1) といった関数を作成すると、エラー値は非表示で、エラーでない場合のみ、計算しますが、 VBAで同様の式を利用しようとすると、エラーとなって実行できません。ご教授お願いいたします。 Sub macro1() Dim w As Workbook Dim mydate As Date, mydays As Long Set w = Workbooks.Open(Filename:=ThisWorkbook.Path & "\実験データ.xls") mydate = ThisWorkbook.Worksheets(1).Range("E1") mydate = mydate - Day(mydate) + 1 '念のため。 mydays = Day(DateAdd("M", 1, mydate) - 1) ThisWorkbook.Worksheets(1).Range("C5:I35").ClearContents With ThisWorkbook.Worksheets(1).Range("C5").Resize(mydays, 7) .Formula = "=IF(ISERROR(VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))),"",VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0)))" .Value = .Value End With w.Close savechanges:=False 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)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

専門家に質問してみよう