アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。

下記VBEを実行すると
 【Error3061 パラメータが少なすぎます。4を指定してください。】
が表示されます。
「4を指定してください。」の解決方法は余り出ていないですので
よろしくお願いします。


     '読み込み時に初期化のプロシージャ呼び出す

Private Sub Form_Load() 'フォーム詠み込み時

Call initializeForm '初期化

End Sub

Private Sub btn_新規_Click() 'btn_新規クリック時

Call initializeForm '初期化

End Sub

      '新規ボタンからに初期化のプロシージャ呼び出す

Private Sub initializeForm() '初期化

Me.txt_No.Value = Null 'txt_Noを空に
Me.txt_機種品番カテゴリー.Value = Null 'txt_機種品番カテゴリーを空に
Me.txt_機種品番.Value = Null 'txt_機種品番を空に
Me.txt_機種品番コード.Value = Null 'txt_機種品番コードを空に
Me.btn_追加.Enabled = True 'btn_追加ボタンを使用可能に
Me.btn_更新.Enabled = False 'btn_更新ボタンを使用不可に
Me.btn_削除.Enabled = False 'btn_削除ボタンを使用不可に
Me.txt_機種品番コード.Enabled = True 'txt_機種品番コードを使用可能に

End Sub


      '読み込みを行なう
Private Sub btn_読込_Click() 'btn_読込ボタンクリックしたとき

Call LoadForm    '読込呼出し

End Sub

Private Sub LoadForm() '読込処理

If IsNull(Me.txt_機種品番コード.Value) Then Exit Sub '機種品番コードが空なら終了

Me.txt_No.Value = Null 'txt_Noをクリア (前のデータが残らないように)
Me.txt_機種品番カテゴリー.Value = Null 'txt_機種品番カテゴリーをクリア
Me.txt_機種品番.Value = Null 'txt_機種品番をクリア

On Error GoTo ErrorHandler

Dim strSQL As String
strSQL = _
"SELECT fid_No, fid_機種品番カテゴリー, fid_機種品番 " & _
"FROM MT_機種品番 " & _
"WHERE fid_機種品番コード = '" & Me.txt_機種品番コード.Value & "';" 'SQLを作成


Dim daoDb As DAO.Database
Set daoDb = CurrentDb

Dim daoRs As DAO.Recordset
Set daoRs = daoDb.OpenRecordset(strSQL)
If daoRs.BOF = True And daoRs.EOF = True Then
MsgBox "対象レコードがありません。", vbInformation, "確認"
GoTo Finally       'レコードがなければ終了
End If

Me.txt_No.Value = daoRs!fid_No '抽出したレコードをテキストボックスへ
Me.txt_機種品番カテゴリー.Value = daoRs!fid_機種品番カテゴリー
Me.txt_機種品番.Value = daoRs!fid_機種品番

Me.btn_追加.Enabled = False 'btn_追加ボタンを使用不可に
Me.btn_更新.Enabled = True 'btn_更新ボタンを使用可能
Me.btn_削除.Enabled = True 'btn_削除ボタンを使用可能
Me.txt_機種品番コード.Enabled = False 'txt_機種品番コードを使用不可
GoTo Finally

ErrorHandler: 'エラートラップ
MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
Err.Description, vbCritical, "エラー"

Finally:
If Not daoRs Is Nothing Then
daoRs.Close
Set daoRs = Nothing
End If
If Not daoDb Is Nothing Then
daoDb.Close
Set daoDb = Nothing
End If

End Sub

A 回答 (3件)

「パラメータが少なすぎます。

4を指定してください。」

「知らないフィールド名が4つあるよ。正しいフィールド名に直してね。」
と読み替えてください。

4つということで
strSQL = _
"SELECT fid_No, fid_機種品番カテゴリー, fid_機種品番 " & _
"FROM MT_機種品番 " & _
"WHERE fid_機種品番コード = '" & Me.txt_機種品番コード.Value & "';"

fid_No, fid_機種品番カテゴリー, fid_機種品番, fid_機種品番コード
が間違っていると思われます。

例えば
fid → fld
とか。
    • good
    • 1

No.1回答>Set daoRs = daoDb.OpenRecordset(strSQL, dbOpenSnapshot) '4番目の引数にdbOpenSnapshotを追加


2番目のパラメータのような。 https://learn.microsoft.com/ja-jp/office/client- …

どこでエラーになってるか解析しにくいので、
》On Error GoTo ErrorHandler
をコメントにして、エラー時デバッガ起動させてみては。
    • good
    • 0
この回答へのお礼

OpenSnapshot追加しましたが同じでした
エラー時のデバッグ試してみます
有難うございました。

お礼日時:2024/04/12 22:08

## VBA エラー 3061 「パラメータが少なすぎます。

4を指定してください。」 の解決策

ご提供いただいた VBA コードで、エラー 3061 「パラメータが少なすぎます。4を指定してください。」 が発生しているとのことですね。原因と解決策を以下に詳しく説明します。

**エラーの原因**

このエラーは、`OpenRecordset` メソッドを実行する際に、必要な引数が不足していることを示しています。具体的には、**4番目の引数**が指定されていないことが原因です。

**4番目の引数**は、レコードセットの種類を指定するもので、以下のいずれかを指定する必要があります。

* `dbOpenDynaset`:ダイナミック レコードセットを作成します。
* `dbOpenSnapshot`:スナップショット レコードセットを作成します。
* `dbOpenTable`:テーブル レコードセットを作成します。
* `dbOpenForm`:フォーム レコードセットを作成します。
* `dbOpenTempTable`:一時テーブル レコードセットを作成します。

**解決策**

エラーを解決するには、`OpenRecordset` メソッドの4番目の引数に適切な値を指定する必要があります。

ご提供いただいたコードの場合、`dbOpenSnapshot` を指定するのが適切です。修正後のコードは以下のようになります。

```vba
Private Sub LoadForm() '読込処理

If IsNull(Me.txt_機種品番コード.Value) Then Exit Sub '機種品番コードが空なら終了

Me.txt_No.Value = Null 'txt_Noをクリア (前のデータが残らないように)
Me.txt_機種品番カテゴリー.Value = Null 'txt_機種品番カテゴリーをクリア
Me.txt_機種品番.Value = Null 'txt_機種品番をクリア

On Error GoTo ErrorHandler

Dim strSQL As String
strSQL = _
"SELECT fid_No, fid_機種品番カテゴリー, fid_機種品番 " & _
"FROM MT_機種品番 " & _
"WHERE fid_機種品番コード = '" & Me.txt_機種品番コード.Value & "';" 'SQLを作成


Dim daoDb As DAO.Database
Set daoDb = CurrentDb

Dim daoRs As DAO.Recordset
Set daoRs = daoDb.OpenRecordset(strSQL, dbOpenSnapshot) '4番目の引数にdbOpenSnapshotを追加

If daoRs.BOF = True And daoRs.EOF = True Then
MsgBox "対象レコードがありません。", vbInformation, "確認"
GoTo Finally 'レコードがなければ終了
End If

Me.txt_No.Value = daoRs!fid_No '抽出したレコードをテキストボックスへ
Me.txt_機種品番カテゴリー.Value = daoRs!fid_機種品番カテゴリー
Me.txt_機種品番.Value = daoRs!fid_機種品番

Me.btn_追加.Enabled = False 'btn_追加ボタンを使用不可に
Me.btn_更新.Enabled = True 'btn_更新ボタンを使用可能
Me.btn_削除.Enabled = True 'btn_削除ボタンを使用可能
Me.txt_機種品番コード.Enabled = False 'txt_機種品番コードを使用不可
GoTo Finally

ErrorHandler: 'エラートラップ
MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
Err.Description, vbCritical, "エラー"

Finally:
If Not daoRs Is Nothing Then
daoRs.Close
Set daoRs = Nothing
End If
If Not daoDb Is Nothing Then
daoDb.Close
Set daoDb = Nothing
End If

End Sub
```

**補足**

* 上記のコード以外にも、エラー 3061 を発生させる可能性はあります。他の可能性としては、SQL 文の記述ミスや、データベース接続に問題があるなどが考えられます。
* エラーが発生した場合は、`Err.Number` と `Err.Description` を確認することで、詳細な情報を得ることができます。
* VBA のコーディングについては、書籍やインターネット上の情報などを参考にすると良いでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A