質問

私は VBA と Access 全般に慣れていないため、別の質問で提案された代替実装を使用しようとしたときにこの問題に遭遇しました (フォームで textBox をクリックするまで Access の DLookup が実行されない)

以下のコードが実行されます。問題は、Me.Key がフォームに表示されているレコードごとに異なることです。これをフォームオープンイベントで実行すると、最初のレコードから Me.Key に割り当てられた最初の値のみが取得されることになります。表示されているレコード/行ごとに Me.Key が異なるようにこれを実行するにはどうすればよいですか?

Dim rs As DAO.Recordset
Dim db As Database
Dim qdf As QueryDef
Dim prm As Parameter

Set db = CurrentDb
Set qdf = db.QueryDefs("[MF INCOME - STREAM MONTHLY]")
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next prm

Set rs = qdf.OpenRecordset(dbOpenDynaset)
rs.FindFirst "[MyMonth]=10 AND [Org_Type]='" & Me.Key & "'"
Me.Oct = rs!SumVal
'...other month assignments
役に立ちましたか?

解決

Me.Key はフォームの詳細セクションにあるコントロールを指していると思います。この場合、コントロールによって取得されるすべての値をリストするには、すべてのレコードを参照する必要があります。その方法の 1 つは次のとおりです。

Dim m_position as Long
for m_position = 1 to Me.recordset.recordcount
   me.seltop = m_position
   debug.print me.key
next m_position

残念ながら、すべての行を閲覧している間、画面が点滅することになります。もちろん、ネット上で VBA 用の「screenFreezer」ユーティリティをいくつか見つけることができます (私が覚えている限りでは、LockWindowUpdate というユーティリティがありました)。

もう 1 つの解決策は、基になるレコードセットのクローンを参照することです (レコードセットを参照すると、以前と同じ画面動作が引き起こされます)。Me.Key コントロールがレコードセットの "Key" 列にバインドされていると仮定すると、コードは次のようになります。

Dim rsClone as DAO.recordset
set rsClone = Me.recordsetclone
if rsClone.EOF and rsClone.BOF then
Else
    rsClone.moveFirst
    Do while not rsClone.EOF
        debug.print rsCLone.fields("Key")
        rsClone.moveNext
    Loop
Endif
set rsClone = nothing

私のお気に入りは、「フリーズ」オプションが追加された最初のものです。コードでフォームの seltop 値と selheight 値を管理できます。これは、ユーザーが選択したレコードだけを参照したり、すべてのレコードを参照した後に元のレコード選択に戻ったりできることを意味します。

編集:

@Benのコメントに続いて、「myControl」コントロールが詳細セクションにあり、バインドされていない場合、行ごとに1つの値を管理できないことを追加します。フォームが「連続」として表示されている場合、コントロールはすべての行で同じ値を持ちます。

"myControl" コントロールがレコードセットの "myField" フィールドにバインドされている場合、次のコードのいずれかによって、"myControl" コントロールの値と "myField" フィールドの値が同時に増加します。各行に異なる値を設定できるようになります。

解決策 1:

Dim m_position as Long
for m_position = 1 to Me.recordset.recordcount
   me.seltop = m_position
   me.controls("myControl") = m_position
next m_position

解決策 2:

Dim rsClone as DAO.recordset, _
    i as long

set rsClone = Me.recordsetclone
if rsClone.EOF and rsClone.BOF then
Else
    rsClone.moveFirst
    i = 1
    Do while not rsClone.EOF
        rsClone.fields("myField") = i
        rsClone.update
        rsClone.moveNext
        i = i+1
    Loop
Endif
set rsClone = nothing

他のヒント

前に提案したように、フォームの現在のイベントを試すことができます:)

そのクエリで何のためにパラメータが必要なのかはまったく明らかではありません。必要な列をすべて含む、パラメータを何も指定せずにクエリを作成することをお勧めします。

次に、このクエリに基づいて小さなフォームを作成します。次に、この小さなフォームを既存のフォームにドロップし、キー値の設定に基づいてデータのいくつかのフィールドを表示できます。(サブフォームのリンク マスターと子の設定を必ずセットアップしてください)。フォームは次のようになります。

alt text
(ソース: ショーカ)

したがって、上記の請求書では、顧客 ID に基づいて顧客情報が表示され、請求書の に関連するテーブルになります。

言い換えれば、別のテーブルのキー値に基づいてデータの複数のフィールドを表示する場合、1 行のコードを記述する必要はありません。したがって、このプロセス全体と目標は、マウスのドラッグ アンド ドロップで実行できます。請求書や注文書のようなものを持っていることがよくありますが、顧客 ID しか持っていません。サブフォームを使用すると、コードを書かずにアドレス全体とデータのいくつかのフィールドを表示できます。レコードからレコードに移動すると、このフィールド セット全体が更新され、常に正しい関連データが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top