はじめまして、VB初心者のTIといいます。
データベースをAccess97で作成し、VBでデータベースにアクセスし
そのデータベースの、テーブル(ここではA001)の
フィールド(”シリアルNo”というフィールド)の最大値を検索するのに
Dmax関数を使用したいのですが、下記のように記述したところ、
「データベースオブジェクト参照が無効です」とエラーが出てしまいます。
ただ、データベース(アクセスのファイル)を開いて、プログラムを起動してみると
Dmax関数をちゃんと実行してくれて、エラーが出ないのです。
(普通は、こんな使い方はしないですが。)
いろいろ、調べたのですが原因がわからないので、原因が解かる方は
お願いですから、助けてください。
Public Function Demand_Value2(OldTableName As String)
Dim x As Variant
Dim EndNo As Integer
Dim TableName As String
Dim WK As DAO.Workspace
Dim DB As DAO.DataBase
Dim rs2 As DAO.Recordset
TableName = A001 ‘製品の品番
DataBase_Name = “Result200305.mdb”
Dim strSQL As String
'データベースに接続
'Set WK = DBEngine.Workspaces(0)
'Set DB = WK.OpenDatabase("C:\Result\" & DataBase_Name)
Set DB = DBEngine.Workspaces(0).OpenDatabase
("C:\Result\" & DataBase_Name)
strSQL = "SELECT *" & " FROM " & TableName
Set rs2 = DB.OpenRecordset(strSQL, dbOpenDynaset)
x = DMax("シリアルNo", TableName) + 1
Demand_Value2 = x
End Function
DMax 関数は Access.Application の関数であって、
VB の関数ではありません。
それなので DMax 関数を使用するには、
Access.Application オブジェクトを作成して、
使用しましょう。(次のような感じ?)
Dim AcccessApp As Object 'Access.Application
Set AccessApp = CreateObject("Access.Application")
x = AccessApp.DMax("シリアルNo", TableName) + 1
AccessApp.Quit
Set AccessApp = Nothing
こんちは。
ちょっと始めのほうは省略しますが、Recordsetに設定するSQL文を下記のように変更しちゃったらどうですか?
strSQL = "SELECT Max(" & TableName & ".シリアルNo) AS MAX_NUM FROM " & TableName
Set rs2 = DB.OpenRecordset(strSQL, dbOpenDynaset)
If NOT rs2.EOF Then
x = rs2!MAX_NUM + 1
Else
x = 1
End If
いかがでしょう?
Dmax関数がVBA用の関数で、そのままだと
使えないなんて、知りませんでした。
かなり助かりました。
みなさん、ありがとうございました。