ACCESS 項目がコレクションで見つかりません、の対処法

ACCESSで開発をしていると「項目がコレクションで見つかりません」というエラーメッセージが出ることがあります。

これだけだと何を言っているエラーなのかわかりませんね。
今回は、項目がコレクションで見つかりません、の対処法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
項目がコレクションで見つからない、とは指定したオブジェクトやフィールドが無いこと
「要求された名前、または序数に対する項目がコレクションで見つかりません」というエラーは、VBAのプロシージャで指定したオブジェクトやフィールドが存在しない、という意味です。
ACCESSのコレクションとはオブジェクトの集合体を指します。
例えば、Formsコレクションには現在開いているすべてのフォームが含まれ、Fieldsコレクションには現在開いているテーブルのすべてのフィールドが含まれます。
これらのコレクションの中に無いものを指定している、例えばFormsコレクションであれば存在しないフォーム名を指定していたり、Fieldsコレクションであれば存在しないフィールド名を指定している場合にこのエラーが出るのです。
エラーの解消方法
このエラーを解消するには、エラーとなっている箇所で扱われているフォームやフィールドなどのオブジェクトに誤りがないかを確認することが重要です。
基本的には何らかのミスで存在しないオブジェクトを指定しているため、その部分を修正してください。
コレクションをVBAのプロシージャで使用する場合は一括処理をするシーンが多いため、For Each … Nextステートメントを利用することが多くなります。
そのため、このエラーが出る場合はFor Each … Nextでコレクションを利用している箇所に原因があると考えるとよいでしょう。
サンプルプロシージャ
「項目がコレクションで見つかりません」のエラーが発生するサンプルプロシージャをご紹介します。
このプロシージャをもとに、解決方法をご紹介します。
Dim cnn1 As ADODB.Connection
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim fld As ADODB.Field
Public Sub record_duplicate()
'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
Set rst2 = New ADODB.Recordset
rst2.CursorLocation = adUseClient
'レコードセットを取得
rst1.Open "MST_転記元", cnn, adOpenKeyset, adLockReadOnly
rst2.Open "MST_転記先", cnn, adOpenKeyset, adLockOptimistic
'コピー処理
Do Until rst1.EOF
rst2.AddNew
For Each fld In rst1.Fields
rst2(fld.Name) = rst1(fld.Name)
Next fld
rst2.Update
rst1.MoveNext
Loop
'終了処理
rst1.Close: Set rst1 = Nothing
rst2.Close: Set rst2 = Nothing
cnn.Close: Set cnn = Nothing
End Sub
上記は、MST_転記元テーブルからMST_転記先テーブルへ全フィールドのレコードをコピーするプロシージャです。
このプロシージャを実行した際に項目がコレクションで見つかりません、のエラーが出たとします。

ここでデバッグを押してみましょう。

すると上記のように、
rst2(fld.Name) = rst1(fld.Name)
の箇所でエラーが出ています。
この部分は、rst1(MST_転記元テーブル)のフィールドの値を、rst2(MST_転記先テーブル)のフィールドに代入するという処理をしています。
変数を使ってrst1のすべてのフィールドで同じ処理をするようにしてあります。
ここでエラーが出るということは、MST_転記元テーブルにはあるが、MST_転記先テーブルにはないフィールドが存在するのではないかと考えられます。
ここで、2つのテーブルを見てみましょう。
こちらが転記元テーブルです。

続いて転記先テーブルです。

比べてみると、転記先テーブルには登録日フィールドが無いことがわかります。
つまり、上記のエラーは転記元テーブルの登録日を転記先テーブルにコピーしようとしたが、転記先テーブルに登録日フィールドが無いのでコピーができないというエラーだと分かります。
対処法としては転記先テーブルに登録日フィールドを作成すれば解決できます。
以上、項目がコレクションで見つかりません、の対処法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に200以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

最後までお読みいただき、ありがとうございました。