• 締切済み

ExcelからAccessの関数を使用したい

EXCELのVBAよりACCESS上のモジュールで定義された関数(Function) を使用したいのですが、可能でしょうか? EXCELから引数はACCESSに対しては、引数を付けて実行できるのですが、ACCESSからEXCELへの返却値の受け取り方が分からなくて困っています。(環境はOFFICE2000です。他のバージョンなら可能?) ■EXCEL Set objACCESS = CreateObject("Access.Application") objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\database.mdb" objACCESS.Run "UserFunction", 123 Set objACCESS = Nothing #### UserFunctionの結果が欲しい ### ■ACCESS Public Function UserFunction(inValue) W_SQL = "SELECT data FROM table WHERE key = " & inValue Set DB = CurrentDb Set RST = DB.OpenRecordset(W_SQL) If RST.EOF Then RST.Close UserFunction = -1 Else UserFunction = RST("data") RST.Close End If End Sub

みんなの回答

noname#60992
noname#60992
回答No.1

・excel からADOを使って直接Accessのテーブルを見に行く。 ・Accessのファンクションをエクセルのセルに値を入れるように 書き換える。 ・Excelにアクセスのテーブルを読み込む。 などが考えられます。 実験していないのではっきりわかるわけではないのですが、 一番スムーズにことが運ぶのは excel からADOを使って直接Accessのテーブルを見に行く方法だと思います。 他の方法は、同期の問題などが起きる可能性があります。

kasai_noy
質問者

補足

回答ありがとうございます。 今回ACCESS上に関数を作ろうとしているのは、なるべくオブジェクト間の独立性を高めたいと思っているからなので、Excel側でDB処理(ADOやDAO)をしたり、ACCESS側でExcelのセルを処理したりといった相手を意識した形にはしたくないのです。あくまでデータやクラスオブジェクトを受け渡す形で実現したいと思っています。呼び出し側がExcelに限らずVBやWordからも同じインターフェイスで使えればと思っています。

関連するQ&A

  • ExcelからAccessのフォームを開くVBA

    VBAをあまり理解出来ていない初心者です。 ExcelからAccessのフォームを開く為に解説サイトを参考にしました。 Accessはテーブルだけのバックエンドと、それ以外のフロントエンドに分かれています。 Sub OPEN顧客管理番号検索() Dim objACCESS As Object Set objACCESS = CreateObject("Access.Application") objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "C:\....\FE.mdb" objACCESS.DoCmd.OpenForm "F_顧客管理番号検索", acNormal objACCESS.Visible = True objACCESS.UserControl = True Set objACCESS = Nothing End Sub Excelマクロ有効テンプレートからですと動作するのですが、マクロ有効ブックで保存すると以下のエラーが表示され動きません。 実行時エラー’7866’ このデータベースを開くことができません。データベースファイルが存在しないか、他のユーザーが排他モードで開いているか、ADPファイルではないことが原因です。 Accessを終了して試したり、Excelファイルの保存場所を変更してみたりしたのですが解決出来ません。 また、今回開いているフォームとは管理番号による検索クエリを元にしたフォームなのですがExcelのセルに入力されている管理番号をパラメーターに自動で入力することはできるのでしょうか? ご指導よろしくお願いします。 通報する

  • ACCESSからEXCELに出力する際、時間がかかる。

    よろしくお願いします。 ACCESS VBA を使用して、既存のEXCELファイルにデータを出力しているのですが、すごく時間がかかってしまいます。件数が少ない時はそれほど気にならないのですが。時間短縮する方法を教えてください。 Sub S_ExportExcel_ADO() Dim CN As ADODB.Connection Dim rst As ADODB.Recordset Dim objExcel As Excel.Application Dim i As Integer Dim W_SQL As String On Error GoTo Err_S_ExportExcel_ADO Set objExcel = New Excel.Application objExcel.Workbooks.Open ("test.xls") objExcel.Worksheets("sheet1").Select Set CN = CurrentProject.Connection Set rst = New ADODB.Recordset W_SQL = "SELECT * FROM データ" rst.Open W_SQL, CN, adOpenKeyset, adLockReadOnly i = 1 Do Until rst.EOF objExcel.Cells(i, 4) = Trim("" & rst![データ1]) objExcel.Cells(i, 5) = Trim("" & rst![データ2]) objExcel.Cells(i, 6) = Trim("" & rst![データ3]) objExcel.Cells(i, 7) = Trim("" & rst![データ4]) objExcel.Cells(i, 9) = Trim("" & rst![データ5]) '***省略*** objExcel.Cells(i, 35) = Trim("" & rst![データ15]) objExcel.Cells(i, 36) = Trim("" & rst![データ16]) i = i + 1 rst.MoveNext Loop 'EXCEL保存 objExcel.ActiveWorkbook.Close objExcel.Quit rst.Close CN.Close Set rst = Nothing Set CN = Nothing Set objExcel = Nothing End Sub

  • ExcelからAccessを操作中のウエイト

    AccessのデータをExcelからSQL文を使って取り出しています。 複数のレコードセットを2次元配列に取り組むために With My_RecSet On Error Resume Next .Open MySQL, My_DB On Error GoTo 0 Application.Wait Now + TimeValue("00:00:01") On Error GoTo RsCloseHdl If .EOF And .BOF Then '該当するレコードセットが一つもない場合 SQL_ext = -1  ←Function名 Exit Function Else SQL_ext = .GetRows End If としています。 私のパソコンの性能の関係かもしれませんが、ウエイトを入れないとたまに、レコードセットが1つ以上あるのにも関わらず.EOF And .BOF で引っ掛かります。1秒以下のウエイトの入れ方を教えて頂けませんか? また、たまに、.Closeさせているにも関わらす、.Open MySQL, My_DBで、すでに開いているものに開けませんとエラーがでるので、やむなく、On Error Resume Nextとしています。限られた情報の提供となりますが、わかる範囲で教えて頂けないでしょうか? よろしくお願いいたします。

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • access2000VBAで、外部ファイルに書き込むには

    access2000 VBAで 「sample.htmlを作成、 tableテーブルのデータを書き込む」 をして、htmlファイルを自動作成したいのですが、 うまくVBAがかけません。 とりあえず、外部ファイルにデータを出力に取り組んでいます 外部ファイルの作成の仕方と、書き込みのところで、 どうしたらいいのか分からず、困っています。 アドバイスおねがいします。<(_ _)> Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection rst.Open "table", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect Open sample.html For Output As #1 If rst.EOF Then MsgBox "There are not recordset" GoTo db_Close End If Do Until rst.EOF Debug.Print rst!種類, rst!名前, rst!url Write #1, rst!種類, rst!名前, rst!url rst.MoveNext Loop Close #1 db_Close: rst.Close Set rst = Nothing cnc.Close Set cnc = Nothing End Sub

  • VBSにて、Accessのテーブルを削除

    VBSの質問がここが妥当でなかったら、すみません。 VBSで、Accessの"A_TBL"というテーブルを削除したいのですが、 Set objAccess = CreateObject("Access.Application") objAccess.OpenCurrentDatabase("C:\test\TEST.mdb) objAccess.DoCmd.DeleteObject acTable, "A_TBL" を実行すると、 「実行時エラー:この変数は宣言されていません。:'acTable'] と出力され、エラーになります。どなたか、教えていただければうれしいです。 どうか、お願いします。

  • DAOでACCESSをREADしてEXCELに表示

    お世話になります。 初心者ですが、DAOを使ってACCESSのテーブル(名称”テーブル1”)を全READして全データをEXCELに表示するところまでは出来ました。 (やりたいこと1) 今度は下記の様に"ボタン1"をクリックされたら、Accessに下記の様なデータ(今は"taro"という固定でデータですが将来的には可変的する予定です)を追加したいのですが、既にAccess側に社員番号と氏名が同じレコードがあった場合には追加させないロジックを追加したいのです (やりたいこと2) "ボタン1"をクリックした時に、追加される"taro"のデータはAccessの"テーブル1"の一番下に追加されるようにしたいです。現在は中途半端にテーブル1の真ん中あたりに追加されます。 上記2点につきまして、どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 Windows XP SP3 Excel2003 Sub ボタン1_Click() Dim rst As DAO.Recordset Dim fld As DAO.Field Dim sht As Worksheet Dim rcnt As Long, ccnt As Long '行カウンタ、列カウンタ ' On Error GoTo Err_DAOSample If DBE Is Nothing Then Set DBE = New DAO.DBEngine End If If DB Is Nothing Then Set DB = DBE.OpenDatabase("C:\TEST.mdb") End If Set rst = DB.OpenRecordset("SELECT * FROM テーブル1", dbOpenDynaset) Set sht = ActiveSheet ' レコード追加 With rst .AddNew .Fields("社員番号") = "00000010" .Fields("氏名") = "taro" .Fields("所属") = "管理部" .Fields("年齢") = 19 .Update End With End Sub

  • SELECT文を発行して、ACCESSより取得する方法

    既存のプログラムを元に、 以下のようなソースを作成したのですが、 取得出来ませんでした。 参照設定やパスの設定、SQL文は正しいです。 どこがマズイのでしょうか? アドバイスをお願い致します。 Dim db  As DAO.Database Dim rs  As DAO.Recordset Dim SQL As String 'データベース接続 Set db = OpenDatabase("DBのパス") 'データ検索SQL SQL = "" SQL = " SELECT文 " 'ACCESSより取得 Set rs = db.OpenRecordset(SQL) db.Close rs.Close

  • Accessのテーブル取り込み付いて

    お世話になります。 Access2000のVBAで、テーブルの取り込み処理に ついて教えて下さい。 下記のようなソースで、ACCESSのテーブルを取り込み →エクセルに書き出しをしているのですが、 (1)の箇所で取り込み処理の時間が大量にかかっていることが わかりました。 処理速度が速くなるような、別のコーディングがあるのでしたら 教えて頂きたいので宜しくお願いします。 ----------ソース-------------------------- --------(1)--------------- With CurrentDb.QueryDefs(テーブル) .Parameters("[ID]") = "1111" Set rs = .OpenRecordset End With --------(1)--------------- If (Not rs.EOF) Then oApp.Sheets(1).cells(count, i + 1) = rs(i).Name oApp.Sheets(1).cells(count + 1, 1).CopyFromRecordset rs End If rs.Close Set rs = Nothing db.Close -----------------------------------------

  • ACCESS2000でコードごとの連番を振るには

    規約違反で削除されましたので再質問させていただきます。 ・access2000で部門コードごとに連番を振りたいが、その際「単価」が入力されていないものは省きたい。 アドバイスを受けて以下のコードを作りましたが、連番を付与したあとで単価を削除しても連番が消えません。その次の数値と同じ連番が入ったままになっています。 文字数の関係で関係のありそうな後半だけしか書くことができませんが、よろしくお願いします。 Set dbs = CurrentDb Set rst = dbs.OpenRecordset(sql) Set fldCode = rst.Fields("部門コード") Set fldNo = rst.Fields("番号") If rst.BOF = False Then rst.MoveLast rst.MoveFirst count = 1 code = "00" Do Until rst.EOF rst.Edit If fldCode <> code Then Select Case fldCode Case "01": count = 21 Case "02": count = 31 Case Else: count = 1 End Select code = fldCode End If If rst.Fields("単価") > 0 Then fldNo = count rst.Update count = count + 1 End If rst.MoveNext Loop End If dbs.Close cmd連番_Click_Err_Exit: Exit Sub cmd連番_Click_Err: MsgBox Error$ Resume cmd連番_Click_Err_Exit End Sub

専門家に質問してみよう