• 締切済み

AccessVBAでVLookupを使いたい

Access VBA で VLookup を使いたいと思っていたのですが、 「メソッドまたはデータメンバが見つかりません。」とエラーになります。 箇条書きになりますが、行いたいことは以下のとおりです。 ・「D:\0402\コメント.xlsx」を開き、最初のシート(sheet1)を選択する。 ・sheet1の A列には検索対象の文字列が、B列にはそれに対するコメントが文字列で入っています。 ・VLookup 関数を使用し、変数「vDir.Name」を検索値、sheet1全体が検索範囲、 B列の情報がほしいので、列は「2」、完全一致で取りたいので「False」としています。 ・B列の返り値を変数「vComment」に代入します。 下記が書いたソースなのですが、「vComment = ~」を記述すると、 冒頭の「メソッドまたはデータメンバが見つかりません」とエラになってしまいます。 前後のプログラムの関係上、Accessのクエリの使用や、Excelをリンクテーブルにすることはできません。 解決方法がわかる方、助けていただけますでしょうか。 Access は 2010 になります。よろしくお願い致します。 'エクセルを開く Dim oCommentXLS As Object Dim oCommentXLSWorkbook As Object Dim vFileCommentXLS As String vFileCommentXLS = "D:\0402\コメント.xlsx" Set oCommentXLS = CreateObject("Excel.Application") Set oCommentXLSWorkbook = oCommentXLS.Workbooks.Open(vFileCommentXLS) Dim oSheet As Object Set oSheet = oCommentXLS.Worksheets(1) Dim raCommentFind As Range Dim vComment As String Set raCommentFind = Cells.Find(What:=vDir.Name, LookIn:=xlValues, LookAt:=xlWhole) If Not raCommentFind Is Nothing Then Debug.Print "みつかりました。" vComment = Application.WorksheetFunction.VLookup(vDir.Name, Range("A1:B1000"), 2, False) Debug.Print vComment Else Debug.Print "見つかりませんでした" End If

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

提示されたのは、どのような環境で記述されたものなのでしょうか。 > Dim raCommentFind As Range がエラーになっていない?であれば、Excel は参照設定されているのでしょう。 参照設定しているのであれば、 > Dim oCommentXLS As Object > Dim oCommentXLSWorkbook As Object > Dim oSheet As Object 部分は、 Dim oCommentXLS As Excel.Application Dim oCommentXLSWorkbook As Excel.Workbook Dim oSheet As Excel.Worksheet と記述しておけば、例えば、oSheet と記述した後に . を入力すると、候補が表示され便利です。 また、 > Set oCommentXLS = CreateObject("Excel.Application") する必要はなく、 Set oCommentXLS = New Excel.Application で事済みます。 また、Excel で良く使う Application は、oCommentXLS にあたるので  Application.WorksheetFunction ↓  oCommentXLS.WorksheetFunction 参照設定していないのであれば、xlValues xlWhole 等の Excel での定数は定義しておく必要があります。 また、Cells Range を記述する時には、誰の下で・・・を指定します。  Cells.Find( → oSheet.Cells.Find(  Range("A1 → oSheet.Range("A1 余談) 参照設定すれば Cells Range はそのまま記述しても動くようですが、 誰の下で・・・を指定しておいた方が良いかも 以下、Excel を参照設定してある環境で実行してみます。 Public Sub test1()   Dim oApp As Excel.Application   Set oApp = New Excel.Application   oApp.Visible = True   oApp.Workbooks.Add   oApp.Range("B2") = "ABCD" ' Range("B2") = "ABCD" でも同じ結果に   Set oApp = Nothing End Sub ※ Application 直下に Range 記述しているので、アクティブブックのアクティブシートが隠れているようですが、 さて、以下での ★ は、どこに記述されるのでしょう Public Sub test2()   Dim oApp1 As Excel.Application   Dim oApp2 As Excel.Application   Set oApp1 = New Excel.Application   Set oApp2 = New Excel.Application   oApp1.Visible = True   oApp2.Visible = True   oApp1.Workbooks.Add   oApp2.Workbooks.Add   oApp1.Range("B2") = "ABCD"   oApp2.Range("B2") = "abcd"   Range("C2") = "1234" ' ★   Set oApp1 = Nothing   Set oApp2 = Nothing End Sub Public Sub test3()   Dim oApp As Excel.Application   Set oApp = New Excel.Application   oApp.Visible = True   oApp.Workbooks.Add   oApp.Range("B2") = "ABCD"   Set oApp = Nothing   Set oApp = New Excel.Application   oApp.Visible = True   oApp.Workbooks.Add   oApp.Range("B2") = "abcd"   Range("C2") = "1234" ' ★   Set oApp = Nothing End Sub ※ エラーになる場合もありますね。 エラーにならない時には、どちらも 1234 の左側は ABCD でしたね (Vista + Access2007 にて)

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.1

Accessからなのだから、ライブラリ名を省略しちゃだめでしょう。 (参照設定はExcel2010だとMicrosoft Excel 14.0 Object Libraryかな) >vComment = Application.WorksheetFunction.VLookup(vDir.Name, Range("A1:B1000"), 2, False) vComment = Excel.Application.WorksheetFunction.VLookup(vDir.Name, Range("A1:B1000"), 2, False)

関連するQ&A

  • Workbookオブジェクトに格納できない

    一つのアプリケーション内で、 2008.xlsx 2009.xlsx のファイルを開いているのですが 2009.xlsxの標準モジュールから 2008.xlsxをWorkbookオブジェクトに格納するにはどうすればいいですか? 例えば、2008.xlsxの全てのファイル名を取得したい場合、 Sub Sample() Dim w As Workbook Dim s As Worksheet Set w = Windows("2008.xlsx") For Each s In Worksheets Debug.Print s.Name Next End Sub を実行しようとすると、 型が一致しません。(Error 13)になります。

  • VBAでVlookup機能を使うときにエラー

    このコミュニティでもたびたび質問されているVLOOKUPのVBAですが 解答例で多く書かれているのが Public Sub test()     Dim MyVariant As Variant     MyVariant = Application.VLookup("excel", Range("A:B"), 2, False)     If IsError(MyVariant) Then       Debug.Print "Not Found"     Else       Debug.Print MyVariant     End If   End Sub なのですがRangeの部分にシートの情報を乗せるとエラーが出ます 例)Application.VLookup(Label6.Caption, WorkSheets("Sheet5").Range("A:B"), 2, False) まだまだ初心者なので何がおかしいのかわかりません よろしくお願いします

  • AccessVBAでオブジェクトの説明欄を取得したい

    ACCESS97のVBAにて開発をしています。 データベースウィンドウに表示される、各オブジェクトの説明欄の値を取得しようとしています。先日同様の質問内容に対していただいたアドバイスをもとに、DB内の全データベースオブジェクト(「テーブル」や「フォーム」の全てのテーブルやフォーム)を一括して取得しようとしているのですが、テーブル名は取得(デバックウィンドウに出力)できるのですが、説明欄の取得ができませんでした。 テーブルの場合のソースを以下に示しますが、どこがまずいのかご指摘願えないでしょうか? また、フォームの場合はどうすればよいか、あわせて教えていただけると大変助かります。 Dim myCont As Container Dim myDoc As Document Dim i As Integer Dim tds As DAO.TableDefs Dim td As DAO.TableDef Set tds = CurrentDb.TableDefs i = 0 For Each myCont In CurrentDb.Containers For Each myDoc In myCont.Documents If myCont.NAME = "Tables" Then If TableAndQuery(myDoc.NAME) = "Table" Then Set td = tds(i) Debug.Print td.NAME Debug.Print td.Properties("Discription").Value i = i + 1 End If End If Next Next Set td = Nothing Set tds = Nothing 初歩的な質問で大変申し訳ありませんが、よろしくお願いいたします。

  • VBA VLOOKUpについて

    VBA VLOOKUpについて すいません 例えば B1セルに名前があり Q1セルにIDがあります そこで UserFormを開いた時に表示させたい場合 どのような記述にすれば良いのでしょうか?? Dim wbMyBook As Workbook 'このブックをセット Dim w As Worksheet 'このブックのWシートをセット Dim vRet As Variant '使用するブックとシートをセット Set wbMyBook = Workbooks(ThisWorkbook.Name) Set wsKanjya = wbMyBook.Worksheets("W") vRet = WorksheetFunction.VLookup(TextBox1.Text, _ Sheets("w").Range("A:IV"), _ 17, _ False)   If vRet = "402-B" Then w.Cells(lng, 2) = TextBox1.Text Exit For End If Next lng これでは当然駄目です!! 組み合わせて使うと混乱してしまいます! 記述を教えてください。

  • AccessVBA:フィールドの標題名を取得したい

    いつもお世話になっております WindowsXP SP1 Access2002を使用しております。 あるテーブルのフィールド名をイミディエイトウィンドウに出力するプログラムを以下のように作成しました '--------------------------------------------------- 'ADO結果セットのフィールド名をイミディエイトウインドウに出力 '--------------------------------------------------- Sub test()   Dim testcnt As Long   Dim gDb_User  As ADODB.Connection   Dim Rst   As ADODB.Recordset      Set gDb_User = New ADODB.Connection   Set gDb_User = CurrentProject.Connection   Set Rst = New ADODB.Recordset      Rst.Open "select * from テーブル1 ", gDb_User, adOpenKeyset, adLockOptimistic      Debug.Print "FieldName"   Debug.Print "--------------"        For testcnt = 0 To Rst.Fields.Count - 1     Debug.Print Rst.Fields(testcnt).name   Next      Debug.Print "--------------"   Debug.Print "End"      Rst.Close   Set Rst = Nothing   gDb_User.Close   Set gDb_User = Nothing    End Sub '--------------------------------------------------- 実行すると、フィールドは出力されるのですが 各フィールド名の標題も取得したいと考えております。 標題のプロパティ等をどのように抽出すればよろしいでしょうか? ご教示のほど、何卒よろしくお願いいたします。

  • AccessVBAのCurrentDbメソッドでエラーになります

    Windows2000、Access2000を使っています。 オンラインヘルプを参考に作った下記のプログラムを走らせると、Set db = CurrentDbのところで「実行時エラー13:型が一致しません」のエラーになります。どうしてでしょう。 Sub b() Dim db As DAO.Database Dim tdf As DAO.TableDef Dim fld As DAO.Field Set db = CurrentDb Set tdf = db.TableDefs("テーブル1") For Each fld In tdf.Fields Debug.Print fld.Name Next fld End Sub 参照設定を見ると、Microsoft dao 3.0 Object LibraryにチェックがついていますのでDAOは使えるはずなんですが・・・。

  • 一回のループで次のオブジェクトの値も同時に取得する

    一回のループで次のオブジェクトの値も同時に取得するにはどのようなコードを書けばよいですか? 例えば、 ブックにシートが Sheet1 Sheet2 Sheet3 あり、 Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub のように、全てのシート名を取得する場合、 Sheet1とSheet2を1回のループで同時に取得する方法はありますか? Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name   Debug.Print s+1.Name Next End Sub みたいな方法があるのか知りたいです。 よろしくお願いします。

  • Excel VBA でVLookUPの質問

    教えてください。 Excel VBA でVLookUPを使用したいのですが 毎回シート名も数も変わります。 そのため、検索範囲 のシート名をセル値が取得したいのですが どうすればよいでしょうか? 検索値 = AシートB列 検索範囲=BシートM列 書出し範囲=AシートU列 下記のコード作成しましたが ws = Worksheets("②価格集計").Range("U2").Value 検索用格納配列(i, 1) = "=VLOOKUP(B" & i + 1 & ",ws!A:M,13,0)" でエラーがでます。 他に方法があれば教えてください。 宜しくお願い致します。 Sub test() Dim 検索値 As Range '検索値 Dim 検索用格納配列 As Variant '検索用格納配列 Dim 出力範囲 As Range '出力範囲 Dim i As Long Dim 検索範囲 As Range Dim endrow As Long Dim ws As Worksheet endrow = Sheets("①SPOT売却明細貼付").Range("B" & Rows.Count).End(xlUp).Row Set 検索値 = Worksheets("②価格集計").Range("B3:B302") Set 出力範囲 = Worksheets("②価格集計").Range("U3:U302") ws = Worksheets("②価格集計").Range("U2").Value 検索範囲 = Worksheets(社名).Range("A:M") 検索用格納配列 = Range(検索値, 出力範囲) For i = 1 To endrow 検索用格納配列(i, 1) = "=VLOOKUP(B" & i + 1 & ",ws!A:M,13,0)" Next 出力範囲 = 検索用格納配列 End Sub

  • Vlookupマクロにつきまして

    初心者で、 エクセルのマクロにて、下記の処理を行おうとしているのですが、 上手く行きません。 どなたかお助けください! B3=Vlookup(A3,Sheet2!A:F,3,False) B4 A4 B5 A5 とA列に値がある限りカウントアップしていきます。 以下の通り考えてみたのですが、動きません。 Sub vlookup() Dim i As Long For i = 3 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, "B") = Application.WorksheetFunction.VLookup(Range(Cells(i, "A")), Worksheets("Sheet2").Range("A:F"), 3, False) Next End Sub すみません、宜しくお願いします。

  • SQLServer 列の「説明」の取得について

    SQLDMOオブジェクトを用いて、テーブルの列挙、列の列挙までは行なえるようですが、列の「説明」の項目の取得は行なえないのでしょうか? SQLDMOでなくても、何か取得出来る方法があればご教授お願いします。 --サンプル Public Function Main() Dim objServer As SQLDMO.SQLServer Dim objDatabase As SQLDMO.Database Dim objTables As SQLDMO.Tables Dim curTable As SQLDMO.Table Dim curCOl As SQLDMO.Column Const DB_NAME As String = "local" Const DB_USER As String = "sa" Const DB_PASSWD As String = "password" Const DB_USE As String = "hoge" ' オブジェクト作成 Set objServer = CreateObject("SQLDMO.SQLServer") ' 接続 Call objServer.Connect(DB_NAME, DB_USER, DB_PASSWD) 'DB選択 Set objDatabase = objServer.Databases(DB_USE) 'テーブル一覧 Set objTables = objDatabase.Tables ' テーブルの列挙 For Each curTable In objTables If curTable.SystemObject Then Debug.Print curTable.Name & " [system]" Else Debug.Print curTable.Name '列名の列挙 For Each curCOl In curTable.Columns Debug.Print curCOl.Name '*!ここで列の説明は取得出来ないのでしょうか??? Next End If Next ' 切断 Call objServer.Disconnect End Function