Access VBA質問箱 IV

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

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


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

【12296】レポートのグループ化でページヘッダーに...
質問  manolo  - 13/3/24(日) 10:25 -

引用なし
パスワード
   初心者です。よろしくお願いします。

レポートで名簿を作成しました。
振り仮名でグループ化してページヘッダーにあ/い/う/え/お・・・と表示できるようにしました。
振り仮名のグループで改ページをしないため、例えば「あ」から「い」になったとき、同一ページに「あ」と「い」の人が表示されますが、ページヘッダーは「あ」だけで、次ページから「い」となります。
これを同一ページに「あ」と「い」の人がいたら、ページヘッダーに「あ〜い」と表示させることはできるでしょうか?

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

【12295】Re:マクロの条件の利用について
回答  hatena  - 13/3/23(土) 13:42 -

引用なし
パスワード
   >マクロの中に追加クエリの実行するかどうかの判断条件を入れたいです。
>条件として、
>C:\JUST\テスト.XLSファイルの更新年月日は今日の日付(Systemdate)であれば
>追加クエリを実行する。
>そうでなければ、次のアクションを実行する。

下記のような条件式を設定すればいいでしょう。


DateValue(FileDateTime("C:\JUST\テスト.XLS"))=Date()
・ツリー全体表示

【12294】Re:クエリで複数項目の数値の合計をだし...
回答  かるびの  - 13/3/20(水) 16:26 -

引用なし
パスワード
    方法1
 DCount関数は使えませんか。

 第3引数、つまり条件式の書き方に少しクセがあるので、注意してください。


 方法2
 集計クエリを複数作るのはどうでしょうか。
 つまり、現在は、受験者テーブルから集計クエリを作っているわけですよね。
この集計クエリを仮に「Q集計」とします。
 このほかに、
   両方受験と学科のみ受験を足した総学科受験者数
を求める集計クエリ(Q両方学科集計)と
   両方受験と実技のみ受験を足した総実技受験者数
を求める集計クエリ(Q両方実技集計)
を作ります。
 そして、Q集計、Q両方学科集計及びQ両方実技集計から
Q最終集計というクエリを作ります。
 なお、Q最終集計は、選択クエリになるのではないかと思います。


 蛇足ですが、
>学科と実技合格者数はSum(IIf([学科合否]="合格",1,0))演算でそれぞれ出しました。
とのことですが、
   DCount("受験者ID","受験者テーブル","学科合否='合格'")
でもいけると思います。
・ツリー全体表示

【12293】クエリで複数項目の数値の合計をだしたい...
質問  初心 E-MAIL  - 13/3/20(水) 3:18 -

引用なし
パスワード
   こんばんは、いつもお世話になっております。
また、行き詰まってしまいまして、投稿させて頂きます。
よろしくお願い申し上げます。

下記の様なテーブルから集計クエリを作成し、科目別、受験者数、区分別(両方受験する人)、(実技のみ受験者する人及び合格者数)(学科のみ受験する人及び合格者数)の合計をだし、レポートで集計表を作成しようと考えております。

受験者テーブル(ACCESS 2000)
受験者ID/等級ID/区分ID/科目ID/名前/学科得点/実技得点・・・・合否は関数で隣に表記しています。
※1 (受験者IDは受験者の識別番号、等級IDは等級テーブル1級、2級、3級と結合しています。区分IDは1 両方受験、2 学科のみ受験、3 実技のみ受験、の区分テーブルと結合しています。科目IDは1 国語、2 数学、3 英語、4 体育、の科目テーブルと結合しています。)
最終的にこのクエリを元にした、レポートを等級毎にページを分け、科目を基準として出力する予定でおります。

クエリで受験者IDをカウントして総受験者数を出し、学科と実技合格者数はSum(IIf([学科合否]="合格",1,0))演算でそれぞれ出しました。

ここからが問題なのですが、両方受験(区分ID)1と学科のみ受験(区分ID)2フィールドを足した総学科受験者数、同じく両方受験(区分ID)1と実技のみ受験(区分ID)3フィールドを足した総実技受験者数、また、その合格者数が出せずに困っております。
IDの数字を足すわけにもいきませんし、選択した区分のカウント2つを合計できればよいのですが、調べての該当する項目がありませんでした。
何卒、お力をお貸し頂きたくお願い致します。
・ツリー全体表示

【12292】Re:ACCESSでクエリの抽出条件に変数を代...
回答  かるびの  - 13/2/28(木) 2:01 -

引用なし
パスワード
    1レコード目から最終レコードまで順次処理を進めていくわけですから、
ループ処理ですね。
 「For ・・・ Next」や「Do Until・・・ Loop」などの構文を使います。
 「For ・・・ Next」文を使うなら、レコードセットのRecordCountプロパティ、
「「Do Until・・・ Loop」を使うなら、レコードセットのEOFプロパティ
も使うことになるでしょう。


 テーブルにおけるレコードの値を取得するためには、レコードセットを使います。
 レコードセットには、DAOとADOの2種類があります。
 それぞれ一長一短がありますが、ちなみに私はDAO派です。
 DAOの場合、DatabaseオブジェクトのOpenRecordsetメソッドにより
レコードセットを取得します。
 そして、「rs!フィールド名.Value」というコードで
(rsはレコードセットを格納した変数)レコードの値を取得できます。


 「クエリの実行」において実行されるクエリがどんなクエリなのかわかりませんが、
テーブル作成クエリですかね。
 クエリの種類が何であるにせよ、各回で実行されるクエリは、全く同じものではなく、
一部だけが微妙に異なるのでしょうから、
VBAでSQL文を生成して、そのSQL文を実行させることになります。
 生成するSQL文は、テーブル作成クエリなら「SELECT...INTO...」文ですね。
 SQL文の実行は、DatabaseオブジェクトのExecuteメソッドです。


 ところで、テーブルをたくさん作るようですが、
何のためにたくさんテーブルを作成するんでしょうか。
 エクセルでは、ワークシートを年度別とか月別とかで作ったりしますが、
データベースにおいては、年度別とか月別にテーブルを分けるのは、やってはいけないことです。
 このような場合、データベースでは、
テーブルは1個だけにしておき、
テーブルに「年度」フィールドや「月」フィールドを設けるという方法をとります。
年度別のデータがほしければ、クエリにより年度で抽出してやれば、
簡単に年度別のデータが取得できます。
・ツリー全体表示

【12291】ACCESSでクエリの抽出条件に変数を代入し...
質問  ゆう  - 13/2/27(水) 18:13 -

引用なし
パスワード
   はじめまして
Access勉強中の超初心者です。

ACCESS VBAを使用して、
Aテーブルの1列目に入っている値を1行ごとに取得し変数に入れて、その変数をクエリの条件に入れて
実行→テーブルを作成したいのですが、どのようにすればよいでしょうか?

1行目の値取得→変数に代入→クエリを実行→テーブル作成(テーブル名は1行目の値)
2行目に移動...............
最終行まできたら処理を終える

といった感じです。

フォームのコントロールを使用してみたり
いろいろ挑戦はしてみたものの、まったくうまくいかず投稿させていただきました

どうぞ宜しくお願いいたします。
・ツリー全体表示

【12290】マクロの条件の利用について
質問  JWの初心者  - 13/2/20(水) 18:47 -

引用なし
パスワード
   Accessの勉強中です。
一つの質問がありますので、よろしくお願いします。

質問
マクロの中に追加クエリの実行するかどうかの判断条件を入れたいです。
条件として、
C:\JUST\テスト.XLSファイルの更新年月日は今日の日付(Systemdate)であれば
追加クエリを実行する。
そうでなければ、次のアクションを実行する。
・ツリー全体表示

【12289】Re:端数の処理
回答  かるびの  - 13/2/20(水) 1:35 -

引用なし
パスワード
    コンピュータ内部の計算ロジックが10進法でないことに起因するからだと
本に書いてありました。
 特に小数を含む数値を計算すると、そのような誤差が出てくるようです。

 データ型を通貨型にしておくと、そのような誤差の発生をより少なくできるようです。
・ツリー全体表示

【12288】端数の処理
質問  katoki  - 13/2/19(火) 12:52 -

引用なし
パスワード
   アクセスのクエリやVBAで以下を計算すると
int(19.33*100)/100=19.32
になります。なぜ19.33にならないのでしょうか。
・ツリー全体表示

【12287】Re:特定の文字選択のみ入力可能
回答  かるびの  - 13/2/19(火) 1:23 -

引用なし
パスワード
   >社員テーブル
>
>ID
>社員名
>
>があります。
>
>現在社員IDをフォーム上で選択すると自動的に社員名が表示されるようになっていますが
>IDで999が選択された場合のみ、社員名をテキストボックスに手入力できるようにしたいのですが
>うまくいきません。

 現状がさっぱりわかりません。

 テーブル構成については、
主キー、主要なフィールド名、フィールドのデータ型
を提示してください。
 フォームについては、
フォームの既定のビュー及びレコードソース、
主要なコントロールの種類、名前及びコントロールソース
を提示してください。

 もしコントロールにコンボボックスやリストボックスがあるのであれば、さらに
連結列、列数、列幅、値集合ソース、入力チェック
の各プロパティの値も提示してください。
・ツリー全体表示

【12286】Re:特殊な並べ替え
お礼    - 13/2/18(月) 19:14 -

引用なし
パスワード
   ▼かるびの さん:
いつもありがとうございます
教えていただいた通り直しました。

> また、ORDER BY句も、
>   ORDER BY Year([日付])+(Month([日付])<4)
>       , コード
>       , 日付
>だけでいいように思うのですが。

そうですね。以前使っていたの消すの忘れてました。

> なお、年度を得る方法として、当該日付の3か月前の日の年を求めてあげる
>という方法もあります。
> 例えば、H25.03.31の3か月前はH24.12.31。この日の年はH24。
>     H25.04.01の3か月前はH25.01.01。この日の年はH25。
> 使う関数は、DateAdd関数とYear関数です。

やってみます
ありがとうございました。
・ツリー全体表示

【12285】Re:新規フォーム作成時の初期設定
お礼  wanda  - 13/2/18(月) 15:07 -

引用なし
パスワード
   ▼かるびの さん:
> 「フォームテンプレート」という機能があります。
> 2003では、メニュー・バーの「ツール」→「オプション」と進み、
>「フォーム/レポート」タブをクリックすると出てきます。
> ちょっとネットで調べてみましたが、御希望のことができそうな感じです。
>
> waji-mart.com/homeandabroad/?p=100
>(冒頭のエイチ・ティ・ティ・ピィ・コロン・スラッシュ・スラッシュは省略)
>
> ただ、私は、フォームテンプレートは使ったことがないし、
>今後も使わなさそうなので、それ以上のことはわかりません。
>悪しからず。

かるびのさま
 ありがとうございました。問題解決しました!!
・ツリー全体表示

【12284】特定の文字選択のみ入力可能
質問  とんちん  - 13/2/18(月) 13:24 -

引用なし
パスワード
   どなたかお知恵をお貸しください。

社員テーブル

ID
社員名

があります。

現在社員IDをフォーム上で選択すると自動的に社員名が表示されるようになっていますが
IDで999が選択された場合のみ、社員名をテキストボックスに手入力できるようにしたいのですが
うまくいきません。

どなたかお知恵をお貸しください。
よろしくお願いいたします。
・ツリー全体表示

【12283】Re:特殊な並べ替え
回答  かるびの  - 13/2/17(日) 2:32 -

引用なし
パスワード
   >Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000"))

 よく思いつきましたねえ。
 でも、年度を求めるだけなら、
   Year([日付])+(Month([日付])<4)
だけでいいのではないですか。

 また、ORDER BY句も、
   ORDER BY Year([日付])+(Month([日付])<4)
       , コード
       , 日付
だけでいいように思うのですが。


 なお、年度を得る方法として、当該日付の3か月前の日の年を求めてあげる
という方法もあります。
 例えば、H25.03.31の3か月前はH24.12.31。この日の年はH24。
     H25.04.01の3か月前はH25.01.01。この日の年はH25。
 使う関数は、DateAdd関数とYear関数です。
・ツリー全体表示

【12282】Re:特殊な並べ替え
発言    - 13/2/15(金) 16:06 -

引用なし
パスワード
   あれから急に思いついて一応自己解決したのですが、あまりスマートじゃないような気がします。

SELECT Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000")) AS 日付コード, 発注テーブル.日付, 発注テーブル.コード, 発注テーブル.部署コード, 部署マスタ.部署
FROM 部署マスタ INNER JOIN 発注テーブル ON 部署マスタ.部署コード = 発注テーブル.部署コード
ORDER BY Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000")), 発注テーブル.日付, 発注テーブル.コード;

もしよろしければもっとスマートな方法を教えていただけると嬉しいです。

※質問投げかけておいてから、突然思いつくのでよく自己レスになってしまいます。これもスマートじゃないですよね、本当に申し訳ないです。
・ツリー全体表示

【12281】特殊な並べ替え
質問    - 13/2/15(金) 13:41 -

引用なし
パスワード
   いつもお世話になります
よろしくお願いします

あるクエリがあり
SELECT 発注テーブル.日付, 発注テーブル.コード, 発注テーブル.ID, 発注テーブル.部署コード, 部署マスタ.部署
FROM 部署マスタ INNER JOIN 発注テーブル ON 部署マスタ.部署コード = 発注テーブル.部署コード
ORDER BY 発注テーブル.日付, 発注テーブル.コード;

展開すると
例)
日付    コード 部署
2011/4/1   1   総務
2011/4/2   2   経理
2011/4/3   4   企画
2011/4/7   3   庶務
      ・
      ・
      ・ 
2013/2/1   1   経理
2013/2/13  4   総務
2013/2/14  2   経理
2013/2/15  3   庶務
       
となります(部署コードは端折りました)

間違っているわけではないのですが、元データが必ずしも日付が若いとコードが若いとは限らないので、
これを

日付    コード 部署
2011/4/1   1   総務
2011/4/2   2   経理
2011/4/7   3   庶務
2011/4/3   4   企画
      ・
      ・
      ・ 
2013/2/1   1   経理
2013/2/14  2   経理
2013/2/15  3   庶務
2013/2/13  4   総務

のようにしたいです、どうすればよいでしょうか?

コードを先頭にすると、

コード  日付  部署  
1   2011/4/1  総務
1   2013/2/1  経理
2   2011/4/2  経理
2   2013/2/14 経理
3   2011/4/7  庶務
3   2013/2/15 庶務
4   2011/4/3  企画
4   2013/2/13 総務
      ・
      ・
      ・ 
となってしまうのでだめです
あくまでも年度ごとに順番に出るようにしたいです。
よろしくお願いします
・ツリー全体表示

【12280】Re:Access データ保存
お礼  たらますお  - 13/2/11(月) 21:41 -

引用なし
パスワード
   再度のご回答大変感謝しております。

今回の質問はACCESSとは畑が違うのですね。
見当違いの質問にも丁寧にご教示頂き有難う御座いました。
今後とも宜しくお願いします。<(_ _)>
・ツリー全体表示

【12279】Re:Access データ保存
回答  かるびの E-MAIL  - 13/2/10(日) 21:20 -

引用なし
パスワード
   >冗長化複合DBという考え方を見つけ、説明を見たところ
>「同じテーブル構造で別DBを利用」とありました。

 アクセスの範囲内のことはある程度わかりますが、
オラクルとかSQLサーバなどにも妥当する高度なデータベース技術については、
門外漢のため、冗長化複合DBという言葉を知りません。
 ネットでちょっと調べてみましたが、ぴったりとした解説は見つかりませんでした。

 ここからは、勝手な想像なのですが、
冗長化というのは、
予備のシステムを配置することでトラブルに対して備えること
だそうですから、冗長化複合DBというのは、
トラブルに備えて、複数のデータベースを稼働させておき、
トラブルがあったら、すぐさま別のデータベースに切り替えるようにしておくシステム
のことではないかと思います。

 こういうやり方が必要になるのは、
銀行のオンラインシステムとか、交通機関のシステムなど、
システム・ダウンの影響が何万人とか何十万人にも及ぶようなシステムではないでしょうか。


>当事案ではあまり有効な適用方法ではないのでしょうか?
 アクセスというソフトウェアは、壊れやすいと言われています。
おそらくこれは、オラクルとかSQLサーバなどに比べると壊れやすいという意味であり、
壊れやすさの程度はエクセルやワードなどと同程度ということだと思いますが、
銀行のオンラインシステム並の堅牢さを求めたいならば、
アクセスを選んだ時点でアウトですね。
・ツリー全体表示

【12278】Re:Access データ保存
質問  たらますお  - 13/2/10(日) 11:33 -

引用なし
パスワード
   早速のご回答有難う御座います。
当方にも理解できる内容でご教示頂き、大変たすかりました。

旧年度分は参照のみ、新年度分は参照および更新するという要件で、
なるべくDBをコンパクトにしたほうが操作性がよいのかなという思いから
考えましたが、やはり同一テーブル構造なので分けない方がよいのですね。

1点追加で教えて頂けますか?
冗長化複合DBという考え方を見つけ、説明を見たところ
「同じテーブル構造で別DBを利用」とありました。
これが有効なのはどのような時なのでしょうか?
当事案ではあまり有効な適用方法ではないのでしょうか?

恐れ入りますが、宜しくお願いします。
・ツリー全体表示

【12277】Re:Access データ保存
回答  かるびの  - 13/2/10(日) 2:18 -

引用なし
パスワード
    年度ごとに別のmdbファイル(又はAccDBファイル)にしているのでしょうか。
 エクセルでは、年度ごとに異なるブックに保存することがありますが、
データベースでそんなことをしてはいけません。
 全ての年度を通じて1個のmdbファイルにすべきです。

 年度ごとにテーブルを分けるというのもダメですよ。

 さもないと、テーブル探しやmdbファイル探しに手間を食ってしまいます。
 全年度が一つのテーブルに入っていれば、
クエリを使えば、当該年度のデータはすぐに抽出できます。
 データベースは、そもそも大量のデータを管理するものですから、
レコード数が何十万とか何百万とかになっても、目に見えて重くなることはない(はず)です。

 アクセスとエクセルの違いは、
エクセルでは、行が多くなってくると、
別のワークシートにしたり、別のブックにしたりしますが、
アクセスでは、行が多くなっても、テーブルやmdbファイルを分けません。
 その代わり、エクセルでは考えられないほど、
列を分けて、別テーブルにします(これをテーブルの正規化といい、
テータベースの基本です)。


 データベースの常道に反して、どうしても、年度ごとに別のmdbファイルにしたい
というなら、
旧年度のmdbファイルのテーブルを、
新年度のmdbファイルにおいてリンクテーブルとする方法が考えられますね。
・ツリー全体表示

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