こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESS2000VBAでエラー「型が一致しません」

ACCESS2000で、フォーム上にボタンを作り、そのボタンをクリック時に
以下のイベント プロシージャを実行させています。

Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("採番_相談者")
Dim Number
rst.MoveFirst
Number = rst!相談者番号
Number = Number + 1
Me.相談者NO = Number '相談者NOはフォーム上のテキストボックスです。

で上記 Set rst = dbs.OpenRecordset("採番_相談者")
の所で、「実行時エラー 13 型が一致しません」とエラーになります。
テーブル:採番_相談者は、オートナンバー型のIDフィールドと相談者番号という7桁のテキスト型で
”1000001”が入っています。(ちなみに、数値型に変えても同じエラーでした。)

詳しい方教えてください。お願いします。

投稿日時 - 2005-06-23 10:20:17

QNo.1467667

すぐに回答ほしいです

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

#1さんの回答に同じく
さらにソースの先頭に「Option Explicit」を記述するともっとベター

このソースは、フォーム上の相談者NOテキストボックスに新規"相談者番号"を取得して表示すものでしょうか?
(余計なおせっかいですが...)ソースに省略箇所がありありなので、ちょっと修正

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
Dim Number As Integer

Set dbs = CurrentDb
strSQL = "select max(相談者番号) as max相談者番号 from 採番_相談者;"
Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot)

If IsNull(rst.Fields("max相談者番号").value) Then
  Number = 1000001
Else
  Number = CInt(rst.Fields("max相談者番号").Value)
  Number = Number + 1
End If

Me.相談者NO.Value = Number

投稿日時 - 2005-06-23 11:34:21

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

これはDAOの記述ですよね。
Access2000はADOがデフォルトなのでまずDAO X.X Object Libraryに参照設定して宣言部でrstを宣言するときにrstがDAOのレコードセットオブジェクトであることを明示的に宣言する必要があります。
Dim rst As DAO.Recordset
のように

またはADOで
Dim Rst As New ADODB.Recordset
として
Rst.Open "採番_相談者", CurrentProject.Connection, adOpenKeyset, adLockPessimistic
でいけるのではと

投稿日時 - 2005-06-23 11:26:24

ANo.1

Recordsetという型はDAOとADOで同じ名前です。
単にRecordsetと記述した場合に、DAOとADOのどちらが採用されるかは、
参照設定の優先順位で決まります。

おそらく、この場合、ADOの方の優先順位が高いため、RecordsetがADOの
Recordsetと解釈されているのでしょう。
ADOのRecordsetはDAOのdbs.OpenRecordsetで戻されるオブジェクトとは
型が違うのでエラーになります。

対処としては、
(1)DAOの優先順位をADOよりも上にする
(2)Dim rst As Recordsetの記述をDim rst As DAO.Recordsetとし、
 DAOのRecordsetであることを明示的に宣言する
の2通りが考えられます。

投稿日時 - 2005-06-23 11:01:57

あなたにオススメの質問