同じレコードソースを持つ帳票フォームAとポップアップ画面Bがあり
新規作成ボタンイベントで、Aからで新規入力用のB画面を acAddNew, acDialogで開き
新規レーコドを追加する作業をして
B画面の保存ボタンを押すことでしてレコードを保存しています。
◆B画面の保存ボタンの処理
Private Sub cmd保存_Click()
'保存処理
Dim i As Long
Dim NewKey As Long
Dim SQL As String
Dim lngCurrentRec As Long
If Me.Dirty = True Then
Ret = MsgBox("入力したデータを保存しますか。", vbQuestion + vbOKCancel)
If Ret = vbCancel Then
cmd取消_Click
GoTo exitH
End If
Set Me.ClsDao_ = New ClsDao
SQL = "Select final_value, [更新日時] from T95ID管理表 "
SQL = SQL & "where "
SQL = SQL & " ID_Name = '作業記録ID';"
NewKey = Me.ClsDao_.SelectID(SQL)
Me.作業記録ID.Value = NewKey
Me.BeforeUpdate = ""
DoCmd.RunCommand acCmdSaveRecord
'採番テーブルに新しいNoで更新をする
ClsDao.UpdateID NewKey
modPub.lngNewRecID = NewKey 'Global変数に新しいID NOをセット(親画面で取得するため)
Set ClsDao = Nothing
BeforeUpdate = "[イベント プロシージャ]"
' Me.Visible = False
DoCmd.Close
End If
End Sub
◆B画面の保存ボタンの処理終わり
その後、呼出元のB画面を開くイベントの処理を継続し
A画面を更新し、新規入力されたレコードを選択する処理をしています。
問題は、まず1回目には、新規作成ボタンを押して新規データを登録し
A画面でその新規レコードを選択することが1回目は可能で
同じ事を2回目すると、
※実行時エラー'7951':
RecordSetCloneプロパティに対する不適切な参照を含む式を入力しました。
というエラーが出ます。
その時の画面は、複数行あったのが一レコードだけになってしまい、
各項目のTextboxは、「#Name?」が表示されています。
デバッグボタンを押すと
以下のソースの「Set Rec = Me.RecordsetClone」で止まります。
この解決方法を教えて下さい。
◆A画面の新規作成ボタンのソースの内容開始
Private Sub cmdNewRec_Click()
Dim ClsDao As ClsDao
Dim SQL As String
Dim NewFm As Form
Dim Rec As Recordset
Dim NewNo As Long
Dim MyFm As Form
Dim StrRecSource As String
Set MyFm = Me.Form
StrRecSource = Me.RecordSource
DoCmd.OpenForm "FXX作業記録(NewEntry_連結版)", acNormal, , , acFormAdd, acDialog
If modPub.lngNewRecID > 0 Then
NewNo = modPub.lngNewRecID
Me.RecordSource = StrRecSource
Me.Requery
Set Rec = Me.RecordsetClone <===ここでエラー
Rec.FindFirst "作業記録ID = " & NewNo
If Rec.NoMatch = False Then
' Me.CurrentRecord = Rec.AbsolutePosition
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Rec.AbsolutePosition + 1
Rec.Close
Set Rec = Nothing
End If
End If
End Sub
◆A画面の新規作成ボタンのソースの内容終了
No.1ベストアンサー
- 回答日時:
実行しているファイルの参照設定がどうなっているのか
明記されていないので、憶測でしか言えませんが。
エラーが生じるコードの変数宣言で、
Dim ClsDao As ClsDao
とありますが、これはクラスモジュールで何かDAOを
定義している、ということでしょうか。そうすると
ファイルの参照設定で、DAOはチェックされていない、
あるいはチェックされていてもDAOがADOの上位に
表示されていない、ということなのでしょうかね。
ということであれば一度、参照設定でDAOにチェックを
入れ、
>Dim Rec As Recordset
を、
Dim Rec As DAO.Recordset
としてみてはどうですか?
ところで、もしクラスモジュールでDAOを定義しているならば
その理由は?
この回答への補足
ご回答ありがとうございます。
クラスモジュールでは、頭で、private prvRs as Recordset
となっていました。
ご説明の通り、念のためDAO.Recordset
と書き直しました。
まだ、このテストは実施出来ておりませんが、後ほどしてみます。
クラスに関するご質問ですが、
共通化して、自動採番処理に使用しています。
自動採番時は、このクラスが終了するまでは、できるだけ
Recordsetはクローズしないような作りにして、もし、複数の人が使用する場合には、それに対応できるようにしようかと考えていました。
無理やりなので、もしかするとうまくいかないかもしれませんが。
OpenRecordsetでは、オプションに「dbDenyRead Or dbDenyWrite」を入れています。
これで、他の人が同じテーブルにアクセスしようとすれば、不可能になりますので。
でも同時に出来ないので、意味がないと言えば、意味がないのでしょうか・・・
ご回答ありがとうございます。限られた情報でアドバイスを頂き感謝です。
それと、これは私の推測なのですが
この私の質問の原因に関して、私がついふと思いついたのですが・・・
テーブルA
フォームA帳票型→レコードソース:A
フォームB単票型→recordソース:A
1) Aの開くボタンクリック処理:Bを開く(Dialogモード→新規record入力用しか表示しない)。ここで、、処理が一時止まる。
2) Bの保存ボタン:データをコードで保存し、Bを閉じる
3) (1)の処理の継続する。
・画面をリクエリ-
・フォームのrecordsetでフィールドの値を検索をする
→エラー
この場合に、(1)から(2)に進み新規入力モードでrecordを入れ保存したとき
何故か、Aの画面でも、新規入力モードを覚えているので
A.Requeryとすると
全ての項目が「?Name」となってしまい
Set Rst = me.RecordsetClone
Rst.FindFirst "項目名 = " & 値
を実行しても、Rstの中には何もないですよ・・・というエラーが発生してしまうのでしょうか?
No.2
- 回答日時:
この処理が邪魔しているようですが。
Me.RecordSource = StrRecSource
本当に必要ですか?
この回答への補足
これを消して、
Me.Requeryとしても、2回目に同じ処理を実行すると、Rst.FindFirstのところでRstがおかしいと言って叱られます。
以下、その他のソースです。
明細フォームと単票フォームは、作業記録テーブルというテーブルがレコードソースです。
主キーは、作業記録ID
採番は、採番テーブル(後述)で管理しています。
'明細フォームの新規ボタンクリック実行処理
Private Sub cmdNewRec_Click()
Dim ClsDao As ClsDao
Dim SQL As String
Dim NewFm As Form
Dim Rec As Recordset
Dim NewNo As Long
Dim MyFm As Form
Dim StrRecSource As String
Set MyFm = Me.Form
StrRecSource = Me.RecordSource
modPub.flgBackFromNewEntryWindow = True
modPub.pubStrCallFormName = Me.name
DoCmd.OpenForm "FXX作業記録(NewEntry_連結版)", acNormal, , , acFormEdit, acDialog
'↑ここで、保存ボタン押すまで、処理が止まる
'↓新規入力したレコードのID番号を取得し、それで自画面の検索をし、
' そのレコードを選択する処理
If modPub.lngNewRecID > 0 Then
NewNo = modPub.lngNewRecID
Me.Requery
Set Rec = Me.RecordsetClone
Rec.FindFirst "作業記録ID = " & NewNo '<--- 2回目にこの処理を実行すると、ここでエラーに成る。
If Rec.NoMatch = False Then
' Me.CurrentRecord = Rec.AbsolutePosition
DoCmd.GoToRecord acDataForm, Me.name, acGoTo, Rec.AbsolutePosition + 1
Set Rec = Nothing
End If
End If
End Sub
テーブル情報
【T95ID管理表】
1)主キー
2)主キーフィールド名
3)final_value
4)新規作成日時
5)更新日時
6)削除日時
ここでは、(2)に、「作業記録ID」がセットされている。
上の新規ボタンで開く単票フォームのフッターにある保存ボタンの処理
Private Sub cmd保存_Click()
'保存処理
Dim NewKey As Long
Dim SQL As String
If Me.Dirty = True Then
Ret = MsgBox("入力したデータを保存しますか。", vbQuestion + vbOKCancel)
If Ret = vbCancel Then
cmd取消_Click
GoTo exitH
End If
Set Me.ClsDao_ = New ClsDao
SQL = "Select final_value, [更新日時] from T95ID管理表 "
SQL = SQL & "where "
SQL = SQL & " ID_Name = '作業記録ID';"
'採番テーブルに新しいNoで更新をする
NewKey = ClsDao.UpdateID(SQL)
Me.作業記録ID.Value = NewKey
Me.BeforeUpdate = ""
DoCmd.RunCommand acCmdSaveRecord
modPub.lngNewRecID = NewKey
Set ClsDao = Nothing
BeforeUpdate = "[イベント プロシージャ]"
DoCmd.Close acForm, Me.name
End If
exitH:
BeforeUpdate = "[イベント プロシージャ]"
Exit Sub
EditErr:
MsgBox Err.Number & "(" & Err.Description & ")"
Resume exitH
End Sub
'ClsDAOの処理、採番テーブルからIDを取得する
Public Function UpdateID(strSQL As String) As Long
Dim TempKeyValue As Long
UpdateID = -1
On Error GoTo NKV_Err
' 90ms から 150ms の範囲でランダムに遅延時間を設定しする
DBEngine.SetOption dbLockDelay, 90 + Rnd * 60
If Me.objWS Is Nothing Then
Set Me.objWS = DBEngine(0)
End If
'objDBは、クラスのInitiateでSetする。
On Error GoTo errOpenRec
Set Me.objREC = Me.objDb.OpenRecordset(strSQL, dbOpenDynaset, _
dbDenyRead Or dbDenyWrite)
' リード キャッシュをリフレッシュ
DBEngine.Idle dbRefreshCache
TempKeyValue = Me.objREC.Fields("final_value").Value
NewNo = TempKeyValue + 1
On Error GoTo CommitTransErr
Me.objWS.BeginTrans
Me.objREC.Edit
Me.objREC.Fields("final_value").Value = NewNo '
Me.objREC.Fields("更新日時").Value = Format(Now(), "yyyy/mm/dd hh:MM:ss")
Me.objREC.Update
' 遅延書き込みキャッシュをフラッシュ
Me.objWS.CommitTrans dbForceOSFlush
Me.objREC.Close
Me.objDB.Close
Me.objWS.Close
UpdateID = NewNo
Exit Function
NKV_Abort:
On Error Resume Next
If objREC Is Nothing Then
Me.objREC.Close
End If
If objDB Is Nothing then
Me.objDB.Close
end if
If Me.objWS Is Nothing Then
Me.objWS.Close
End If
Exit Function
NKV_Err:
' On Error Resume Next
MsgBox Err.Number & "(" & Err.Description & ") in GetMaxKey_noUpdate procedure"
Resume NKV_Abort
errOpenRec:
MsgBox Err.Number & "([OpenRecordsetエラー]" & Err.Description & ") in GetMaxKey_noUpdate procedure"
Resume NKV_Abort
CommitTransErr:
On Error Resume Next
Me.objWS.Rollback
GoTo NKV_Abort
End Function
回答して頂きありがとうございます。現在のところ、新規入力フォームとして開かず、編集用モードでフォームを開くようにして問題がありませんので、とりあえず、ここでこの質問を閉じさせていただきます。
原因が今ひとつ分からないのですが、Workspaceの使用、未使用でも何か影響がありそうなのかと考えています。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
Access2000 サブフォームのRecordSet取得法
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
-
4
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
5
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
6
アクセスVBAのMe!と[ ]
Access(アクセス)
-
7
アクセスのUserFormにはInitializeはないのでしょうか?
Access(アクセス)
-
8
accessでレコード更新直後の反映について
その他(データベース)
-
9
2回目に画面のレコードセットの値が読めない
その他(データベース)
-
10
フィルタ後のフォームの件数の取得の仕方
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLで投票ボタンを作りたい
-
oppo reno 7A
-
レイノルズ数が4000より大きい...
-
keygen.exeが実行されない
-
【InstallShield Wizard】 イ...
-
gcc13.2のバグ?
-
お気に入りの登録サイトが削除...
-
Linuxでの開発環境構築や設定の...
-
簡易ガンマ設定ツールの代替
-
フォルダーに緑のレ点と赤の✖が...
-
Beckyのアドレス帳を上下に移動...
-
[python]スクリプトから起動で...
-
アプリをC、Dのどちらに入れる...
-
ユーザーアカウント制御の表示...
-
ノーツ エージェントの実行が...
-
タスクマネージャーが消えた。(...
-
FLASHゲームのセーブデータが消...
-
DOS/V 日本語環境構築
-
WindowsDefender以外のウイルス...
-
インストールしようとしている...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++にてボタン等のサイズ取得
-
VB.net webアプリケーション 戻...
-
xampp Apacheの「Admin」の管理...
-
子画面を読んだ後親画面のRecor...
-
ボタンの背景色を変更する方法
-
検索ボタンなどに使う虫眼鏡の...
-
チェックボックスの値を次画面...
-
HTMLで投票ボタンを作りたい
-
WordPressで1回だけ表示可能な...
-
ipodnanoの画面が真っ暗です!!
-
Change・org(チェン...
-
MFC VC++ 6.0 使用
-
画面の右上の×をキーボードで操...
-
このような画面って、閉じるボ...
-
VB2010で4択問題
-
Web画面の自動更新ボタンを押し...
-
iPad トップアイコンの消し方
-
地デジのNHKでのリモコン投票に...
-
ウォークマンの画面がつきません
-
「改ページプレビュー」ボタン...
おすすめ情報