Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


387 / 2272 ツリー ←次へ | 前へ→

【11922】帳票フォームと単票フォームの連携 さつき 11/1/20(木) 1:26 質問[未読]
【11923】Re:帳票フォームと単票フォームの連携 よろずや 11/1/20(木) 22:00 回答[未読]
【11924】Re:帳票フォームと単票フォームの連携 さつき 11/1/21(金) 19:35 質問[未読]
【11925】Re:帳票フォームと単票フォームの連携 よろずや 11/1/21(金) 23:49 回答[未読]
【11926】Re:帳票フォームと単票フォームの連携 さつき 11/1/22(土) 22:13 質問[未読]
【11927】Re:帳票フォームと単票フォームの連携 よろずや 11/1/23(日) 0:10 発言[未読]
【11928】Re:帳票フォームと単票フォームの連携 さつき 11/1/23(日) 1:20 質問[未読]
【11929】Re:帳票フォームと単票フォームの連携 よろずや 11/1/23(日) 7:47 回答[未読]
【11930】Re:帳票フォームと単票フォームの連携 さつき 11/1/23(日) 20:57 質問[未読]
【11931】Re:帳票フォームと単票フォームの連携 よろずや 11/1/23(日) 23:03 発言[未読]
【11932】Re:帳票フォームと単票フォームの連携 さつき 11/1/24(月) 6:23 質問[未読]
【11933】Re:帳票フォームと単票フォームの連携 よろずや 11/1/24(月) 19:25 回答[未読]
【11934】Re:帳票フォームと単票フォームの連携 さつき 11/1/24(月) 23:52 質問[未読]
【11935】Re:帳票フォームと単票フォームの連携 よろずや 11/1/25(火) 6:40 回答[未読]
【11936】Re:帳票フォームと単票フォームの連携 さつき 11/1/25(火) 20:22 質問[未読]
【11937】Re:帳票フォームと単票フォームの連携 よろずや 11/1/25(火) 21:15 発言[未読]
【11938】Re:帳票フォームと単票フォームの連携 さつき 11/1/25(火) 22:52 質問[未読]
【11939】Re:帳票フォームと単票フォームの連携 よろずや 11/1/25(火) 23:24 回答[未読]
【11941】Re:帳票フォームと単票フォームの連携 さつき 11/1/26(水) 20:16 お礼[未読]
【11940】Re:帳票フォームと単票フォームの連携 11/1/26(水) 10:40 発言[未読]
【11942】Re:帳票フォームと単票フォームの連携 さつき 11/1/26(水) 20:31 お礼[未読]

【11922】帳票フォームと単票フォームの連携
質問  さつき  - 11/1/20(木) 1:26 -

引用なし
パスワード
   こんにちは、さつきと申します。
いつも大変お世話になり、ありがとうございます。

テーブル2つをユニオンクエリーで結合し、連番をつけました。
帳票フォーム上でフォーカスのあるレコードをクリックしたら、同じユニオンクエリーをデータソースとする単票フォームで、そのレコードの詳細が見られるようにしたいのです。
ユニオンクエリ↓
SELECT "a"& format((SELECT COUNT(*) FROM [aa] AS [aaaa] WHERE [aaaa]![ID] <= [aa]![ID]),"0000") AS 連番, aa.質問, aa.回答, aa.リンク
FROM aa;

UNION SELECT "b" & format((SELECT COUNT(*) FROM [bb] AS [bbbb] WHERE [bbbb]![ID] <= [bb]![ID]),"0000") AS 連番, bb.質問, bb.回答, bb.リンク
FROM bb;

帳票フォームのフィールドクリック時イベントに↓
DoCmd.OpenForm FormName:="単票フォーム", OpenArgs:=Me.連番

  With Forms("単票フォーム").RecordsetClone
    .FindFirst "連番 = " & Me.連番
    If Not .EOF Then
      DoCmd.GoToRecord Record:=acGoTo _
              , Offset:=.AbsolutePosition + 1
    End If
  End With

のように書きましたが、
.FindFirst "連番 = " & Me.連番
のところで、「Me.連番を有効なフィールド名または式として認識できません」というエラーがでます。ひとつのテーブルだけをデータソースにしてみたら、元からあるidフィールドを使えばエラーは出ません。
また、リンクフィールドに入っているハイパーリンクデータは、普通の文字列となり、リンクを開くことはできません。選択クエリならリンクは開けるのですが。
どのように直したらいいでしょうか?
どなたかご教示お願いいたします。

【11923】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/20(木) 22:00 -

引用なし
パスワード
   ▼さつき さん:
>ユニオンクエリ↓
>SELECT "a"& format((SELECT COUNT(*) FROM [aa] AS [aaaa] WHERE [aaaa]![ID] <= [aa]![ID]),"0000") AS 連番, aa.質問, aa.回答, aa.リンク
>FROM aa;
>
>UNION SELECT "b" & format((SELECT COUNT(*) FROM [bb] AS [bbbb] WHERE [bbbb]![ID] <= [bb]![ID]),"0000") AS 連番, bb.質問, bb.回答, bb.リンク
>FROM bb;

ユニオンクエリ じゃなくすればよろしいかと。
SELECT A.連番, A.質問, A.回答, A.リンク FROM (
  SELECT "a"& format((SELECT COUNT(*) FROM [aa] AS [aaaa] WHERE [aaaa]![ID] <= [aa]![ID]),"0000") AS 連番, aa.質問, aa.回答, aa.リンク
  FROM aa
  UNION ALL
  SELECT "b" & format((SELECT COUNT(*) FROM [bb] AS [bbbb] WHERE [bbbb]![ID] <= [bb]![ID]),"0000") AS 連番, bb.質問, bb.回答, bb.リンク
  FROM bb
) AS A
ORDER BY A.連番;

UNION は、重複削除処理が無駄に走りますので、
UNION ALL にしましょう。

【11924】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/21(金) 19:35 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございます。

>ユニオンクエリ じゃなくすればよろしいかと。
>SELECT A.連番, A.質問, A.回答, A.リンク FROM (
>  SELECT "a"& format((SELECT COUNT(*) FROM [aa] AS [aaaa] WHERE [aaaa]![ID] <= [aa]![ID]),"0000") AS 連番, aa.質問, aa.回答, aa.リンク
>  FROM aa
>  UNION ALL
>  SELECT "b" & format((SELECT COUNT(*) FROM [bb] AS [bbbb] WHERE [bbbb]![ID] <= [bb]![ID]),"0000") AS 連番, bb.質問, bb.回答, bb.リンク
>  FROM bb
>) AS A
>ORDER BY A.連番;
本日早速教えて頂いた通りにやってみましたが、
クエリとしては、きれいに表示されますが、コードの方はやはり、
.FindFirst "連番 = " & Me.連番
のところで、「a0003を有効なフィールド名または式として認識できません」
というエラーがでます。
バージョンなどの問題でしょうか?ACCESS2003を使っています。
ファイル形式は、ACCESS2000になっています。

ハイパーリンクも選択クエリなら有効なはずが、リンク状態になっていません。
どこを直したらよいでしょうか?

【11925】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/21(金) 23:49 -

引用なし
パスワード
   ▼さつき さん:
>本日早速教えて頂いた通りにやってみましたが、
>クエリとしては、きれいに表示されますが、コードの方はやはり、
>.FindFirst "連番 = " & Me.連番
>のところで、「a0003を有効なフィールド名または式として認識できません」
>というエラーがでます。

あっ、そっちの話ね。
元の idフィールド は、数値型だったけど
今度は文字列型になったのでエラーになる。

.FindFirst "連番 = '" & Me.連番 & "'"

【11926】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/22(土) 22:13 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございます。

> .FindFirst "連番 = '" & Me.連番 & "'"
上記のように記述したらできました。
ありがとうございました。
リンクも、フォームのプロパティでパイパーリンク設定をしたら、
リンクできるようになりました。

もうひとつだけ教えてください。
帳票フォームで使用したフィルター用の変数strfilterをそのまま使って、
単票フォームでも絞り込んだ結果だけを表示させるため、下記のように
しましたが、strfilterの中身はからで、上手く検索できません。
どのように直したらよいでしょうか?
strfilterをグローバル変数にはしないでおきたいのですが。

With Forms("単票フォーム").RecordsetClone
    .Filter = mid(strfilter,6)
    .FilterOn = True
    .FindFirst "連番 = '" & Me.連番 & "'"
    If Not .EOF Then
      DoCmd.GoToRecord Record:=acGoTo _
              , Offset:=.AbsolutePosition + 1
    End If
  End With

【11927】Re:帳票フォームと単票フォームの連携
発言  よろずや  - 11/1/23(日) 0:10 -

引用なし
パスワード
   ▼さつき さん:
>帳票フォームで使用したフィルター用の変数strfilterをそのまま使って、
>単票フォームでも絞り込んだ結果だけを表示させるため、下記のように
>しましたが、strfilterの中身はからで、上手く検索できません。

意味不明です。
変数strfilter なんて初登場ですから、どう使っているのか、
使っているのに中身がから?
なんで mid(strfilter,6) ?

【11928】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/23(日) 1:20 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございます。

>意味不明です。
>変数strfilter なんて初登場ですから、どう使っているのか、
>使っているのに中身がから?
>なんで mid(strfilter,6) ?
失礼いたしました。説明不足でした。

帳票フォームのヘッダーにチェックボックスが複数個あり、
それぞれの更新後イベントに下記の
フィルター設定プロシージャーを呼び出すようにしてあります。

Private Sub setfilter()

Dim strfilter As String
Dim ctl As Access.Control

For Each ctl In Me.Section(acHeader).Controls
if ctl.ControlType = Access.acCheckBox
 If ctl.Value Then
  strfilter = strfilter & " and 資料名 like '*" & ctl.Controls.tag & "*'"
 End If
End if
Next

Me.Filter = mid(strfilter,6)
Me.FilterOn = true

この条件で検索した結果の1レコードを選んでボタンを押すと、
単票フォームを表示させるようにすることが、
おかげさまでできるようになりました。
プロシージャが違うので、strfilterの値を引き継ぐようにしないといけないのかどうかよくわからなかったので、意味不明なご質問になってしまいました。
申し訳ありません。
どうか引き続きご教授お願いいたします。

【11929】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/23(日) 7:47 -

引用なし
パスワード
   各モジュールの先頭に
Option Explicit
を追記しましょう。
そうすれば、その変数が使えないものであればエラーになります。
これは、バグを作り込まない為の基本中の基本です。
フォームで使っている変数を他のフォームからも使いたい場合は、
モジュールの先頭(Sub や Function よりも上という意味)に
Public 変数として宣言します。
他のフォームからは参照のみで書き込みはしないような場合には、
Private 変数にして、Get Property を使うこともあります。
これらを他のフォームから使用する場合は、
フォームを指定して参照することになります。
標準モジュールの Public 変数にした場合は、フォームの指定も不要です。
ただ、Public 変数の多用はバグの温床になります。
使用は最小限に留め、ソースには必ずコメントを付記しましょう。
(なぜバグの温床になるのか?それはプログラムを作るのが人だから)

私的には、デバッグ時の可視化の為に、
変数ではなくフォーム上のテキストボックスにしてしまいます。
(デバッグ時以外は不可視にします)

【11930】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/23(日) 20:57 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございました。

>他のフォームからは参照のみで書き込みはしないような場合には、
>Private 変数にして、Get Property を使うこともあります。
Get Property について調べてみましたが、ちょっと難しそうだったので、

>変数ではなくフォーム上のテキストボックスにしてしまいます。
>(デバッグ時以外は不可視にします)
こちらの方法でやってみました。
帳票フォームでの検索時に、テキストボックスtxtfilterに
検索条件を保存しておき、↓

Private Sub setfilter()

Dim strfilter As String
Dim ctl As Access.Control

For Each ctl In Me.Section(acHeader).Controls
if ctl.ControlType = Access.acCheckBox
 If ctl.Value Then
  strfilter = strfilter & " and 資料名 like '*" & ctl.Controls.tag & "*'"
 End If
End if
Next

Me.Filter = mid(strfilter,6)
Me.FilterOn = true
Me.txtfilter.value = mid(strfilter,6)

単票フォームを表示するボタンのクリックイベントに下記のようにしたら
DoCmd.OpenForm FormName:="単票フォーム", OpenArgs:=Me.連番
  With Forms("単票フォーム").RecordsetClone
    .Filter = Me.txtfilter.value
    .FilterOn = True
    .FindFirst "連番 = '" & Me.連番 & "'"
    If Not .EOF Then
      DoCmd.GoToRecord Record:=acGoTo _
              , Offset:=.AbsolutePosition + 1
    End If
  End With

「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
というエラーがでます。
どのように直したらいいでしょうか?

そもそもOpenArgs:=Me.連番のところでは、簡単に値を渡せるのに、
filter設定は難しいですね。
引き続き、ご指導お願いいたします。

【11931】Re:帳票フォームと単票フォームの連携
発言  よろずや  - 11/1/23(日) 23:03 -

引用なし
パスワード
   ▼さつき さん:
>そもそもOpenArgs:=Me.連番のところでは、簡単に値を渡せるのに、

この渡した値はどこで使っているのですか?
見た限りでは使われていないようですが...

【11932】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/24(月) 6:23 -

引用なし
パスワード
   ▼よろずや さん
ご回答ありがとうございます。

>この渡した値はどこで使っているのですか?
>見た限りでは使われていないようですが...
↓は、値を渡しているのではないのですね?よくわかっていませんでした。
.FindFirst "連番 = '" & Me.連番 & "'"

後、エラーが出る場所を書き忘れておりました。申し訳ありません。
「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
というエラーは↓で出ます。
 .FilterOn = True

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

【11933】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/24(月) 19:25 -

引用なし
パスワード
   ▼さつき さん:
>後、エラーが出る場所を書き忘れておりました。申し訳ありません。
>「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
>というエラーは↓で出ます。
> .FilterOn = True

.FilterOn というプロパティは、Recordset にはありません。
ここで一つ一つ質問するよりも、
ヘルプの見方を覚えた方がよっぽど速いと思います。
知りたい単語をマウスでクリックし(単語全体を選択する必要はありません)
F1キーを押してみましょう。

【11934】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/24(月) 23:52 -

引用なし
パスワード
   ▼よろずや さん
ご回答ありがとうございます。

>.FilterOn というプロパティは、Recordset にはありません。
>ここで一つ一つ質問するよりも、
>ヘルプの見方を覚えた方がよっぽど速いと思います。
>知りたい単語をマウスでクリックし(単語全体を選択する必要はありません)
>F1キーを押してみましょう。
ヘルプは時々見ていますが、いつも難しくてあきらめてしまっていました。
今回は、RecordsetCloneについてヘルプおよびネットで調べてみました。
「フォームのRecordsetCloneオブジェクトを扱うことによって、フィルタリングされたデータ、すなわち画面上に実際に表示されているレコードだけを走査することができます」
と書いてあったので、理屈からいうと、検索後のデータがRecordsetCloneに入っているとしか考えられないのですが、なぜ単票フォームですべてのデータが表示されてしまうのでしょう?

【11935】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/25(火) 6:40 -

引用なし
パスワード
   ▼さつき さん:
>「フォームのRecordsetCloneオブジェクトを扱うことによって、
> フィルタリングされたデータ、すなわち画面上に実際に表示されている
> レコードだけを走査することができます」
> と書いてあったので、理屈からいうと、検索後のデータが
> RecordsetCloneに入っているとしか考えられないのですが、
> なぜ単票フォームですべてのデータが表示されてしまうのでしょう?
RecordsetCloneではなくフォームに対してフィルタを掛ければ、
そこから作ったRecordsetCloneにも
フィルタが掛かっているという意味です。

【11936】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/25(火) 20:22 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございます。

>RecordsetCloneではなくフォームに対してフィルタを掛ければ、
>そこから作ったRecordsetCloneにも
>フィルタが掛かっているという意味です。
Private Sub setfilter()
 ・
 ・
 ・
Me.Filter = mid(strfilter,6)
Me.FilterOn = true
Me.txtfilter.value = mid(strfilter,6)
↑のところでフォームにフィルタをかけた状態で、
単票フォームを呼び出すのでRecordsetCloneにも
フィルタがカかっているのではないかと思ったのですが、
そうではないのですね?

【11937】Re:帳票フォームと単票フォームの連携
発言  よろずや  - 11/1/25(火) 21:15 -

引用なし
パスワード
   ▼さつき さん:
>Private Sub setfilter()
> ・
> ・
> ・
>Me.Filter = mid(strfilter,6)
>Me.FilterOn = true
>Me.txtfilter.value = mid(strfilter,6)

ときどき唐突にコードが登場しますが、
単票/帳票どちらのフォームに書かれているのか明確にしてください。

【11938】Re:帳票フォームと単票フォームの連携
質問  さつき  - 11/1/25(火) 22:52 -

引用なし
パスワード
   ▼よろずや さん
ご回答ありがとうございます。

>ときどき唐突にコードが登場しますが、
>単票/帳票どちらのフォームに書かれているのか明確にしてください。
11930に載せたコードです。
帳票フォームで検索する部分です。

【11939】Re:帳票フォームと単票フォームの連携
回答  よろずや  - 11/1/25(火) 23:24 -

引用なし
パスワード
   ▼さつき さん:
>と書いてあったので、理屈からいうと、検索後のデータがRecordsetCloneに
>入っているとしか考えられないのですが、なぜ単票フォームですべての
>データが表示されてしまうのでしょう?

単票フォームで何をしたいのでしょう?
よく判りません。
1レコードだけ表示したいという話ですか?
それなら、変数strfilter なんて使わずに
フィルターに連番をセットするだけでいいと思うのですが。

【11940】Re:帳票フォームと単票フォームの連携
発言    - 11/1/26(水) 10:40 -

引用なし
パスワード
   雅です。

よろずやさんとのやり取りをざっと見ましたがやりたいことが
いまいちつかめません。
さつきさんもいまいち整理できていないのではないですか?
いま一度何をしたいか整理されてはいかがでしょう?

【11941】Re:帳票フォームと単票フォームの連携
お礼  さつき  - 11/1/26(水) 20:16 -

引用なし
パスワード
   ▼よろずや さん:
ご回答ありがとうございます。

>単票フォームで何をしたいのでしょう?
>よく判りません。
>1レコードだけ表示したいという話ですか?
>それなら、変数strfilter なんて使わずに
>フィルターに連番をセットするだけでいいと思うのですが。
説明の仕方が悪く、やりたいことが伝わっていなかったようで
申し訳ありません。
RecordsetCloneについて調べているうちに
同じ目的のサンプルを見つけました。

Dim rs As DAO.Recordset

DoCmd.OpenForm "単票フォーム", , , Me.Filter
Set rs = Forms!単票フォーム.Recordset.Clone
rs.FindFirst "連番 = '" & Me!連番.Value & "'"
Forms!単票フォーム.Bookmark = rs.Bookmark
Set rs = Nothing

フォームにフィルタをかけた状態で、
単票フォームを呼び出すのでRecordsetCloneにも
フィルタがかかっているのではないかと思っていましたが、
上記のように再度直前でMe.Filterを実行しないといけないようです。

長々おつきあい頂きありがとうございました。
まだ質問したいことが他にありますので、よろしくお願いします。

【11942】Re:帳票フォームと単票フォームの連携
お礼  さつき  - 11/1/26(水) 20:31 -

引用なし
パスワード
   ▼雅 さん
ご回答ありがとうございます。

>よろずやさんとのやり取りをざっと見ましたがやりたいことが
>いまいちつかめません。
>さつきさんもいまいち整理できていないのではないですか?
>いま一度何をしたいか整理されてはいかがでしょう?

説明の仕方が悪かったようで、伝え切れなくて申し訳ありません。
やりたかったことは、帳票フォームで検索した後、
その中から特定のデータを選択して単票フォームで詳細を表示したいのですが、
その単票側でも、帳票フォームで検索した後の絞り込んだデータだけを
詳細確認していきたかったのです。
似たような目的のサンプルを見つけて、下記のようにしてみたら上手く行きました。


帳票フォームでの検索

Private Sub setfilter()

Dim strfilter As String
Dim ctl As Access.Control

For Each ctl In Me.Section(acHeader).Controls
if ctl.ControlType = Access.acCheckBox
 If ctl.Value Then
  strfilter = strfilter & " and 資料名 like '*" & ctl.Controls.tag & "*'"
 End If
End if
Next

Me.Filter = mid(strfilter,6)
Me.FilterOn = true

単票フォームを表示するボタンのクリックイベント
Dim rs As DAO.Recordset

DoCmd.OpenForm "単票フォーム", , , Me.Filter
Set rs = Forms!単票フォーム.Recordset.Clone
rs.FindFirst "連番 = '" & Me!連番.Value & "'"
Forms!単票フォーム.Bookmark = rs.Bookmark
Set rs = Nothing

まだ質問したいことが他にありますので、その際もよろしくお願いします。

387 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free