Access VBA質問箱 IV

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

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


21 / 500 ページ ←次へ | 前へ→

【12906】CSVファイルのインポート
質問  質問します。  - 15/11/24(火) 14:38 -

引用なし
パスワード
   excelで処理していましたが件数が多いので
方法を変えようとしています。

accessでやればよさそうなのですが
csvファイルのインポートで教えてください。

csvファイルは
="111",="222",="333",
で行数ユニークです。
横の項目数は40個固定です

テーブル出力時に
|111| 222| 333|
とい入れたいのですが何かいい方法教えてください。

お願いします。
・ツリー全体表示

【12905】Re:グループ化の連番
お礼  yoko  - 15/11/11(水) 20:43 -

引用なし
パスワード
   こんばんは。

長文、細かく記載して頂き本当にありがとうございます。
ものすごーーく、いろいろ納得するとこがありました。

ちょっと、まだ試行錯誤しているところ最中ですが、
考えて作ってみたいと思います。
なんとなく出来そうです。

もしかしたら、VBAで作成しているかもしれませんが(笑)
・ツリー全体表示

【12904】Re:グループ化の連番
回答  かるびの  - 15/11/10(火) 16:58 -

引用なし
パスワード
    アクセスは、連番を振るというのは得意ではありません。

 でも、方法がないわけではありません。
 しばしば言及されるのは、DCount 関数を使う方法です。

 今回の場合は、グループ化を行うという点がワンランク難しくしています。


 後から考えていきます。
 御希望の選択クエリを作るためには、

日付    連番
2015/06/06   1
2015/06/07   2
2015/06/08   3

というレコードを持つクエリ(Q連番)を作ることが必要です。
 このクエリとT_部品とを日付フィールドで結合させれば、
御希望の選択クエリになります。

 
 Q連番を作るためには、

日付   
2015/06/06
2015/06/07
2015/06/08

というクエリ(Q日付まとめ)が必要です。
 このクエリは、T_部品から簡単に作れます。
 その方法ですが、日付をグループ化したクエリとするか、
又は、クエリのデザインビューでマウスを右クリックして、
クエリのプロパティシートを出し、
そこにおいて、「UniqueValues/固有の値」プロパティに 「Yes/はい」 を設定します。


 次に、Q連番に戻ります。
 Q連番において、連番フィールドをどのように求めるかです。
 
 「Q連番」クエリにおいて、例えば、日付フィールドの値が2015/06/08であるレコードについて考えてみます。
 このレコードについては、連番フィールドの値を3としたいわけですが、
「Q日付まとめ」において、日付が「2015/06/08」以下であるレコードの個数を
得られれば、3という結果を得られます。


 一定の条件に合致するレコードの個数を求めるには、DCount関数を使います。

 DCount関数の詳しい説明は、ヘルプを見てもらうとして、ヘルプではわかりにくいところを指摘しておきます。
 DCount関数では、第3引数の書き方が難しいんです。


 第3引数の書き方ですが、基本形は「フィールド名 = 値」という形の文字列を指定します。

 ただし、値の書き方にはクセがあります。

 フィールド名のデータ型が数値型の場合は値は何も囲みません
(例「数量 = 200」)。

 日付型の場合は#で値を囲みます(例「生年月日 = #2000/05/01#」)。
 なお、日付は、本来は、米国での記載の仕方に従い、「月/日/年」の順で記載すべきもののようです。
しかし、Windowsの日付設定を年/月/日の順にしておけば、年/月/日でも大丈夫のようです。

 テキスト型の場合はダブルコーテーションで値を囲みます
(例「市町村 = "札幌市"」)。
 なお、第3引数は文字列を指定するので、
文字列であることを示すため、第3引数全体をダブルコーテーションで囲みます。
 そうすると、第3引数全体を囲うダブルコーテーションと、
値を囲うダブルコーテーションとを区別できなくなってしまいます。
 そのため、値を囲うダブルコーテーションはシングルコーテーションにします。
 結局、テキスト型の場合は、例えば、「市町村 = '札幌市'」のようにします。
 なお、この場合、内側のダブルコーテーションは、二重使いとする、
例えば「"市町村 = ""札幌市"""」のようにするのが正式みたいです。
 でも、シングルコーテーションを使った方が見易いので、
ダブルコーテーションの二重使いはあまり使われないようです。


 次の問題ですが、上記の「フィールド名 = 値」における「値」は、
Q連番においてレコードごとに異なるため、これをどう表現するかです。
 私は、ヘルプを熟読しても、ここのところがさっぱりわかりませんでした。

 Q連番において、第3引数は、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
したいわけです。

 この、例えば「2015/06/06」の部分は、
Q連番の日付フィールドの値であるわけなので、
「2015/06/06」の部分は「日付」と置き換えます。
 単純に置き換えると、「"日付 = #日付#"」となるわけですが、
しかし、#はあくまで日付を囲うものであり、
これだと#は日付ではなく「日付」という文字列を囲っていることになってしまうので、この書き方だとエラーになってしまいます。

 そこで、「"日付 = #" & 日付 & "#"」とします。
 「日付」が2つ出てきますが、
左辺の「日付」は、T_部品テーブルの日付フィールドという意味であり、
右辺の、&で囲まれた「日付」は、Q連番の日付フィールドという意味です。
 ここでは、&で囲まれた方の「日付」が
ダブルコーテーションで囲われた中に入っていない
というところが重要なところです。

 つまり、Q連番において、1番目のレコードでは、日付は2015/06/06でしたが、
&で囲われた日付は、ダブルコーテーションの外にいるため、
Q連番の日付フィールドの値と同値、
すなわち、2015/06/06と同じということになります。
 これに「日付 = #」とか「#」とかの文字列を連結させると、
結果、「日付 = #2015/06/06#」という文字列が完成します。
 「2015/06/06」の部分はQ連番においてレコードごとに異なる値となりますので、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
することができます。


 以上のとおり、御希望の選択クエリとするためには、
選択クエリを3つ作ることが必要になります。
 これを1つのクエリで一挙にやってしまおうということは、
多くの場合、できません。
 クエリは、一つ一つ順を追って組み立てていくことが必要です。
 標語風に言えば、「1クエリ1処理」といったところです。


 DCount関数を使う方法は以上ですが、DCount関数などのいわゆるD系関数を
クエリで使うと、クエリが重くなる、ないし遅くなります。
 パソコンの性能にもよりますが、
以前は、「DCount関数をクエリで使うと、遅過ぎて実用に堪えない」
と言われていました。

 ここを速くするためには、上記でいうQ連番をクエリではなく、
テーブルにしてしまうという方法があります。
 この方法は、クエリを開く都度、テーブルを書き替えて、
当該テーブルにQ連番のようなレコードを格納します。
 しかし、この方法は、第1に、VBA必須となります。
 第2に、クエリを開くという操作では
VBAのコードを実行させるきっかけにはできず、
フォームやレポートからでないと使えません。
 そのため、クエリで実現したいという希望には合いませんね。
 でも、D系関数を使うより断然速いです。

 
 なお、参考ページを示しておきます。 

 Recordset_連続番号の振り方:SampleFile071
 ht tp://www.accessclub.jp/samplefile/samplefile_71.htm
・ツリー全体表示

【12903】グループ化の連番
質問  yoko  - 15/11/9(月) 23:47 -

引用なし
パスワード
   こんばんは。
再びで、申し訳ありません。

グループ化したものに連番をつけたいと思っています。

テーブル名:T_部品

日付    部品番号  個数

2015/06/06  A1     2
2015/06/06  A2     4
2015/06/06  A3     3
2015/06/07  A1     1
2015/06/07  A2     2
2015/06/07  A3     2
2015/06/08  A1     4
2015/06/08  A2     5
2015/06/08  A4     3

上記のテーブルがあると致しまして、
日付毎にグループ化に、新たに連番フィールドを追加し番号を
つけたいと思っております。

結果として、
日付    部品番号  個数  連番

2015/06/06  A1     2    1
2015/06/06  A2     4    1
2015/06/06  A3     3    1
2015/06/07  A1     1    2
2015/06/07  A2     2    2
2015/06/07  A3     2    2
2015/06/08  A1     4    3
2015/06/08  A2     5    3
2015/06/08  A4     3    3

2015/06/06 には、1
日付が変われば、 2とカウントしたいと思います。

クエリーで作成しようと思っておりますが、
どのように作成すればよろしいでしょうか?

よろしくお願い致します。
・ツリー全体表示

【12902】Re:週ごとにテキスト保存の仕方
お礼  yoko  - 15/11/4(水) 20:57 -

引用なし
パスワード
   こんばんは。

返事が遅くなり、すいませんでした。
お返事を頂き、試行錯誤しつつでしたが
何とか出来ました。^^

何かヒントを!と思い投函致しましたが、
ご丁寧に返事を頂きまして、本当にありがとうございました。

お陰様で、悩んでたものが解決出来ました♪
・ツリー全体表示

【12901】Re:マイクの音を録音するには
回答  かるびの  - 15/11/2(月) 15:30 -

引用なし
パスワード
    アクセスを使って音を出すようなことは、したことがないため、
的確な回答ができません。

 最初質問を見たときには、VBAの Shell 関数を使って、
音を出すアプリケーションを呼び出すのかなと思いました。

 また、mciSendStringというのは、Office関係の定数かなと思って調べてみたんですが、
Wiondows の API 関数だったんですね。


 VB6での例ですが、

 [VB6]BGMを鳴らす(mciSendString)
 ht tp://www016.upp.so-net.ne.jp/garger-studio/gameprog/vb0162.html

なんてページもあります。
 VBAは、文法はVB6と同様ですから、
というより、VBAはVB6からオフィスソフト用に派生したものですから、
このページを参考にすれば、何とかなりそうです。
・ツリー全体表示

【12900】Re:週ごとにテキスト保存の仕方
回答  かるびの  - 15/11/2(月) 15:02 -

引用なし
パスワード
    VBA必須になります。

 方法ですが、

1 出力したいテキストファイル名を生成
2 当該週のレコードだけを抽出
3 2をテキストファイルに出力
4 1から3をループ

という流れになります。


 2の「当該週のレコードだけを抽出」ですが、
クエリで抽出する方法とレコードセットを使う方法があります。

 クエリで抽出する方法だと、ループにおける各回ごとに異なるクエリを作る必要があります。
 そのクエリは、手作業で作るのは面倒なので、VBAで作ることになります。
 その手順は、DAOの QueryDef オブジェクトの SQL プロパティを毎回書き替える
という方法になります。

 SQL プロパティには、選択クエリのSQL文を指定することになるので、
SQL文を自分で書けることが必要です。
 でも、SQL文について解説しているサイトを見つけ、30分も勉強すれば、
簡単な選択クエリであれば、SQL文で表現できるようになると思います。


 レコードセットで抽出する方法だと、
レコードセット取得に当たって、SQL文を指定することになります。


 3の「テキストファイルに出力」ですが、
2でクエリにより抽出した場合は、TransferText メソッドを使います。
 ほかにも OutputTo メソッドも使えると思いますが、
私は、OutputTo メソッドは使ったことがありません。

 なお、TransferText メソッドだと、レコードの並び順が、クエリとテキストファイルとで
異なる可能性があります。
 テキストファイルでの並び順もクエリどおりにしたいのであれば、
クエリにおいて並び順を指定しておき(SQL文で ORDER BY 句を指定する)、
クエリをレコードセットとして取得して、1レコードずつPrint # ステートメントで
テキストファイルに出力します。


 レコードセットで抽出する方法だと、
レコードごとに Print # ステートメントを使って、テキストファイルに出力します。


>また、その月の週で1,2,4,5週目はデータがあったとして、
>第3週目のデータがなければ、空データをして保存しなければ、
>なりません。 
 レコードの抽出をクエリで行うならば、DCount 関数を使い、
レコードセットで行うならば、RecordCount プロパティを使って、
何件抽出できたかを取得して、レコード件数が0件の場合と、1件以上の場合とで
場合分けすれば(If文)、いいと思います(
・ツリー全体表示

【12899】マイクの音を録音するには
質問  papabanbaru  - 15/11/2(月) 1:02 -

引用なし
パスワード
   お世話になります
マイクの音を録音するにはどのようにすれば良いでしょうか?
環境は.mdbをoffise2007で開いてる状態です
やりたい事具体的には以下になります。

音声録音
再生ボタンで録音を開始する


停止ボタン
保存場所をテキストボックスから読み取り
ファイル名はIDの番号+.mp3で保存
格納テキストボックスに書出し(絶対パス)

再生ボタン
格納テキストボックスよりパスを見て再生させる(絶対パス)

調べた結果
mciSendStringをどうにかすれば良いような気がするのですが
素人過ぎて歯が立ちません。
お教え頂ければ幸いです。
・ツリー全体表示

【12898】Re:オプショングループのオプションボタ...
お礼  naan  - 15/11/2(月) 0:47 -

引用なし
パスワード
   ▼かるびの さん:
>>strTemp = "Nz(項番, '') LIKE '*" & テキスト1 & "*'" & _
>>       " AND Nz(お客様名, '') LIKE '*" & テキスト2 & "*'" & _
>>       " AND Nz(住所, '') LIKE '*" & テキスト3 & "*'" & _
>>       " AND Nz(電話番号, '') LIKE '*" & テキスト4 & "*'" & _
>>       " AND Nz(郵便番号, '') LIKE '*" & テキスト5 & "*'" & _
>>       " AND Nz(対応者1次, '') LIKE '*" & テキスト6 & "*'" & _
>>       " AND Nz(対応日1次, '') LIKE '*" & テキスト7 & "*'" & _
>>       " AND Nz(対応者2次, '') LIKE '*" & テキスト8 & "*'" & _
>>       " AND Nz(対応日2次, '') LIKE '*" & テキスト9 & "*'"
>>
>> Me!サブクエリのサブフォーム.Form.Filter = strTemp
>> Me!サブクエリのサブフォーム.Form.FilterOn = True
>>
>>’今回作成した検索
>>  Select Case Me.グループ
>>   Case 1: Me.サブクエリのサブフォーム.Form.Filter = "進捗='OK'"
>>   Case 2: Me.サブクエリのサブフォーム.Form.Filter = "進捗='NO'"
>>   Case 3: Me.サブクエリのサブフォーム.Form.Filter = "進捗='未定'"
>>   Case 4: Me.サブクエリのサブフォーム.Form.Filter = "進捗='その他'"
>>   Case 5: Me.サブクエリのサブフォーム.Form.Filter = "項番 is not null" ←IDを全て表示
>>   Case 6: Me.サブクエリのサブフォーム.Form.Filter = "(進捗 ='OK' Or 進捗 = 'NG') AND 対応日2次 is null"
>>  End Select
>
> オプショングループにおいてオプション値が2であるオプションボタンが選択されている場合に
>このコードを実行すれば、
>「進捗='NO'」という抽出条件のみでフィルタがかかります。
> 「テキスト1」から「テキスト9」までのテキストボックスによる抽出条件は、
>フィルタに全く反映されません。
>
> その理由ですが、
>「Me!サブクエリのサブフォーム.Form.Filter = strTemp」のコードにより、
>(サブ)フォームのFilterプロパティには、テキストボックスによる抽出条件がセットされますが、
>「Case 2: Me.サブクエリのサブフォーム.Form.Filter = "進捗='NO'"」が実行されることにより、
>(サブ)フォームのFilterプロパティの値が「進捗='NO'」に書き替えられるからです。
>
>
>>テキスト用の検索と
>>グループ用の検索をどの様に組み合わせたらいいのか解りません
>
> テキストボックス・コントロールによる抽出条件と「グループ」コントロールによる抽出条件を
>合体させた抽出条件の文字列を作り、それを(サブ)フォームのFilterプロパティへの代入します。
>
> 具体的には、例えば、
>
>>Case 3: Me.サブクエリのサブフォーム.Form.Filter = "進捗='未定'"
>
>を、
>   Case 3
>    strTemp = strTemp & " OR 進捗='未定'"
>としてやれば、
>テキストボックス・コントロールによる抽出条件と「グループ」コントロールによる抽出条件を
>合体させた抽出条件の文字列がstrTempに格納されます。
>
> 抽出条件文字列が完成した後で初めて、(サブ)フォームのFilterプロパティにstrTempを代入します。
>
>
> ところで、Select Case 文でオプショングループのオプション値を使っているところからすると、
>オプションボタンの複数選択は諦めたんですかね。

かるびの様へ
出来ました!!
何度も読み返しては修正を繰り返し先ほど思い通り行きました。
ご指導有難うございました。
・ツリー全体表示

【12897】週ごとにテキスト保存の仕方
質問  yoko  - 15/11/1(日) 13:53 -

引用なし
パスワード
   こんにちは。
Accessで作ったデータを1週間毎にテキストデータとして保存したいと思っています。

部品番号 発注日    個数 月の何週目 週の月曜日
A     2015/04/06  3   2     2015/04/06
D     2015/04/09  1   2     2015/04/06
B     2015/10/21  5   4     2015/10/19
C     2015/10/26  2   5     2015/10/26

上記のように、データをクエリーでここまで取ってきたのですが、
ここから、悩んでおります。

1週間毎に、テキストで保存をしたいと思っています。
保存名が、「週の月曜日」の名前で保存し、
また、その月の週で1,2,4,5週目はデータがあったとして、
第3週目のデータがなければ、空データをして保存しなければ、
なりません。

お忙しいところ申し訳ありませんが、
よろしくお願い致します。
・ツリー全体表示

【12896】Re:オプショングループのオプションボタ...
回答  かるびの  - 15/10/26(月) 23:57 -

引用なし
パスワード
   >strTemp = "Nz(項番, '') LIKE '*" & テキスト1 & "*'" & _
>       " AND Nz(お客様名, '') LIKE '*" & テキスト2 & "*'" & _
>       " AND Nz(住所, '') LIKE '*" & テキスト3 & "*'" & _
>       " AND Nz(電話番号, '') LIKE '*" & テキスト4 & "*'" & _
>       " AND Nz(郵便番号, '') LIKE '*" & テキスト5 & "*'" & _
>       " AND Nz(対応者1次, '') LIKE '*" & テキスト6 & "*'" & _
>       " AND Nz(対応日1次, '') LIKE '*" & テキスト7 & "*'" & _
>       " AND Nz(対応者2次, '') LIKE '*" & テキスト8 & "*'" & _
>       " AND Nz(対応日2次, '') LIKE '*" & テキスト9 & "*'"
>
> Me!サブクエリのサブフォーム.Form.Filter = strTemp
> Me!サブクエリのサブフォーム.Form.FilterOn = True
>
>’今回作成した検索
>  Select Case Me.グループ
>   Case 1: Me.サブクエリのサブフォーム.Form.Filter = "進捗='OK'"
>   Case 2: Me.サブクエリのサブフォーム.Form.Filter = "進捗='NO'"
>   Case 3: Me.サブクエリのサブフォーム.Form.Filter = "進捗='未定'"
>   Case 4: Me.サブクエリのサブフォーム.Form.Filter = "進捗='その他'"
>   Case 5: Me.サブクエリのサブフォーム.Form.Filter = "項番 is not null" ←IDを全て表示
>   Case 6: Me.サブクエリのサブフォーム.Form.Filter = "(進捗 ='OK' Or 進捗 = 'NG') AND 対応日2次 is null"
>  End Select

 オプショングループにおいてオプション値が2であるオプションボタンが選択されている場合に
このコードを実行すれば、
「進捗='NO'」という抽出条件のみでフィルタがかかります。
 「テキスト1」から「テキスト9」までのテキストボックスによる抽出条件は、
フィルタに全く反映されません。

 その理由ですが、
「Me!サブクエリのサブフォーム.Form.Filter = strTemp」のコードにより、
(サブ)フォームのFilterプロパティには、テキストボックスによる抽出条件がセットされますが、
「Case 2: Me.サブクエリのサブフォーム.Form.Filter = "進捗='NO'"」が実行されることにより、
(サブ)フォームのFilterプロパティの値が「進捗='NO'」に書き替えられるからです。


>テキスト用の検索と
>グループ用の検索をどの様に組み合わせたらいいのか解りません

 テキストボックス・コントロールによる抽出条件と「グループ」コントロールによる抽出条件を
合体させた抽出条件の文字列を作り、それを(サブ)フォームのFilterプロパティへの代入します。

 具体的には、例えば、

>Case 3: Me.サブクエリのサブフォーム.Form.Filter = "進捗='未定'"

を、
   Case 3
    strTemp = strTemp & " OR 進捗='未定'"
としてやれば、
テキストボックス・コントロールによる抽出条件と「グループ」コントロールによる抽出条件を
合体させた抽出条件の文字列がstrTempに格納されます。

 抽出条件文字列が完成した後で初めて、(サブ)フォームのFilterプロパティにstrTempを代入します。


 ところで、Select Case 文でオプショングループのオプション値を使っているところからすると、
オプションボタンの複数選択は諦めたんですかね。
・ツリー全体表示

【12895】Re:オプショングループのオプションボタ...
質問  naan  - 15/10/26(月) 15:09 -

引用なし
パスワード
   ▼かるびの さん:
>>オプショングループのオプションボタンで
>>複数選択や全て表示させるには
>>どの様に変更すれば良いでしょうか?
>
> オプショングループ内のオプションボタンについて複数選択をすることはできません。
> それが仕様です。
>
>
> もしオプションボタンの複数選択をしたいなら、オプショングループは配置せず、
>フォーム上にそのままオプションボタンを配置します。
>
> ただ、オプショングループを使わないと、オプショングループの機能、すなわち、例えば、
>「opt1」という名前のオプションボタンが選択されているときに、
>「opt3」という名前のオプションボタンを選択したら、
>「opt1」の選択が解除される
>という機能は使えなくなります。
> しかし、その機能はVBAを使って実装すればいいです。
>
>
> また、オプション値とは、オプショングループコントロールの値ですから、
>オプショングループを使わなければ、オプション値を取得することはできなくなります。
>
> その代わり、If文あるいはSelect Case文を使って、
>各オプションボタンの値に応じて、フィルタに設定する抽出条件文字列を生成する
>ことになります。

お返事ありがとうございます
だいぶググって以下を作成しましたがテキスト用の検索と
グループ用の検索をどの様に組み合わせたらいいのか解りません

Dim strTemp As String

strTemp = "Nz(項番, '') LIKE '*" & テキスト1 & "*'" & _
       " AND Nz(お客様名, '') LIKE '*" & テキスト2 & "*'" & _
       " AND Nz(住所, '') LIKE '*" & テキスト3 & "*'" & _
       " AND Nz(電話番号, '') LIKE '*" & テキスト4 & "*'" & _
       " AND Nz(郵便番号, '') LIKE '*" & テキスト5 & "*'" & _
       " AND Nz(対応者1次, '') LIKE '*" & テキスト6 & "*'" & _
       " AND Nz(対応日1次, '') LIKE '*" & テキスト7 & "*'" & _
       " AND Nz(対応者2次, '') LIKE '*" & テキスト8 & "*'" & _
       " AND Nz(対応日2次, '') LIKE '*" & テキスト9 & "*'"

 Me!サブクエリのサブフォーム.Form.Filter = strTemp
 Me!サブクエリのサブフォーム.Form.FilterOn = True

’今回作成した検索
  Select Case Me.グループ
   Case 1: Me.サブクエリのサブフォーム.Form.Filter = "進捗='OK'"
   Case 2: Me.サブクエリのサブフォーム.Form.Filter = "進捗='NO'"
   Case 3: Me.サブクエリのサブフォーム.Form.Filter = "進捗='未定'"
   Case 4: Me.サブクエリのサブフォーム.Form.Filter = "進捗='その他'"
   Case 5: Me.サブクエリのサブフォーム.Form.Filter = "項番 is not null" ←IDを全て表示
   Case 6: Me.サブクエリのサブフォーム.Form.Filter = "(進捗 ='OK' Or 進捗 = 'NG') AND 対応日2次 is null"
  End Select

ご教授いただければ幸いです
・ツリー全体表示

【12894】Re:オプショングループのオプションボタ...
回答  かるびの  - 15/10/24(土) 0:19 -

引用なし
パスワード
   >オプショングループのオプションボタンで
>複数選択や全て表示させるには
>どの様に変更すれば良いでしょうか?

 オプショングループ内のオプションボタンについて複数選択をすることはできません。
 それが仕様です。


 もしオプションボタンの複数選択をしたいなら、オプショングループは配置せず、
フォーム上にそのままオプションボタンを配置します。

 ただ、オプショングループを使わないと、オプショングループの機能、すなわち、例えば、
「opt1」という名前のオプションボタンが選択されているときに、
「opt3」という名前のオプションボタンを選択したら、
「opt1」の選択が解除される
という機能は使えなくなります。
 しかし、その機能はVBAを使って実装すればいいです。


 また、オプション値とは、オプショングループコントロールの値ですから、
オプショングループを使わなければ、オプション値を取得することはできなくなります。

 その代わり、If文あるいはSelect Case文を使って、
各オプションボタンの値に応じて、フィルタに設定する抽出条件文字列を生成する
ことになります。
・ツリー全体表示

【12893】オプショングループのオプションボタンで...
質問  naan  - 15/10/23(金) 14:51 -

引用なし
パスワード
   オプショングループのオプションボタンで
複数選択や全て表示させるには
どの様に変更すれば良いでしょうか?

現在はオプショングループ内にオプションボタンが
以下の様に設置されている

OK  オプション値1
NO  オプション値2
未定 オプション値3
その他オプション値4
全て オプション値5*←解らない点(1,2,3,4全て含めて検索したい)
2次未 オプション値6←解らない点(対応日2次が空白でオプション値1,2を含めて検索したい)

'現在以下の様に検索している
Private Sub 検索_Click()
Dim strTemp As String

strTemp = "Nz(項番, '') LIKE '*" & テキスト1 & "*'" & _
       " AND Nz(お客様名, '') LIKE '*" & テキスト2 & "*'" & _
       " AND Nz(住所, '') LIKE '*" & テキスト3 & "*'" & _
       " AND Nz(電話番号, '') LIKE '*" & テキスト4 & "*'" & _
       " AND Nz(郵便番号, '') LIKE '*" & テキスト5 & "*'" & _
       " AND Nz(対応者1次, '') LIKE '*" & テキスト6 & "*'" & _
       " AND Nz(対応日1次, '') LIKE '*" & テキスト7 & "*'" & _
       " AND Nz(対応者2次, '') LIKE '*" & テキスト8 & "*'" & _
       " AND Nz(対応日2次, '') LIKE '*" & テキスト9 & "*'" & _
       " AND Nz(進捗, '') LIKE '*" & オプション & "*'"

 Me!サブクエリのサブフォーム.Form.Filter = strTemp
 Me!サブクエリのサブフォーム.Form.FilterOn = True

End Sub

ご教授頂ければ幸いです
・ツリー全体表示

【12892】Re:リスト外データをテーブルに追加する
お礼  まき  - 15/10/16(金) 17:07 -

引用なし
パスワード
   早速のご回答ありがとうございます

>ところで、このコードですが、「strNewData2 = vbNullString」という式が成り>立つ限り、
>While...Wend間がループされるというものです。・・・

ここは氏名フィールドに値が入っていない場合と認識していました。なので、値が入っていないのは今登録しようとしているレコードのみなのでそれでいいのかな?と思っていました。
で、入力されないままだとここは入力必須だよと入力を促して、入力されないままなら強制的に終わらせるということでした。


>次に、vbNullStringという定数です・・・
>「strNewData = Null」という条件式が成り立つことはあり得ません。
> なので、「While (strNewData = Null)」から「Wend」までのコードが実行され>ることも
>絶対にありません。
> まず、Nullであるかどうかは、「=」では調べられません。IsNull関数を使いま>す。
> 次に、strNewDataは、長整数型の変数ですから、Nullを格納できません。
> なので、「strNewData = Null」という条件式が成り立つことは絶対にありませ>ん。

自分自身空欄というものにはいつも悩まされています、Nullは長整数型のフィールドには格納できないのですね。

ご指摘の件を見直しまして下記のように書き換えたらうまくいきました。

Private Sub 氏名_NotInList(NewData As String, Response As Integer)
  Dim strNewData As String
  Dim strMessage As String
  Dim strNewData2 As String

  While (strNewData = vbNullString)
    strNewData = InputBox("管理IDを入力してください。")
     If (strNewData = vbNullString) Then
       strMessage = "管理IDは必須です。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue

     ElseIf DCount("*", "社員名簿", "管理ID=" & strNewData) Then
      strNewData = vbNullString
      strMessage = "同じ管理IDが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     End If
  Wend
  
  While (strNewData2 = vbNullString)
    strNewData2 = InputBox("社員コードを入力してください。")
     If (strNewData2 = vbNullString) Then
        strMessage = "社員コードは必須です。" & vbCrLf _
             & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     ElseIf DCount("*", "社員名簿", "社員コード= '" & strNewData2 & "'") Then
      strNewData2 = vbNullString
      strMessage = "同じ社員コードが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
     End If
  Wend
  
  CurrentDb.Execute _
     "INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )" _
    & " VALUES ('" & strNewData & "', '" & strNewData2 & "', '" & NewData & "');"
  Response = acDataErrAdded

ExitProcedure:
  Exit Sub

StopOrContinue:
   If (vbYes = MsgBox(strMessage, vbYesNo + vbQuestion)) Then
    Response = acDataErrContinue
    Exit Sub
   End If
   Return
End Sub

ただ、動いているというだけでおかしなコードかもしれませんが、取りあえずご報告させていただきます。
・ツリー全体表示

【12891】Re:リスト外データをテーブルに追加する
回答  かるびの  - 15/10/15(木) 21:11 -

引用なし
パスワード
   >1.While (strNewData2 = vbNullString)〜からWendまでが飛ばされる

 Wendって初めて見ました。
 ヘルプで確認してみましたが、While...Wendっていう構文がVBAにはあるんですね。
 同じことをVBAで書く場合、Do...Loopを使うのが多いと思います。

 ところで、このコードですが、「strNewData2 = vbNullString」という式が成り立つ限り、
While...Wend間がループされるというものです。
 この式が成り立たなければ、While...Wend間が実行されることはありません。

 なので、飛ばされる原因は、「strNewData2 = vbNullString」という式が成り立たない
ということです。


 そこで、この式をもっと細かく見てみます。

 まず、変数strNewData2です。
 この変数は、「Dim strNewData2 As String」で宣言されてから 
「While (strNewData2 = vbNullString)」に至るまでに何も代入されていないので、
「While (strNewData2 = vbNullString)」のコード実行時のstrNewData2の値は、長さ0の文字列です。

 strNewData2は、何も代入されないまま、上記のコードで使われているわけですが、
どんな値が格納されていると考えているのでしょうか。

 
 次に、vbNullStringという定数です。
 私はそんな定数があることを知りませんでした。なので、ヘルプを見てみました。すると、

>vbNullString  
>値 0 を持つ文字列   
>長さ 0 の文字列 ("") とは異なります。外部プロシージャを呼び出す場合に使用します。

とありました。
 また、「"0" = vbNullString」という条件式が成り立つか実験してみましたが、
成り立たないという結果でした。
 ついでに、「0 = vbNullString」という条件式が成り立つか実験してみましたが、
データ型違いのエラーになりました。
 結局、vbNullStringって具体的にはどんな値なのかよくわかりませんでした。

 
 いずれにしても、「strNewData2 = vbNullString」という条件式は、
「"" = 正体不明」という意味になるわけですが、この条件式が成り立つことはあり得ません。
 なので、While (strNewData2 = vbNullString)からWendの間が飛ばされてしまうわけです。


>2.(パラメータが少なすぎます1を指定して下さい)というエラーメッセージ
 アクセスでは頻出のエラーメッセージです。
 しかも、エラーメッセージを見ても、何が悪かったのかを把握できない
という困ったエラーメッセージです。

 このエラーメッセージが出る場合というのは、ほぼ決まっています。
 SQL文中で当該テーブルにないフィールド名が使われている場合です。
 言い換えると、
>"INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )"
の中に「社員名簿」テーブルにないフィールド名があるということです。
 そして、「1を指定して下さい」ということなので、そういうフィールドが1つある
ということです。
 「管理ID」の前の半角スペースあるいは「社員名」の後の半角スペースが怪しいと思います。


 質問では言及されていませんが、ほかにもおかしなところがあります。

 まず、
>Dim strNewData As Long 
です。
 変数の名付け方にハンガリアン記法というのがあります。
 これに従った場合、「strNewData」という変数はString型とするのが通常ですが、
実は長整数型だったわけで、びっくりです。
 ハンガリアン記法に従うなら、長整数型は「lngNewData」という変数名にするのが通常です。

 ま、変数名の名付け方は人それぞれなので、間違いだというわけではありませんが。


 次に
>While (strNewData = Null)
です。
 「strNewData = Null」という条件式が成り立つことはあり得ません。
 なので、「While (strNewData = Null)」から「Wend」までのコードが実行されることも
絶対にありません。

 まず、Nullであるかどうかは、「=」では調べられません。IsNull関数を使います。
 次に、strNewDataは、長整数型の変数ですから、Nullを格納できません。
 なので、「strNewData = Null」という条件式が成り立つことは絶対にありません。
 
 また、strNewDataには、値を何も格納していませんから、
strNewDataに格納されているのは、初期値である0です。
 strNewDataには、何が格納されると考えていますか。


 次に
>If (strNewData = Null) Then
です。
 このIf文のTrueパート(IfからElseまでの間)が実行されることは絶対にありません。
 理由は、上記と同じことです。


 次に
>strNewData = Null
 です。
 このコードがもしも実行されれば、データ型違いというエラーになります。
 長整数型の変数には、Nullを格納できないからです。
 
 
 次に
>GoSub StopOrContinue
です。
 GoSubってあまり見ないです。
 Gotoを使うか、サブプロシージャを呼び出すことが多いと思います。


 次に
>Response = acDataErrAdded
です。
 NonListイベントはそれほど使ったことはないのですが、
多分、追加クエリの前にこのコードを実行しないとだめだと思います。
 ヘルプの使用例でも、データを追加する前に「Response = acDataErrAdded」が書かれていました。


 それから、
>While (strNewData = Null)

>While (strNewData2 = vbNullString)
のループです。
 現状では条件式が成り立つことがなく、ループ内に入れないため、問題が顕在化していませんが、
もしもこのループの中に入ってしまえば、無限ループになります。
 ループ内での処理から見て、ループ抜けの条件が成り立つことがないからです。


 最後に、私は明日から温泉です。次のレスができるのは週明けになります。
・ツリー全体表示

【12890】リスト外データをテーブルに追加する
質問  まき  - 15/10/15(木) 16:01 -

引用なし
パスワード
   リスト外データをテーブルに追加するコードを書きましたがうまく動かないのでご教示の程よろしくお願いします
1.While (strNewData2 = vbNullString)〜からWendまでが飛ばされる
2.(パラメータが少なすぎます1を指定して下さい)というエラーメッセージ

Private Sub 社員名_NotInList(NewData As String, Response As Integer)

  Dim strNewData As Long  
  Dim strMessage As String 
  Dim strNewData2 As String  
  Dim strMessage2 As String 

  While (strNewData = Null)
    strNewData = InputBox("管理IDを入力してください。")
    If (strNewData = Null) Then
      strMessage = "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
 
    ElseIf DCount("*", "社員名簿", "'管理ID=" & strNewData & "'") Then
  
      strNewData = Null
      strMessage = "同じ管理IDが登録済みです。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
    End If
  Wend
  
  While (strNewData2 = vbNullString) -------------------------------1.ここからWendまで飛ばされる(Inputboxが出ない)
    strNewData2 = InputBox("社員コードを入力してください。")
    If (strNewData2 = vbNullString) Then
      strMessage2 = "社員コードは必須です。" & vbCrLf _
            & "新しいデータの登録を中止しますか?"
      GoSub StopOrContinue
    End If
  Wend

  CurrentDb.Execute _
    "INSERT INTO 社員名簿 ( 管理ID, 社員コード, 社員名 )" ------------2.エラー(パラメータが少なすぎます1を指定して下さい)
    & " VALUES (strNewData, '" & strNewData2 & "', '" & NewData & "');"
  Response = acDataErrAdded  

ExitProcedure:
  Exit Sub

StopOrContinue:
  If (vbYes = MsgBox(strMessage, vbYesNo + vbQuestion)) Then
    Response = acDataErrContinue
    Exit Sub
  End If
  Return
End Sub

最後迄行くまでにエラーが出るのでコードが間違っている箇所はまだあるかもしれませんが
よろしくお願いします
・ツリー全体表示

【12889】Re:更新ログ付加のやり方
お礼  素人  - 15/10/1(木) 9:49 -

引用なし
パスワード
   ▼かるびの様

早速ご回答頂き、ありがとうございました。

フォーム内のレコードソースとして既に「Data_estimated_amount」というテーブルを読込ませて、新規レコード追加と既存のレコードの修正時に対する更新ログを付けたいと思いやってみました。

> ADOは、使ったことがないので、よくわからないのですが、
>このコードは、「Data_estimated_amount」テーブルのレコードセットを開くというコードですよね。

はい、そうです。


> レコードセットを開くと、レコードが1レコード以上あるならば、
>先頭レコードがカレントレコードになります。
> カレントレコードになるということは、そのレコードのみデータの読み書きができるということです。


実際この様な結果になったので薄々は分かってましたが、やっぱりそうなんですね。確信出来ました。

新規追加だけなら何とか出来そうですが、修正時の対応はもう少し考えてみます。

お忙しい中、時間を割いて頂きありがとうございました。
・ツリー全体表示

【12888】Re:更新ログ付加のやり方
回答  かるびの  - 15/10/1(木) 0:54 -

引用なし
パスワード
   >rs.Open "Data_estimated_amount", cn, adOpenKeyset, adLockOptimistic

 ADOは、使ったことがないので、よくわからないのですが、
このコードは、「Data_estimated_amount」テーブルのレコードセットを開くというコードですよね。

 レコードセットを開くと、レコードが1レコード以上あるならば、
先頭レコードがカレントレコードになります。
 カレントレコードになるということは、そのレコードのみデータの読み書きができるということです。
 

>rs!日付 = Date
>rs!時間 = Time
>rs!登録者 = Me.登録者

 これらのコードは、カレントレコードの各フィールドの値を書き替えています。
 レコードセットを開いてから、レコードの移動を行っていないので、
結局、先頭レコードの値が書き替えられます。


 つまり、このプロシージャを何度実行しようとも、先頭レコードの値をその都度上書きしているだけ
という状況です。


 更新ログをつけるためには、
その都度、「Data_estimated_amount」テーブルに新規レコードを追加して、
当該新規レコードにおける各フィールドの値を書き替える
という操作をする必要があります。

 DAOであれば、
>rs!日付 = Date
のコードの前に、
   rs.AddNew
を実行すれば、レコードセットに新規レコードが追加され、それがカレントレコードになるので、
>rs!日付 = Date
により、新規レコードの日付フィールドにDate関数の返り値が格納されます。

 なお、「rs.Update」を実行しないと、折角「rs!日付 = Date」で書き替えても、テーブルに保存されません。

 ADOの場合も、AddNewメソッドとか、Updateメソッドで良かったように思いますが、
いかんせん、ADOは使ったことがないので、はっきりしたことはわかりません。
 悪しからず。
・ツリー全体表示

【12887】更新ログ付加のやり方
質問  素人  - 15/9/30(水) 13:43 -

引用なし
パスワード
   上手く伝えられないかもしれませんが、宜しくお願いします。

更新後、更新ログ(登録者・日付・時間)の付加をしたく下記の記述をしましたが、最初に新規登録まは修正したレコードのみしか更新ログが反映されず困っています。
複数のレコード各々に更新ログを付けたい場合、どのようにすればいいのでしょうか?

使用ソフト:Access2010
OS:Win7 Pro SP1


Private Sub Form_AfterUpdate()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset


'接続
Set cn = CurrentProject.Connection

'レコードセット
Set rs = New ADODB.Recordset
rs.Open "Data_estimated_amount", cn, adOpenKeyset, adLockOptimistic


'更新

    
    rs!日付 = Date
    rs!時間 = Time
    rs!登録者 = Me.登録者
    rs.Update
    

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub
・ツリー全体表示

21 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free