Microsoft Access 掲示板

6,718 件中 281 から 320 までを表示しています。
6
beginner 2025/04/15 (火) 15:50:21 61dd6@e1025

skさん ありがとうございます。フィールドの名前とも一致しない識別子の事も大変重要ですね。今まで認識してなかったので勉強になりました。ACCESSは名前で判断されるので注意が必要ですね。
確かに「I'm sorry.」ではエラー出ましたのでReplace・・・にしたらOKでした。
細かい設定をしないと、どこでエラーになるか分かりませんね、いい経験となりました。ACCESSは奥が深く大変ですが、コツコツするしかありません。色々な事を教えて頂けて大変有り難いです。
本当に感謝です。

5

前回質問分でhirotonさんとhatenaさんから回答頂いた下記は
CurrentDb.Execute strSQLでいけたのですが、これは何故でしょうか?

変数 strSQL に格納された SQL 文の中に「パラメータと解釈し得る要素」が含まれておらず、
また SQL 全体において構文上の不備がないからです。

この場合の「パラメータと解釈し得る要素」とは、主に次のようなものです。

  • データベース上のどのテーブル/クエリの名前とも一致しない識別子

  • クエリから呼び出されたテーブル/クエリのどのフィールドの名前とも一致しない識別子

件の INSERT INTO 文 においては、Forms![F_改修履歴に追加設定]![tx受付日付代入用]などの記述は
FROM 句で呼び出されている[T_製造履歴]のどのフィールドの名前とも一致しないため、
暗黙的に「そういう名前のパラメータである」と解釈されます。

strSQL = ", [完成日付]=" &  Format(Me!change_Date, "#yyyy/mm/dd#")

上記の場合は非連結テキストボックス[change_Date]の値が
「 SQL 内における日時リテラル」として組み込まれるよう
文字列の整形と文字列連結が行われており、最終的に
UPDATE 文の中に「パラメータと解釈し得る要素」が
含まれないようになっています。

strSQL & ", [備考]='" & Me!change_Biko & "'"

ちなみに、この時の非連結テキストボックス[change_Biko]の値が
「I'm sorry.」という文字列だった場合、SQL 上の構文エラーが発生します。

文字列リテラルの囲み記号としてシングルクォーテーションを使用する場合は、
文字としてのシングルクォーテーションを次のようにエスケープした方がよいでしょう。


If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Replace(Me!change_Biko, "'", "''", 1, -1, vbBinaryCompare) & "'"

SQL 文のチェック作業を行なう際には、

'イミディエイトウィンドウに変数 strSQL の値( SQL 文)を出力
Debug.Print strSQL
'変数 strSQL に格納された SQL 文を実行
CurrentDb.Execute strSQL

以上のようにしておき、生成された SQL 文が実際に
どのようになっているかを確認してみることをお奨めします。

4
beginner 2025/04/15 (火) 08:57:51 61dd6@e1025

hirotonさん skさん 詳細な回答ありがとうございました。なりほどそういう事だったのですね。
因みに前回質問分でhirotonさんとhatenaさんから回答頂いた下記はCurrentDb.Execute strSQLでいけたのですが、これは何故でしょうか? 更新と追加の違いはありますが(完全に理解出来てなくすみません)

Dim strSQL As String
If Not IsNull(Me!change_Date) Then strSQL = ", [完成日付]=" &  Format(Me!change_Date, "#yyyy/mm/dd#")
If IsDate(Me!change_Kokyaku) Then strSQL = strSQL & ", [顧客ID]=" & Me!change_Kokyaku
If Not IsNull(Me!change_Firm) Then strSQL = strSQL & ", [firmID]=" & Me!change_Firm
If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & ", [製造担当者ID]=" & Me!change_Tanto
If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Me!change_Biko & "'"

If strSQL = "" Then Exit Sub

strSQL = "UPDATE [T_製造履歴] SET " & Mid(strSQL, 3) & " WHERE [check]=True;"

3

なお、任意のコントロールの値を「 SQL 内におけるリテラル」として文字列連結させる手法もよく見られますが、以下のようなケースに備えてエスケープ処理を行うことが望ましいでしょう。

  • コントロールの値(文字列)にシングルクォーテーション( ' )やダブルクォーテーション(")、改行(などの制御文字)が含まれている場合。

  • コントロールの値が Null である場合。

DAO.QueryDef オブジェクトを使用してパラメータの値渡しを直接行なうのであれば、エスケープ処理は不要です。

2

実行時エラー'3061'
パラメータが少なすぎます。4を指定して下さい。

変数 strSQL に格納されている SQL がパラメータクエリになっているからです。

Forms![F_改修履歴に追加設定]![tx受付日付代入用]

Forms![F_改修履歴に追加設定]![tx改修内容代入用]

Forms![F_改修履歴に追加設定]![tx完了日付代入用]

Forms![F_改修履歴に追加設定]![tx_memo代入用]

以上の 4 箇所がそれぞれ暗黙的なパラメータとして認識されています。

そして DAO.Database オブジェクトの Execute メソッドでは、
パラメータへの値渡しを行うことが出来ません。

この場合は、次のいずれかの方法を用いるのが妥当です。

'Access のシステムメッセージの表示を無効にする
DoCmd.SetWarnings False
'Access の[SQL の実行]アクションを呼び出す
DoCmd.RunSQL strSQL
'Access のシステムメッセージの表示を有効にする
DoCmd.SetWarnings True
'フォーム[F_改修履歴に追加設定]のフォームモジュールから実行する場合

Dim dbTarget As DAO.Database
Dim qdfTemp As DAO.QueryDef
Dim lngInsertedCount As Long

'カレントデータベースの参照
Set dbTarget = CurrentDb
'一時的なクエリを作成する
Set qdfTemp = dbTarget.CreateQueryDef("", strSQL)

With qdfTemp
    '各パラメータに値を渡す
    .Parameters("Forms![F_改修履歴に追加設定]![tx受付日付代入用]").Value = Me![tx受付日付代入用].Value
    .Parameters("Forms![F_改修履歴に追加設定]![tx改修内容代入用]").Value = Me![tx改修内容代入用].Value
    .Parameters("Forms![F_改修履歴に追加設定]![tx完了日付代入用]").Value = Me![tx完了日付代入用].Value
    .Parameters("Forms![F_改修履歴に追加設定]![tx_memo代入用]").Value = Me![tx_memo代入用].Value
    'クエリを実行する
    .Execute dbFailOnError
    'クエリによって影響を受けたレコードの件数を取得する
    lngInsertedCount = qdfTemp.RecordsAffected
End With

Set qdfTemp = Nothing
Set dbTarget = Nothing

If lngInsertedCount > 0 Then
    MsgBox "[T_登録中継用_改修履歴]に " & lngInsertedCount & " 件のレコードが追加されました。", _
           vbInformation, _
           "実行完了"
Else
    MsgBox "追加対象となるレコードがありません。", _
           vbInformation, _
           "対象レコードなし"
End If

後者の方法は、主に以下のようなケースにおいて用いるのが適しています。

  • 特定のインターフェース(この場合はフォーム)に依存せず、パラメータに任意の値を直接渡したい場合

  • 実行されたクエリ/SQLによって影響を受けたレコードの件数を取得したい場合

  • DAO.Workspace オブジェクトと連携してトランザクション処理を行いたい場合

1
hiroton 2025/04/14 (月) 14:09:42 c632e@f966d

DoCmdは「ACCESS」の機能を呼び出します
「ACCESS」は、自身がどんなフォームがあるだとか、そこにどんなコントロールがあるだとか認識できます。なので、クエリ実行時(DoCmd.RunSQL)にForms![F_改修履歴に追加設定]![tx受付日付代入用]が何者か判断できます

CurrentDb.Executeは「DAO」の機能を呼び出します
「DAO」はACCESSの構文を解釈する機能はないので、Forms![F_改修履歴に追加設定]![tx受付日付代入用]を一つの、そのような名称のパラメータ(変数)として解釈しようとします。結果、そのようなパラメータを用意していないDAOを実行しようとして、パラメータが少なすぎますとエラーを返してきています

CurrentDb.Executeを使うのであれば、DAOで実行する前に、VBAで値の変換を済ませておく(strSQLの中にフィールド指定の構文を入れない)必要があります

strSQL = _
    " INSERT INTO T_登録中継用_改修履歴" & _
          " (製造履歴ID, 受付日付, 改修内容, 完了日付, MEMO)" & _
    " SELECT" & _
          " 製造履歴ID" & _
          ", #" & Forms![F_改修履歴に追加設定]![tx受付日付代入用] & "#" & _
          ", '" & Forms![F_改修履歴に追加設定]![tx改修内容代入用] & "'" & _
          ", #" & Forms![F_改修履歴に追加設定]![tx完了日付代入用] & "#" & _
          ", '" & Forms![F_改修履歴に追加設定]![tx_memo代入用] & "'" & _
    " FROM T_製造履歴" & _
    " WHERE check=True;"

参考
パラメータクエリを含むSQLをVBAから実行する(hatena chipsさん)


英語でのエラーだと、たとえば

"Run-time error '3061'. Too few parameters. Expected 1."

のようになるようです。ネイティブならすんなり意味が分かるんでしょうか。日本語にするなら

”実行時エラー'3061'
パラメータが少なすぎます。パラメータが1つ必要です。”

隠れた文字が表現されているといいと思いますし、意訳して「パラメータが1つ不足しています」とかなるとわかりやすいんじゃないかと

7
beginner 2025/04/10 (木) 11:35:41 61dd6@e1025

hirotonさん ありがとうございます。大変勉強になります。
""では上手く検出出来ませんでしたが、よく考えると全角スペースには有効ではありませんでした。この非連結テキストボックスには入力し易い様にプロパティに ひらがな 設定してます。なので全角状態になっているからでした。なのでフォーカス喪失後イベントに下記を記述しました。他の変更用非連結部は全てコンボボックスからの選択ですので大丈夫です。
確かに「備考を削除する」の想定もありますね。様子みて作成していきます。
Nullと""、" " の違いは難しいですね。本当にありがとうございました。

     If Me.[change_Biko] = "" Or Me.[change_Biko] = " " Then
        Me.[change_Biko] = Null
     End If
    ```  
6
hiroton 2025/04/10 (木) 10:48:08 b4b71@f966d

通常、非連結のテキストボックスに""(長さ0の文字列)が入ることはありません
フォーム上での人の操作で「何か入力」→「Delete等で削除」を行うと、非連結のテキストボックスの内容はNULLになります。(レコードソースに連結されたコントロールの場合、設定によっては""が入る場合があります)

VBAによる操作等で、直接 Me!テキストボックス = "" のような処理を行うと、非連結のテキストボックスでもその値が""になったりはします

そもそも気にしていなかったのですが、逆に、「備考を削除したい」という場合はないのでしょうか?
「NULLなので更新対象外」と、「内容削除のために""が入力されている」は実作業の上では判別できないので、「備考を削除する」チェックボックスを追加で用意するとかになると思います

また、とりあえず、回答ではIsNull()を使っていますが、NULL""同じように扱われればよいなら Me!テキストボックス & "" = "" で判定できます

Select Case True
    Case Me!Delete_Biko
        strSQL = strSQL & ", [備考]=''"
        '// データ構造によっては
        '// strSQL = strSQL & ", [備考]=NULL"
    Case Me!change_Biko & "" <> ""
        strSQL = strSQL & ", [備考]='" & Me!change_Biko & "'"
End Select

そのほかのコントロールについても、データ型が文字列型以外になるのならばIsDate()IsNumeric()等で判定してあげるとより良いと思います

Not IsNull(Null) ' =>False
Not IsNull("")   ' =>True
IsDate(Null)     ' =>False
IsDate("")       ' =>False
5
beginner 2025/04/10 (木) 09:44:03 61dd6@e1025

hirotonさん hatenaさん ありがとうございます。
なるほどです! 複数FilterのWHERE組立の様にしたらいいのですね(,の件も確かにそうですね)。
コマンドボタンにコード記述したら上手くいきました。
あと一つだけアイデア頂きたいのですがchange_Bikoに誤って""(長さ0の文字列)だけが入力されて、それが更新に反映されるのを防ぎたいのですが、それはどうすればいいでしょうか?

★この履歴の更新ですが登録ミスの変更や仕様変更等が発生した場合の変更をまとめてする為のものです(最終的な正しい履歴にする為の)。

宜しくお願いします。

4
hiroton 2025/04/10 (木) 09:26:05 b4b71@f966d >> 3

あー、そうですね。訂正ありがとうございます
フォームに見えてるデータならDAOでやるかなぁとか考えていたらろくにテストもせず投稿してしまいました

3
hatena 2025/04/09 (水) 23:03:51 修正 >> 1

前者のコードだと、Me!change_Biko がNullのとき、WHERE の直前に , が来ることになりSQLエラーになりますね。
例えば、直前に, を付けておいて最後に先頭の, を削除してSQL文を完成させるようにすればいいでしょう。

Dim strSQL As String
If Not IsNull(Me!change_Date) Then strSQL = ", [完成日付]=" &  Format(Me!change_Date, "\#yyyy/mm/dd\#") 
If IsDate(Me!change_Kokyaku) Then strSQL = strSQL & ", [顧客ID]=" & Me!change_Kokyaku
If Not IsNull(Me!change_Firm) Then strSQL = strSQL & ", [firmID]=" & Me!change_Firm
If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & ", [製造担当者ID]=" & Me!change_Tanto
If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Me!change_Biko & "'"

If strSQL = "" Then Exit Sub

strSQL = "UPDATE [T_製造履歴] SET " & Mid(strSQL, 3) & " WHERE [check]=True;"
CurrentDb.Execute strSQL

後者のコードはカレントレコードの値で上書きしてしまいますね。
「元の値と同じ値で書き換える」なら下記のような感じになるかと。

Dim txDt  As String, koID As String, fiID As String, taID As String, txBiko As String
txDt = IIf(IsNull(Me!change_Date), "[完成日付]", Format(Me!change_Date, "\#yyyy/mm/dd\#"))
koID = Nz(Me.change_Kokyaku, "[顧客ID]") 
fiID = Nz(Me.change_Firm, "[firmID]") 
taID = Nz(Me.change_Tanto, "[製造担当者ID]")
txBiko = IIf(IsNull(Me.change_Biko), "[備考]", "'" & Me.change_Biko & "'")

Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] " & _
         "SET [完成日付]=" & txDt & ", " & _
         "[顧客ID]=" & koID & ", " & _
         "[firmID]=" & fiID & ", " & _
         "[製造担当者ID]=" & taID & ", " & _
         "[備考]=" & txBiko & " " & _
         "WHERE [check]=True;"

CurrentDb.Execute strSQL
2
りんご 2025/04/09 (水) 19:34:15 935bc@0e907

履歴って更新するものなの?

1
hiroton 2025/04/09 (水) 16:18:37 96ec1@f966d

プログラミングにおける変数への値の代入処理は右辺に自分自身(変数)を指定して、自身の内容を書き換える処理が記述できます

x = 1
x = x + 1
Debug.Print x '=>2

ここで記述している「=」は変数への代入命令の記述であるということに注意してください


入力状態をチェックしながらstrSQLを生成していけばいいですね

If IsNull(Me!change_Date) And IsNull(Me!change_Kokyaku) And IsNull(Me!change_Firm) And IsNull(Me!change_Tanto) And IsNull(Me!change_Biko) Then Exit Sub

Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] SET "
If Not IsNull(Me!change_Date) Then strSQL = strSQL & "[完成日付]=#" & Format(Me!change_Date, "yyyy/mm/dd") & "#, " 
If Not IsNull(Me!change_Kokyaku) Then strSQL = strSQL & "[顧客ID]=" & Me!change_Kokyaku & ", "
If Not IsNull(Me!change_Firm) Then strSQL = strSQL & "[firmID]=" & Me!change_Firm & ", "
If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & "[製造担当者ID]=" & Me!change_Tanto & ", "
If Not IsNull(Me!change_Biko) Then strSQL = strSQL & "[備考]='" & Me!change_Biko & "' "
strSQL = strSQL & "WHERE [check]=-1 ;"

CurrentDb.Execute strSQL

もしくは、「元の値と同じ値で書き換える」としても更新分だけを更新することになります

If Me!change_Date & Me!change_Kokyaku & Me!change_Firm & Me!change_Tanto & Me!change_Biko & "" = "" Then Exit Sub

Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] " & _
         "SET [完成日付]=#" & Format(Nz(Me!change_Date, Me!完成日付), "yyyy/mm/dd") & "#, " & _
         "[顧客ID]=" & Nz(Me!change_Kokyaku, Me!顧客ID) & ", " & _
         "[firmID]=" & Nz(Me!change_Firm, Me!firmID) & ", " & _
         "[製造担当者ID]=" & Nz(Me!change_Tanto, Me!製造担当者ID) & ", " & _
         "[備考]='" & Nz(Me!change_Biko, Me!備考) & "' " & _
         "WHERE [check]=-1 ;"

CurrentDb.Execute strSQL

Nz関数を使って、「更新後の値がなければ元の値を使う」ように指示しています

4
beginner 2025/04/08 (火) 08:28:38 61dd6@49105

hatenaさん ありがとうございます。そういった事はあまり情報ありませんので知識乏しい私には大変有り難いです。随時変更していきたいと思います。今回もお世話になりました。

3

テーブル削除→テーブル作成と、データ削除→データ追加では、やはり前者の方が負荷が高いですよね。実際に比較テストしたわけではないので感覚的なものですが。

また、テーブル作成クエリでは細かいプロパティ設定はできないし、リレーションシップを設定してあるとそれを削除してからでないとテーブル削除できないので面倒なことになります。私は運用時にテーブル削除はしない設計にします。

1
hiroton 2025/04/01 (火) 08:38:51 00750@f966d

クロス集計クエリの列見出しとして使うフィールドの[集計]行が[グループ化]に設定されていないからでは?

2
beginner 2025/04/01 (火) 08:34:35 61dd6@0642b

hatenaさん ありがとうございます。
全く思いつかないアイデアです。これはシンプルでいいですね。SELECT Forms!の様にWHERE以外にフォーム値をもってこれるとは知りませんでした。
「テーブル削除→テーブル作成はファイル破損の危険性が高いように思いますので」⇒そういうものとは知りませんでした。
今回の連番とは別ですがSELECT INTOを幾つか使っていますが、この処理は頻繁に使う場面ではしない方がいいのですね?
削除クエリで全レコードを一旦削除して追加クエリで新たに追加した方が安全なのですね?

1

テーブル作成クエリ(SELECT INTO)ですか。
それより、T1テーブルは設計時に作成しておいて、削除クエリでデータ削除、追加クエリ(INSERT INTO)でデータ追加の方がいいかと思います。
テーブル削除→テーブル作成はファイル破損の危険性が高いように思いますので。

削除クエリは簡単にできると思いますので、追加クエリ(INSERT INTO)の作成法を回答します。

まずは、0から予想される追加最大値までの連番のテーブルを作成しておきます。

T_連番

No
1
2
3
100

下記のようなSQLのクエリを作成します。

INSERT INTO T1 (製品ID, serial番号, 製造台数, 備考)
SELECT Forms![フォーム名]![製品ID], Forms![フォーム名]![serial番号初期値]+[連番], Forms![フォーム名]![製造台数], Forms![フォーム名]![備考]
FROM T_連番
WHERE T_連番.連番 < Forms![フォーム名]![製造台数];

この追加クエリを実行すればご希望の結果になります。

1

毎回申し訳ありません。記載ミスでした

2
tokinaito 2025/03/28 (金) 15:18:36 fbda0@184a4

hatena様ありがとうございます。とんでもないちょんぼをしました。orと書くくべきところを
andにしていました。

1

このなかで車庫証明が書類不備等で保留となった場合申請日が入力しないため空欄
となります。
この場合 実行した場合 nullの使い方が不正とでます。どう対処したらよろしいでしょうかご教示お願いします。

下記の部分を修正してください(赤字を緑字に)。

-   If IsNull(管轄署) Then Exit Function  
+   If IsNull(管轄署) Or IsNull(申請日) Then Exit Function  
1

解決しました。

12

原因は参照設定だったのですね。
ありがとうございました。
環境の問題とは思っておりましたが、具体的にご説明頂き納得しました。
今後もよろしくお願いいたします。

11

なるほど、そういうことか。
参照設定を前者の画像のようにしたら私の環境でも再現しました。
VBA Extensibility を ADE の上におくと、VBIDEのPropertyを参照してしまうということですね。

10

現時点での見立てでは、恐らくこういうことなのではないかと。

画像1
画像2

9

prpをObject型にすることで実行できました。

では今度は、変数 prp を次のように宣言した上で
AllOpenForms プロシージャを実行してみたら
どのような結果になるかを確認してください。

    Dim frm As Form, prp As DAO.Property
8

当方の環境ではエラーなく実行できるし、同様の報告を今まで見たことがないので、mkさんの環境依存の問題のようです。

Object型にすることで実行できたということは、Propertyというキーワードが別のものに関連付けられている印象ですね。

新規ファイルを作成してそこで実行してみてうまく行くなら、ファイル破損が原因ということになります。
それでもエラーになるなら、Accessのアンインストール、再インストールを試してみるとかでしょうか。

それでもだめなら、Object型にすることで対処することになるでしょう。

7

sk様のご指摘のprpをObject型にすることで実行できました。
ありがとうございました。
propatyだと型エラーとなる原因分かりますでしょうか。

6

hatena様のAllopenForms()を実行したところ、エラーなく実行できました。
原因はprpを利用していないからだと思います。
以下の通り、For Each prp In frm.Properties から以下3行を追加し、実行したところ、
For Each prp In frm.Properties にて「実行時エラー’13’ 型が一致しません。」が表示されました。
prpの使い方が分かっておらずfrmのように扱うことができないのでしょうか。

Sub AllOpenForms()
    Dim frm As Form, prp As Property

    ' Enumerate Forms collection.
    For Each frm In Forms
        ' Print name of form.
        Debug.Print frm.Name

        Debug.Print frm.Properties.Count
        Debug.Print frm.Properties(0).Name
        Debug.Print frm.Properties(0).value

        For Each prp In frm.Properties
            Debug.Print prp.Name
        Next prp

    Next frm
End Sub

5

どのフォームでも「実行時エラー’13’ 型が一致しません。」が表示されます。
エラー箇所は以下で、黄色く反転されます。
For Each prp In frm.Properties

Dim frm As Form, prp As Property

変数 prp を Object 型または Variant 型として宣言しても
同様の結果となるのでしょうか。

4

参考urlは私のブログですが、
そちらのコードを実行してみましたが、エラーなく説明プロパティの設定、取得ができました。

ちょっと原因が想像つかないですね。

とりあえず適当なフォームを開いておいて、下記のコードを実行するとどうなりますか。

Sub AllOpenForms()
    Dim frm As Form, prp As Property

    ' Enumerate Forms collection.
    For Each frm In Forms
        ' Print name of form.
        Debug.Print frm.Name
       
        Debug.Print frm.Properties.Count
        Debug.Print frm.Properties(0).Name
        Debug.Print frm.Properties(0).Value
    Next frm
End Sub
3

回答ありがとうございます。
目的はバージョン管理をしたく、各オブジェクトのプロパティにバージョン情報をセットしたいです。
以下参考urlです。本来はこちらのプロパティ設定のプログラムで検証しておりましたが、
prpの部分で型エラーとなり、提示したシンプルなサンプルプログラム同様にprpの部分でエラーが発生したことから、
確認させて頂きました。

https://hatenachips.blog.fc2.com/blog-entry-466.html

どのフォームでも「実行時エラー’13’ 型が一致しません。」が表示されます。
エラー箇所は以下で、黄色く反転されます。
For Each prp In frm.Properties

以上よろしくお願いいたします。

2

そもそも、提示のコードは開いているフォームのプロパティを列挙するものですが、
プロパティは大量にあるので、Debug.Printでイミディエイトウィンドウに出力しても、
イミディエイトの表示上限を超えて全てを表示することはできないと思いますので、
あまり意味のないコードだと思いますが、
最終目的は何でしょうか。

1

提示のコードを実行してみましたが問題なく実行できました。
エラーが出たときどのコードが反転表示されてますか。

また、どのフォームを開いているときでもエラーになりますか。それとも特定のフォームの時だけですか。

8
beginner 2025/03/06 (木) 13:52:03 61dd6@6fc74

hatenaさん ありがとうございます。
色々勉強します。
いつも大変お世話になってます。

7

因みに”フォームビューからデザインビューに切り替えられないように” はどうやって可能になるのでしょうか?

いろいろ方法はありますが、
簡単かつ実なのはACCDEファイルに変換してユーザーにはACCDEファイルを配布する方法ですね。
ACCDEファイルはデータペーストして使用はできるがデザインビューやVBAは表示できないファイル形式です。
ACCDBファイルで解決して、完成したらACCDEファイルを作成してそれをユーザーに配布するという運用になります。

他にはオプションの「現在のデータベース」の設定でナビゲーションバー、メニュー、ショートカットメニューを非表示にしておく方法ですね。
これはメニューが表示されないので、メニューフォームとか独自のメニュー、ショートカットメニューを作成しておく必要があります。
デザインを修正する場合はShiftキーを押しながら開くと、オプション設定は無視して開きますので修正することができます。

6
beginner 2025/03/06 (木) 12:28:05 61dd6@6fc74

hatenaさん ありがとうございます。コード自体に問題はなさそうなので安心しました(私の知識不足で間違ったままだと、よくないと思ったので)。因みに”フォームビューからデザインビューに切り替えられないように” はどうやって可能になるのでしょうか?

5

Form_Unloadイベント時ですね。
当方でサンプルを作成して確認したら同様のエラーがでました。

フォームビューからデザインビューに切り替えるとForm_Unloadイベントが発生しますが、通常の閉じる動作と異なる動きをするようです。なんとかならないかちょっといろいろ試してみましたが、難しいですね。

エラー処理を入れればそのエラーを無視するようにはできますが、そのためだけに余分なコードを追加するのも本末転倒のような気がします。

運用時にはフォームビューからデザインビューに切り替えられないようにしておかないとトラブルの元なるのでそのような設定にすべきですし、開発時はフォームビューから直接デザインビューに切り替えないようにすれば済む話だと思います。

4
beginner 2025/03/06 (木) 10:43:44 61dd6@6fc74

hatenaさん Form_Unloadイベント時とボタンクリック時の両方に記述してます。