Access VBA質問箱 IV

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

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


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

【6460】フィールドの選択について Saiyama 05/10/12(水) 22:44 質問[未読]
【6461】Re:フィールドの選択について たん 05/10/13(木) 9:16 回答[未読]
【6463】Re:フィールドの選択について Saiyama 05/10/13(木) 9:40 質問[未読]
【6466】Re:サンプルならネットに山のようにある たん 05/10/13(木) 10:41 回答[未読]
【6469】Re:ではサンプルをまた一つ 小僧 05/10/13(木) 12:00 回答[未読]
【6472】Re:フィールドの選択について 05/10/13(木) 12:19 回答[未読]
【6475】Re:ではサンプルをまた一つ Saiyama 05/10/13(木) 18:13 質問[未読]
【6479】Re:ではサンプルをまた一つ 小僧 05/10/14(金) 8:46 発言[未読]
【6506】Re:ではサンプルをまた一つ Saiyama 05/10/16(日) 20:56 質問[未読]
【6507】Re:ではサンプルをまた一つ 小僧 05/10/16(日) 21:35 発言[未読]
【6522】Re:ではサンプルをまた一つ Saiyama 05/10/17(月) 22:34 質問[未読]
【6524】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 9:04 発言[未読]
【6526】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 9:53 質問[未読]
【6527】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 10:07 回答[未読]
【6528】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 10:21 質問[未読]
【6529】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 10:44 質問[未読]
【6530】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 10:54 回答[未読]
【6533】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 11:40 質問[未読]
【6535】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 11:49 発言[未読]
【6539】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 14:55 質問[未読]
【6541】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 15:19 回答[未読]
【6542】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 15:28 質問[未読]
【6543】Re:ではサンプルをまた一つ 小僧 05/10/18(火) 15:55 発言[未読]
【6547】Re:ではサンプルをまた一つ Saiyama 05/10/18(火) 18:28 お礼[未読]

【6460】フィールドの選択について
質問  Saiyama  - 05/10/12(水) 22:44 -

引用なし
パスワード
   こんばんは
 クエリの中、検索条件を付与すれば、検索条件に該当するレコードが選択される
ことができます。ここでは、フィールドを選択することはかのうでしょうか?
ぜひご伝授ください。
イメージは以下のよう、

テーブルA
部品コード 製造工程  資材1   資材2   資材3   資材4
M4-AC    KA1    A     AD     FG     GB
M5-DF    KA2     A     FD     FK     KG




選択項目:部品コード、製造工程(この二つのフィールドが必須)
     資材1〜資材4から一つを選べるようにしたい。

例、部品コード、製造工程、資材4の場合は、
部品コード 製造工程   資材4
M4-AC    KA1     GB
M5-DF     KA2     KG

【6461】Re:フィールドの選択について
回答  たん  - 05/10/13(木) 9:16 -

引用なし
パスワード
   > クエリの中、検索条件を付与すれば、検索条件に該当するレコードが選択される
>ことができます。ここでは、フィールドを選択することはかのうでしょうか?
>ぜひご伝授ください。
>イメージは以下のよう、
>
>例、部品コード、製造工程、資材4の場合は、
>部品コード 製造工程   資材4
>M4-AC    KA1     GB
>M5-DF     KA2     KG

というように条件に応じたクエリを個々で用意するか、
VBAで動的にSQL文を生成し、クエリとして表示させるかのどちらかでしょう。

【6463】Re:フィールドの選択について
質問  Saiyama  - 05/10/13(木) 9:40 -

引用なし
パスワード
    ご回答いただき、ありがとうございます。
 今回の質問に関して、最初各検索条件に応じて、クエリを作成しましが、
やはり運用上では、約45種類の資材があるから、クエリで個々の対応方法を
止めざる得ない、この掲示版に投稿しました。
>というように条件に応じたクエリを個々で用意するか、
>VBAで動的にSQL文を生成し、クエリとして表示させるかのどちらかでしょう。
 VBAで動的にSQL文の方法をお願いいたします。

【6466】Re:サンプルならネットに山のようにある
回答  たん  - 05/10/13(木) 10:41 -

引用なし
パスワード
   > VBAで動的にSQL文の方法をお願いいたします。

手法は提示しています。
ただ、上記がサンプルの提示を望んでいるのであれば、
私自身のスタンスとして、サンプル提示はしません。

# サンプルを作るということは、その人の仕事を肩代わりするのと
# 変わらないからです。

動的SQLの作成方法はネットに山のように転がっています。
(即レスで「お願いします」と言う前にまずは「調べる」べきでは?)

# その人向けに特化したサンプル作っても応用効かないだろうし。

【6469】Re:ではサンプルをまた一つ
回答  小僧  - 05/10/13(木) 12:00 -

引用なし
パスワード
   ▼Saiyamaさん、たん さん:
こんにちは。

>VBAで動的にSQL文の方法をお願いいたします。

これでは回答する方も回答しにくいですよ ^^;
動的にフィールドを選ぶ方法まで回答者に考えさせてはだめですよ。

今回はどのフィールドを選択するかをユーザがリストボックスから選んで
実行ボタンを押すとクエリが作成される例です。

適当なフォームを作成し、

リストボックス: lstフィールド名
コマンドボタン: クエリ作成

を配置して下さい。
lstフィールド名の方は複数選択を「標準」に設定して下さい。

まず、フォームの読み込み時のイベントに

Private Sub Form_Load()
'要参照 DAO x.x Object Library
Dim RS As DAO.Recordset
Dim i As Long

  Me.lstフィールド名.RowSourceType = "Value List"

  Set RS = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot)
    For i = 0 To RS.Fields.Count - 1
      Me.lstフィールド名.AddItem RS(i).Name
    Next
  RS.Close: Set RS = Nothing

End Sub

のようにイベントを組み込みます。

これでフォームを開くと、リストボックスにフィールドの一覧が表示されると思います。


次にコマンドボタンのクリック時のイベントに

Private Sub クエリ作成_Click()
Dim varS As Variant
Dim strSQL As String
Dim QD As DAO.QueryDef

  If DCount("*", "MSysObjects", "Name = 'Q_Temp'") > 0 Then _
    DoCmd.DeleteObject acQuery, "Q_Temp"
  
  For Each varS In Me.lstフィールド名.ItemsSelected
    strSQL = strSQL & "," & Me.lstフィールド名.ItemData(varS) & " "
  Next
  
  strSQL = "SELECT " & MID(strSQL, 2) _
      & "FROM テーブル名"
  
  Set QD = CurrentDb.CreateQueryDef("Q_Temp", strSQL)
  QD.Close: Set QD = Nothing
End Sub

のように記述します。

リストボックスで選択したフィールドを持つクエリが作成されると思われます。
上記のコードで解らないことがありましたら遠慮なさらずに質問なさって下さいね。


※ あくまでも動的に SQL を作成する例なので Saiyamaさん のやりたい事と
  ずれているかもしれません。

【6472】Re:フィールドの選択について
回答    - 05/10/13(木) 12:19 -

引用なし
パスワード
   フィールドのデータセットを保持するオブジェクトは無いと思われるので、
レコードセットのループ処理で指定したフィールドのコレクションを作成
するのが良いかと思います。

【6475】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/13(木) 18:13 -

引用なし
パスワード
   ▼小僧 さん:
>▼Saiyamaさん、たん さん:
>こんにちは。
>
>>VBAで動的にSQL文の方法をお願いいたします。
>
>これでは回答する方も回答しにくいですよ ^^;
>動的にフィールドを選ぶ方法まで回答者に考えさせてはだめですよ。
大変失礼しました。
>
>今回はどのフィールドを選択するかをユーザがリストボックスから選んで
>実行ボタンを押すとクエリが作成される例です。
>
>適当なフォームを作成し、
できました。
>
>リストボックス: lstフィールド名
もう少し説明していただけないでしょうか?

>コマンドボタン: クエリ作成
作成できました。

【6479】Re:ではサンプルをまた一つ
発言  小僧  - 05/10/14(金) 8:46 -

引用なし
パスワード
   ▼Saiyama さん:
おはようございます。

>>リストボックス: lstフィールド名
>もう少し説明していただけないでしょうか?

そのものずばり、リストボックスを作って、
名前を「lstフィールド名」として下さい。

その後、プロパティの「その他」タブにある「複数選択」を
「標準」または「拡張」にして下さい。

【6506】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/16(日) 20:56 -

引用なし
パスワード
   小僧さん
 こんばんは。
 何度も質問をしてしまい、すみません。よろしくお願いします。

>適当なフォームを作成し、
>
>リストボックス: lstフィールド名
>コマンドボタン: クエリ作成
作成完了。
>を配置して下さい。
>lstフィールド名の方は複数選択を「標準」に設定して下さい。
設定完了。
>まず、フォームの読み込み時のイベントに
>
>Private Sub Form_Load()
>'要参照 DAO x.x Object Library
>Dim RS As DAO.Recordset
>Dim i As Long
>
>  Me.lstフィールド名.RowSourceType = "Value List"
>
>  Set RS = CurrentDb.OpenRecordset("テーブルA", dbOpenSnapshot) 
>    For i = 0 To RS.Fields.Count - 1
>      Me.lstフィールド名.AddItem RS(i).Name
>    Next
>  RS.Close: Set RS = Nothing
>
>End Sub
>
>のようにイベントを組み込みます。
>
>これでフォームを開くと、リストボックスにフィールドの一覧が表示されると思います。
実行しましたら、「コンパイルエラー:メソッドまたはデータメンバが見つかりません」
メッセージが出ています。
変更したのは、以下の二点です。
※OpenRecordsetの「テーブル名」→テーブルAへ書き換えました
※DAO x.x Object Library→DAO 3.6 Object Libraryに設定した

【6507】Re:ではサンプルをまた一つ
発言  小僧  - 05/10/16(日) 21:35 -

引用なし
パスワード
   ▼Saiyama さん:
こんばんは。

Ac2002 以降でないと、AddItem メソッドは使えない模様ですね。
お持ちの Access が2002未満でしたら下のようなコードで試されてみて下さい。

Private Sub Form_Load()
'要参照 DAO x.x Object Library
Dim RS As DAO.Recordset
Dim i As Long
Dim strItem As String

  Me.lstフィールド名.RowSourceType = "Value List"

  Set RS = CurrentDb.OpenRecordset("テーブルA", dbOpenSnapshot)
    For i = 0 To RS.Fields.Count - 1
      'Me.lstフィールド名.AddItem RS(i).Name
      strItem = strItem & ";" & RS(i).Name
    Next
      Me.lstフィールド名.RowSource = Mid(strItem, 2)
  RS.Close: Set RS = Nothing
End Sub

【6522】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/17(月) 22:34 -

引用なし
パスワード
   小僧さん
 こんばんは、返事をいただき、ありがとうございます。
テストの結果を報告します。
>Ac2002 以降でないと、AddItem メソッドは使えない模様ですね。
>お持ちの Access が2002未満でしたら下のようなコードで試されてみて下さい。
こちらの環境:PCのOSはMEですが、Access2002を使っています。
>
以下のコードで、試しましたが、やはり改善されずに、前回と同様なエラーがでて
います。

>Private Sub Form_Load()
>'要参照 DAO x.x Object Library
>Dim RS As DAO.Recordset
>Dim i As Long
>Dim strItem As String
>
>  Me.lstフィールド名.RowSourceType = "Value List"
>
>  Set RS = CurrentDb.OpenRecordset("テーブルA", dbOpenSnapshot)
>    For i = 0 To RS.Fields.Count - 1
>      'Me.lstフィールド名.AddItem RS(i).Name
>      strItem = strItem & ";" & RS(i).Name
>    Next
>      Me.lstフィールド名.RowSource = Mid(strItem, 2)
>  RS.Close: Set RS = Nothing
>End Sub

【6524】Re:ではサンプルをまた一つ
発言  小僧  - 05/10/18(火) 9:04 -

引用なし
パスワード
   ▼Saiyama さん:
おはようございます。

>以下のコードで、試しましたが、やはり改善されずに、前回と同様なエラーがでています。

当方、Ac2002とAc2000でうまくいくのですが…。


>コンパイルエラー:メソッドまたはデータメンバが見つかりません

どの行で色が反転していますでしょうか?

【6526】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 9:53 -

引用なし
パスワード
   小僧さん
おはようございます。

どの行で色が反転していますでしょうか?
Me.lstフィールド名.RowSourceType = "Value List"

{.lstフィールド名}→青く反転している

【6527】Re:ではサンプルをまた一つ
回答  小僧  - 05/10/18(火) 10:07 -

引用なし
パスワード
   ▼Saiyama さん:
こんにちは。

>どの行で色が反転していますでしょうか?
>Me.lstフィールド名.RowSourceType = "Value List"
>
>{.lstフィールド名}→青く反転している

>>そのものずばり、リストボックスを作って、
>>名前を「lstフィールド名」として下さい。

原因はここのようですね。

「このフォームには lstフィールド名 っていうコントロールがないよ」と
怒られている模様です。もう一度リストボックスの名前を確認されてみて下さい。

【6528】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 10:21 -

引用なし
パスワード
   小僧 さん
 大変失礼いたしました。
 原因はやはり{lstフィールド名}というコントロールがなかったです。
設定しまいたら、フィールドリストが表示されました。
お蔭様で、一歩前進!

【6529】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 10:44 -

引用なし
パスワード
   小僧さん

 選択されたフィールドを元にして、クエリ作成の段階でなんかクエリ作成の
コマンドボタンが動いてくれないようです。

一、作業の手順:「クエリ作成」のイベントのクリックに以下のコードを
貼り付け、次にコマンドボタンのクリック時のイベントに
Private Sub クエリ作成_Click()
Dim varS As Variant
Dim strSQL As String
Dim QD As DAO.QueryDef
  If DCount("*", "MSysObjects", "Name = 'Q_Temp'") > 0 Then _
    DoCmd.DeleteObject acQuery, "Q_Temp"
  For Each varS In Me.lstフィールド名.ItemsSelected
    strSQL = strSQL & "," & Me.lstフィールド名.ItemData(varS) & " "
  Next
  strSQL = "SELECT " & MID(strSQL, 2) _
      & "FROM テーブル名"
  Set QD = CurrentDb.CreateQueryDef("Q_Temp", strSQL)
  QD.Close: Set QD = Nothing
End Sub
二、フォームを開き
フィールド一覧が表示され、複数のフールドを選択し(色反転)、
「クエリ作成」コマンドボタンを押しても、動いてない様子です。

【6530】Re:ではサンプルをまた一つ
回答  小僧  - 05/10/18(火) 10:54 -

引用なし
パスワード
   ▼Saiyama さん:
こんにちは。

まず、「クエリ作成」 の クリック時 は [イベント プロシージャ] になっていますでしょうか。
ここが空白ですと、書かれたコードとクリック時の関連が設定されていない事になります。
もう一度「...」をクリックして コードビルダ を選択して下さい。
(1回 コード画面が表示されれば大丈夫です。)


次に、

>動いてない様子です。

フォーム上には変化がありませんが、
クエリ「Q_Temp」というのが出来ていませんでしょうか。

【6533】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 11:40 -

引用なし
パスワード
   小僧さん
>まず、「クエリ作成」 の クリック時 は [イベント プロシージャ] になっていますでしょうか。
[イベント プロシージャ]になっています。


>フォーム上には変化がありませんが、
>クエリ「Q_Temp」というのが出来ていませんでしょうか。
クエリの画面では「Q_Temp」が出来ていません。

【6535】Re:ではサンプルをまた一つ
発言  小僧  - 05/10/18(火) 11:49 -

引用なし
パスワード
   ▼Saiyama さん:
こんにちは。

ここ…かもしれないですね。

>>>※OpenRecordsetの「テーブル名」→テーブルAへ書き換えました

>  strSQL = "SELECT " & MID(strSQL, 2) _
>      & "FROM テーブル名"

この SQL のテーブル名 も 変更してもう一度試されてみて下さい。

【6539】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 14:55 -

引用なし
パスワード
   小僧さん

こんにちは。

>
>>>>※OpenRecordsetの「テーブル名」→テーブルAへ書き換えました
>
>>  strSQL = "SELECT " & MID(strSQL, 2) _
>>      & "FROM テーブル名"
テーブル名→テーブルAに変更したが、動かないです。

【6541】Re:ではサンプルをまた一つ
回答  小僧  - 05/10/18(火) 15:19 -

引用なし
パスワード
   ▼Saiyama さん:
こんにちは。

当方の環境(Ac2002)では問題なく動くのですが…。

  
>  For Each varS In Me.lstフィールド名.ItemsSelected
>    strSQL = strSQL & "," & Me.lstフィールド名.ItemData(varS) & " "
>  Next
>  
>  strSQL = "SELECT " & MID(strSQL, 2) _
>      & "FROM テーブルA"
>  
  '→追加
  Debug.Print strSQL


として、実行した後に Ctrl + G で出現するイミディエトウィンドウに
表示される(はず)の SQL はどうなっていますでしょうか。

【6542】Re:ではサンプルをまた一つ
質問  Saiyama  - 05/10/18(火) 15:28 -

引用なし
パスワード
   小僧さん
 Debug.Print strSQLを追加、イミディエイトに何も表示されていません。


【6543】Re:ではサンプルをまた一つ
発言  小僧  - 05/10/18(火) 15:55 -

引用なし
パスワード
   ▼Saiyama さん:
こんにちは。

うーん、なんででしょうね。
何も表示されない、という事はこのコード自体が反応していないようです。


>一、作業の手順:「クエリ作成」のイベントのクリックに以下のコードを
>貼り付け、次にコマンドボタンのクリック時のイベントに

ここがちょっと気になったのですが、

>>コマンドボタン: クエリ作成

という事で、コマンドボタンの名前が「クエリ作成」になっていますでしょうか。
また、「クエリ作成」という名前を他の所でも使っていませんか?

先ほどと同じく、ちょっとした勘違いが原因になっているような気がします。

【6547】Re:ではサンプルをまた一つ
お礼  Saiyama  - 05/10/18(火) 18:28 -

引用なし
パスワード
   小僧 さん

 こんばんわ、問題解決!!
 ありがとうございました。
 やはり、「クエリ作成」のコントロールがなかったから、反応しなかったです。
いま、順調に動いています。
 コードの解読については、これから習いますので、まだよろしくお願いします。

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