Access2003 で開発をしています。
サブフォームで選択行のある項目の値を取得したいのですが、
下記ロジック(1)で正しく動作するアプリAと、動作しないアプリBが出てきました。
動作しないアプリは、他の行の値を取ってきてしまいます。

【ロジック(1)】
Set db = CurrentDb
Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenTable)
Cnt = 1
If rs.BOF = True And rs.EOF = True Then

Else
Do Until Cnt = Forms![メイン]![サブフォーム].Form.CurrentRecord
rs.MoveNext
Cnt = Cnt + 1
Loop
   MsgBox ("項目1の値:" & rs![項目1])
End If

色々調べたところ、正しく動かないアプリでは、ロジックを下記(2)のように変更したら、
正しく動きました。

【ロジック(2)】
Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenDynaset)
  MsgBox ("項目1の値:" & rs.Fields("項目1").Value)

こちらのロジックの方が簡単なのもありますが、
テーブルをopenする際、dbOpenTable と dbOpenDynaset がありますが、
サブフォームのレコードを扱う際には、dbOpenDynaset にするべきなのでしょうか。

ロジック(1)で正しく動作していると思われるアプリAは、現在稼動中のため、
ロジックに間違いがなければそのままにしたいのですが、
ロジック(1)の dbOpenDynaset だと間違いで不具合が起きる可能性があるのでしょうか?

ご教授いただければ幸いです。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> サブフォームで選択行のある項目の値を取得したいのですが、



であれば、

MsgBox "項目1の値:" & Forms![メイン]![サブフォーム].Form.Recordset("項目1")

で求まると思います。
「項目1」自体をサブフォーム内で求めていなかったら、
サブフォーム内の一意に特定できる内容を上記ルートで求め、
WHERE 条件に付加して Recordset を得れば良いかと。

提示された処理の前後で何をやっているのかわかりませんが、
今までは、偶々動いていたというレベルと思います。

テーブルを開いただけでは、レコードの並び順は保証されていなかったかと・・・
Dynaset も同様だったかと・・・

偶々だったものが偶々でなくなり、さらに偶々動いたものと比較はできないかと・・・
    • good
    • 0
この回答へのお礼

さらなる回答、ありがとうございました。

教えていただいたロジックで、できました。

本当にありがとうございました。

お礼日時:2014/06/27 14:43

目的は、Forms![メイン]![サブフォーム]の最終レコードの取得でしょうか?


ロジック1・2とも問題です。
テーブルを開いたときのレコードの並び順と
サブフォームの並び順は必ずしも一致しません。
(並び替えやフィルターをかければなおさらの事)

なのでDAOですが、メインフォーム上から実行する場合
Dim rs As DAO.Recordset
Set rs = Me!サブフォーム.Form.Recordset.Clone ’コピーを参照する
rs.MoveLast
MsgBox rs!項目1.Value
rs.close:set rs = Nothing
などでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ロジック(1)、(2)共に正しく動作することがあり、
(2)については正しいものかと思っていました。

最終レコードの取得ではなく、
サブフォーム上で選択している行の取得なのですが、
その場合は、どのようなロジックになるのでしょうか?

度々すみませんが、ご教授いただければ幸いです。

お礼日時:2014/06/27 14:10

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS2003:サブフォームに他のテーブルの項目を表示

ACCESS2003:サブフォームに他のテーブルの項目を表示

現在メインフォームの中にサブフォームを組み込んでいます。

[前提条件]
※1 サブフォームの参照テーブルを仮にテストテーブルとします。
※2 サブフォームの項目をA,B,C,Dの4項目とします。
※3 テスト1テーブルの項目はA,B,Cの3項目とします。
※3 テスト2テーブルの項目はA,D,Eの3項目とします。

その場合、A,B,Cはテスト1テーブルの内容をそのまま表示するので問題ないのですが、
D,Eの項目はテストテーブルに存在しないので、Aをキーにしてテスト2テーブルから
データを取得して表示したいのです。

初歩的な質問で申しわけありませんが、ご回答を宜しくお願いします。

Aベストアンサー

テスト1テーブルとテスト2テーブルをクエリで連結して、それをサブフォームで表示すればいいのでは?

QACCESSのフォームとサブフォームについて

いつもみなさんにはお世話になっております。

ACCESS2000を使用しています。
テーブルA,B,Cを用意しフォームにサブフォーム、リストボックス、ボタンを配置し、リストボックスの表示内容(A,B,C)に合わせてボタンクリックでサブフォームの表示テーブル(A,B,C)を変更したいのですがどうしたら良いのか解りません。

みなさんどうかよろしくお願いします。

Aベストアンサー

テーブルA、B、Cの内容の内、表示させるフィールドが全て同じなら、サブフォームのレコードソースを設定してやればいいと思うんですけど。
Me.サブフォーム1.Form.RecordSource = "テーブル" & Me.リストボックス1
のような感じで。
表示する内容がA、B、Cで異なるのなら、A用、B用、C用のフォームを作っておいて、
Select Case リストボックス1
Case "A"
  Me.サブフォーム1.SourceObject = "A用フォーム"
Case "B"
  Me.サブフォーム1.SourceObject = "B用フォーム"
Case "C"
  Me.サブフォーム1.SourceObject = "C用フォーム"
End Select
のような感じでできるんじゃないでしょうか。
(やったことないので推測ですが。)

QPython 正規表現でsetと=の間の空白で区切られた文字で、一番右端の文字を取得したい

Pythonで、正規表現を使って、
「set 」(半角空白あり、行の先頭とは限らない)と「=」で挟まれている文字で、=側に一番近い文字を取得したいと考えています。
1行に、「set ○○=」が複数ある場合もあります。
以下の例だと、"gg" と "kkkk" を取得したいのですが、
setと=の間の['fffff gg', 'h ii jjj kkkk ']が返ってきてしまい、一番右端の文字が返ってきてくれません。
setと=の間の文字は、半角の空白で区切られていて、いくつあるかは決まっていません。
どのように正規表現を書けばいいでしょうか?
よろしくお願いします。
-----------------------------------------------------------
line = "set fffff gg=FGFGFGFGFGFG set h ii jjj kkkk = HIIJJJKKKKset lll=LLL"
import re
p = re.compile(r'(?: set|^set) ([^=].*?)=', re.IGNORECASE)
print p.findall(line)
>>>
['fffff gg', 'h ii jjj kkkk ']

Pythonで、正規表現を使って、
「set 」(半角空白あり、行の先頭とは限らない)と「=」で挟まれている文字で、=側に一番近い文字を取得したいと考えています。
1行に、「set ○○=」が複数ある場合もあります。
以下の例だと、"gg" と "kkkk" を取得したいのですが、
setと=の間の['fffff gg', 'h ii jjj kkkk ']が返ってきてしまい、一番右端の文字が返ってきてくれません。
setと=の間の文字は、半角の空白で区切られていて、いくつあるかは決まっていません。
どのように正規表現を書けばいいでしょうか?...続きを読む

Aベストアンサー

'(?: set|^set).*?(\S+) *='
でどうでしょうか。

Qマクロで、質問です。 Find関数を使う時。。 Set FoundCell = Range(”A:

マクロで、質問です。
Find関数を使う時。。

Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row

if FoundCell Is Nothing Then
処理
Else
処理

の場合、(格納が合っているかは分かりませんが…)
見つからなかった場合の処理はせずスルーして
次にまだまだあるコードにうつるには処理のところはなんと記述すれば良いのですか?

Aベストアンサー

nk.knさんが書いたIf文は次のような意味ですよね。

If FoundCell Is Nothing Then
  見つからなかった場合の処理
Else
  見つかった場合の処理
End If

見つからなかった場合、その処理をスルーするのであれば、その処理を書かなければ良いだけです。こんな感じです。

If FoundCell Is Nothing Then
Else
  見つかった場合の処理
End If

でも、普通は次のように書きますね。

If Not FoundCell Is Nothing Then
  見つかった場合の処理
End If

QACCESSのサブフォームのフォントサイズを

ACCESSのサブフォームのフォントサイズを変更したいのですが、やりかたがわかりません。

フォームのフォントサイズは容易に変更できるのですが.....。

アドバイスよろしくお願いいたします。

Aベストアンサー

フォームをデザインモードで開いて、サブフォームの上で右クリックすると、「新しいウィンドウでサブフォームを開く」というメニュー項目が表示されるので、それを選択します。
サブフォームが別のウィンドウで開きますので、データシートビューに切り替えると、フォントサイズが変更できます。


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

人気Q&Aランキング

おすすめ情報