Access VBA質問箱 IV

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

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


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

【12723】改ページ時の処理
質問  bbk  - 15/3/11(水) 17:31 -

引用なし
パスワード
   ACCESS2003のレポートで日付ごとに使用料金を表示しており
詳細の部分で足し算をするVBAを組んでいます。
1ページ目が20件まで表示して2ページ目が21件目から始まっているのですが
どうやら1ページ目の最後に内部的には21件目を表示しているみたいで
21件目が1ページ目の最後と2ページ目の最初の2回計算されて
数値が変わってきてしまいます。

このような現象にあったことある方いますか?
対策を知っておられたら教えて頂きたいです。
説明下手ですみませんがよろしくお願いします。
・ツリー全体表示

【12722】Re:企業名を選んだら企業番号も出るよう...
回答  かるびの  - 15/3/10(火) 1:45 -

引用なし
パスワード
   >コンボボックスで企業名を選んだら隣のセルに企業番号を出るようにしたいんです。

 セル? 
 アクセスでは使わない言葉です。
 正確に言えば、テキストボックスか、コンボボックスです。


 単票フォームの場合ではありますが、次の頁が参考になると思います。
   コンボボックスの2列目以降をテキストボックに表示する
   ht tp://sanryu.net/acc/tips/tips148.htm
・ツリー全体表示

【12721】五行の計算式教えて下さい。
質問  さぶたん  - 15/3/9(月) 13:51 -

引用なし
パスワード
   木火土金水の一般に見る五行です。
これに扶、泄、剋、制と互いの関連性を入れ
この時の木火土金水の個別の強さを調べたいのですが、
扶、泄、剋、制のやり取りが上手く行きません。
どなたか教えて下さい。
・ツリー全体表示

【12720】企業名を選んだら企業番号も出るようにし...
質問  りぃな  - 15/3/9(月) 7:36 -

引用なし
パスワード
   コンボボックスで企業名を選んだら隣のセルに企業番号を出るようにしたいんです。
コンボボックスは企業番号と企業名が入っています。
初心者なので解りやすく教えて下さい。
・ツリー全体表示

【12719】Re:値に変化があったフィールド名を取得...
回答  かるびの  - 15/3/7(土) 2:58 -

引用なし
パスワード
    まず、第一印象なんですが、全然アクセス的な発想方法ではないなという印象です。

>両テーブルを比較し、以下のようなリスト(テーブル)を得たいです。
 アクセスでの発想方法として、両テーブルを比較した結果を
テーブルに残すようなことは通常は行いません。
 両テーブルを比較しさえすれば得られるものを、
一々テーブルに格納していたのでは、
テーブル容量が無駄に増えるばかりだからです。
 その都度、両テーブルを比較するクエリを作れば、十分であるというのが
アクセスの発想です。

 
>どのような関数を使い、どのような構造にすべきか
>まったく見当がつきません。
 エクセルでは関数を使って結果を表示することが多いようですが、
関数を使うというのは、アクセス的な発想方法ではないです。
 アクセスでは、関数の種類がエクセルに比べてずっと少ないと思います。
 アクセスでは、どのようなクエリを組もうかという発想をします。


>顧客ID|変更フィールド1|変更フィールド2|変更フィールド3
>   001|会社名             
>   004|担当者名            
>   007|担当者名    |電話番号    
>   010|会社名     |担当者名    |電話番号
 ××1、××2、××3というフィールド名にした場合、
それは、大抵、テーブルの作り方を間違えています。
 このような場合は、変更のあったフィールド名を横に伸ばしていくのではなく、
ひたすら縦に伸ばしていくのが通常です。例えば、次のようにします。
顧客ID|変更フィールド
   001|会社名             
   004|担当者名            
   007|担当者名
   007|電話番号    
   010|会社名
   010|担当者名
   010|電話番号
 テーブルは、コンピュータにとって使いやすいことというのが何より優先すべきことであり、
コンピュータにとって使いやすいテーブルというのは、えてして人間にとっては見づらいもの
となります。


 以上がアクセスでの基本的な発想方法です。


 次に、
>顧客ID|変更フィールド1|変更フィールド2|変更フィールド3
>   001|会社名             
>   004|担当者名            
>   007|担当者名    |電話番号    
>   010|会社名     |担当者名    |電話番号
というクエリないしテーブルですが、
こういうクエリやテーブルを作れないことはないですが、かなりややこしいことになるので、
やめた方がいいと思います。

 これに対し、新旧両テーブルにおける各フィールドの値が異なる場合には「×」が、
同じである場合は「○」が入る
というクエリであれば、それほど苦労なく、クエリを作れると思います。
顧客ID 会社名 担当者名 電話番号
   001  ×    ○    ○
   004  ○    ×    ○
   007  ○    ×     ×
   010  ○    ○    ○

 このクエリをSQLで示せば、

SELECT 旧テーブル.顧客ID
   ,IIF(旧テーブル.会社名 = 新テーブル.会社名,"○","×") AS 会社名 
   ,IIF(旧テーブル.担当者名 = 新テーブル.担当者名,"○","×") AS 担当者名
   ,IIF(旧テーブル.電話番号 = 新テーブル.電話番号,"○","×") AS 電話番号
FROM 旧テーブル
  INNER JOIN 新テーブル
  ON 旧テーブル.顧客ID = 新テーブル.顧客ID
WHERE Not (旧テーブル.会社名 = 新テーブル.会社名
      AND 旧テーブル.担当者名 = 新テーブル.担当者名
      AND 旧テーブル.電話番号 = 新テーブル.電話番号
      )

です。
・ツリー全体表示

【12718】値に変化があったフィールド名を取得する...
質問  weather  - 15/3/6(金) 11:58 -

引用なし
パスワード
   構造もデータ内容も全く同じ新旧テーブルがあります。

■旧テーブル
顧客ID|会社名|担当者名|電話番号

■新テーブル
顧客ID|会社名|担当者名|電話番号

業務終了後、新テーブルのいくつかのレコードで、
担当者や電話番号が変わりました。

両テーブルを比較し、以下のようなリスト(テーブル)を得たいです。
-------------------
変更があったのは下記フィールドです
-------------------
顧客ID|変更フィールド1|変更フィールド2|変更フィールド3
001|会社名
004|担当者名
007|担当者名|電話番号
010|会社名|担当者名|電話番号

どのような関数を使い、どのような構造にすべきか
まったく見当がつきません。

なにとぞ、ご教示くださいませ。
・ツリー全体表示

【12717】Re:どなたか教えて貰えませんか
回答  hatena  - 15/2/25(水) 9:07 -

引用なし
パスワード
   ▼アクセス勉強中 さん:
>有難うございます。参考にさせて頂き挑戦してみます。ちなみに、フィールド2に7文字あって、左から5番目の2文字を結合とか可能でしょうか?

Mid関数を使えば可能です。DJoin関数の引数に埋め込むことができます。


式1: DJoin("Mid([フィールド2],5,2)","テーブル名","フィールド1='" & [フィールド1] & "'")
・ツリー全体表示

【12716】どなたか教えて貰えませんか
質問  アクセス勉強中  - 15/2/25(水) 6:15 -

引用なし
パスワード
   有難うございます。参考にさせて頂き挑戦してみます。ちなみに、フィールド2に7文字あって、左から5番目の2文字を結合とか可能でしょうか?
・ツリー全体表示

【12715】Re:どなたか教えて貰えませんか
回答  hatena  - 15/2/25(水) 0:02 -

引用なし
パスワード
   下記の関数を使うといいでしょう。

DJoin 関数 - リスト文字列を取得する方法 | YU-TANG's MS-Access Discovery
www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDJoin.html
・ツリー全体表示

【12714】どなたか教えて貰えませんか
質問  アクセス勉強中  - 15/2/24(火) 23:06 -

引用なし
パスワード
   アクセスでテーブルのフィールド1には同じ名前がありフィールド2には異なる値が入ってた場合にクエリで同じ名前を一つに纏めるのはグループ化で纏められるのですが、フィールド2は複数の値の5パターンがあるので一つ纏める方法に困ってます。例えばフィールド1が同じ名前でフィールド2にAだけならAを一つに纏めてAと表示、AとBがあるならABを纏めてA,Bと表示、AとBとCがあるならABCを一つに纏めてA,B,Cと表示、AとCがあるならACを一つに纏めてA,Cと表示、空白なら空白を表示というのはクエリで可能でしょうか?どなたか教えて下さい
・ツリー全体表示

【12713】Re:レポートをグループ毎にpdf出力に関す...
お礼  AWW  - 15/2/19(木) 12:35 -

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

ご連絡ありがとうございます。
別サイトで質問して何とか解決しました。

原因は、T_CODEフィールドのデータ型がテキスト型だったからのようです。


(変更前)

DoCmd.OpenReport "R_支払明細書", acViewPreview, , _
strFilter & " AND T_CODE=" & rs!T_CODE, acWindowNormal

(変更後)

DoCmd.OpenReport "R_支払明細書", acViewPreview, , _
strFilter & " AND T_CODE='" & rs!T_CODE & "'", acWindowNormal


いろいろとありがとうございました。
勉強になりました。
・ツリー全体表示

【12712】Re:フォームからの入力データを即座に反...
お礼  まき  - 15/2/19(木) 11:27 -

引用なし
パスワード
   ▼かるびの さん:

早速のご回答ありがとうございます
返信遅くなり申し訳ありません
おかげ様でうまくいきました

また何かあったら来るかもしれませんので
そのときはよろしくお願いします
・ツリー全体表示

【12711】Re:レポートをグループ毎にpdf出力に関す...
回答  かるびの  - 15/2/19(木) 1:17 -

引用なし
パスワード
   >SELECT T外注者マスタ.T_CODE
>   , T外注者マスタ.GAICHUSHAMEI_KANJI
>   , T外注者マスタ.[Honorific title]
>   , T外注者マスタ.GINKOMEI
>   , T外注者マスタ.GINKOSHITEN
>   , T外注者マスタ.KOUZASHUBETSU
>   , T外注者マスタ.GINKOSHUBETSU
>   , T外注者マスタ.GINKOKOUZA
>   , T_受入.UKEIRE_FLG
>   , T_依頼.application
>   , T_受入.Denpyo_No
>   , T_受入.UKEIREBI
>   , T_受入.amount_uke
>   , T_受入.unit_value
>   , [amount_uke]*[T_受入]![unit_value] AS total
>FROM
>    (
>      T外注者マスタ
>    INNER JOIN T_受入
>    ON T外注者マスタ.T_CODE = T_受入.T_CODE
>    )
>   INNER JOIN T_依頼
>   ON T_受入.Denpyo_No = T_依頼.Denpyo_No;

 SELECT句に「T_CODE」フィールドが複数存在するのではないか
という予想を立てていたんですが、この予想ははずれですね。
 つまり、「T_CODE」フィールドが複数存在するために、
OpenReportメソッドのWhereCondition引数における
例えば「T_CODE=1234」という条件式における「T_CODE」フィールドが、
Q_支払明細書用クエリに複数存在する「T_CODE」フィールドのどれのことなのか
区別できないということで、
パラメータ入力ボックスが出たのではないかと予想したんですが。


 ちょっとお手上げ状態です。


 あと確認するとすれば、
「R_支払明細書」レポートをナビゲーションウィンドウから開くと、
「T_CODE」フィールドについてのパラメータ入力ボックスは出ますか。
  
 また、「R_支払明細書」レポートのフィルタプロパティを空白にしてから、
「R_支払明細書」レポートをナビゲーションウィンドウから開くと、
「T_CODE」フィールドについてのパラメータ入力ボックスは出ますか。

 さらに、R_支払明細書レポートのどこかのプロパティに
「T_CODE」フィールドを一度は設定したものの、
本当はそれを削除すべきなのに、
何らかの事情でそれが削除されずに残ったままになっている
ということはないですか。

 加えて、いろいろとレポートをいじっているうちにレポートが壊れてしまった
という可能性も考えられます。
 これへの対策としては、まずレポートを新規作成し、
R_支払明細書レポートのコントロールをコピーして、
新規に作成したレポートに貼り付けてみてください。
・ツリー全体表示

【12710】Re:レポートをグループ毎にpdf出力に関す...
回答  AWW  - 15/2/18(水) 8:59 -

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

ご連絡ありがとうございます。

 >ひょっとして、Q_支払明細書用クエリには「T_CODE」フィールドが
>テーブルの数だけあったりしませんか。
  
 >Q_支払明細書用クエリのSQL文を提示してみてください。
 >具体的には、Q_支払明細書用クエリをSQLビューで表示して、
>そこに表示されるものをそのまま貼り付けてみてください。


SELECT T外注者マスタ.T_CODE, T外注者マスタ.GAICHUSHAMEI_KANJI, T外注者マスタ.[Honorific title], T外注者マスタ.GINKOMEI, T外注者マスタ.GINKOSHITEN, T外注者マスタ.KOUZASHUBETSU, T外注者マスタ.GINKOSHUBETSU, T外注者マスタ.GINKOKOUZA, T_受入.UKEIRE_FLG, T_依頼.application, T_受入.Denpyo_No, T_受入.UKEIREBI, T_受入.amount_uke, T_受入.unit_value, [amount_uke]*[T_受入]![unit_value] AS total
FROM (T外注者マスタ INNER JOIN T_受入 ON T外注者マスタ.T_CODE = T_受入.T_CODE) INNER JOIN T_依頼 ON T_受入.Denpyo_No = T_依頼.Denpyo_No;

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

【12709】Re:フォームからの入力データを即座に反...
回答  かるびの  - 15/2/18(水) 0:16 -

引用なし
パスワード
   >それを、データを入れるや否や即座に格納させる方法ってあるのでしょうか?

 当方はアクセス2003ですが、メニューバーから「レコード」→「レコードの保存」の
コマンドを実行すれば、入力中のレコードがテーブルに格納されます。
 2007以降でも、同様のコマンドがあると思います。
 
 VBAであれば、
   DoCmd.RunCommand acCmdSaveRecord
を実行すれば、入力中のレコードがテーブルに格納されます。
 これをテキストボックスのAfterUpdateイベントに組み込んでおけば、
当該テキストボックスへの入力が完了した段階でレコードがテーブルに格納されます。
・ツリー全体表示

【12708】フォームからの入力データを即座に反映さ...
質問  まき  - 15/2/17(火) 14:40 -

引用なし
パスワード
   こんにちは
初歩的な質問かもしれませんがよろしくお願いします

テーブルにフォームからデータ入力しているのですが、
accessの仕様として、入れたデータは下の右矢印や左矢印をクリックして他のレコードを一旦表示させないとテーブルに格納されませんよね

それを、データを入れるや否や即座に格納させる方法ってあるのでしょうか?
(VBA等を使用すればできるのでしょうか?)
・ツリー全体表示

【12707】Re:レポートをグループ毎にpdf出力に関す...
回答  かるびの  - 15/2/17(火) 2:06 -

引用なし
パスワード
   >また、Q_支払明細書用は3つのテーブルから構成されます。
>「T_CODE」フィールドは、3つのテーブルすべてに存在します。
 ひょっとして、Q_支払明細書用クエリには「T_CODE」フィールドが
テーブルの数だけあったりしませんか。
  
 Q_支払明細書用クエリのSQL文を提示してみてください。
 具体的には、Q_支払明細書用クエリをSQLビューで表示して、
そこに表示されるものをそのまま貼り付けてみてください。
・ツリー全体表示

【12706】Re:レポートをグループ毎にpdf出力に関す...
回答  AWW  - 15/2/17(火) 1:44 -

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

お世話になっております。

(1)変数「strFilter」に日付を任意で指定について

→時間をおいて、記載いただきましたヒントを基に再度試しましたらできました。前回できなかった理由は「#」を入れていなかったからでした・・・

strFilter = "UKEIREBI Between #" & tx2開始日.Value & "# And #" & tx2終了日.Value & "#"


(2)「T_CODE」毎にパラメータ表示がされる件

>「パラメータ表示がされ」というのは、パラメータ入力ボックスのことですか。
→パラメータ入力ボックスです。

>「パラメータ表示がされ」というのは、どのコードで表示されますか。
>コードを1行ずつ実行して確認してみてください。
→下記コードを実行したときに、「パラメータ入力ボックス」が表示されます。

DoCmd.OpenReport "R_支払明細書", acViewPreview, , _
strFilter & " AND T_CODE=" & rs!T_CODE, acWindowNormal

コード自体に問題がないとすると、
Q_支払明細書用の定義内容に問題があるのでしょうか。
試しにT_CODEではなく、別のフィールドGAICHUSHAMEIでも試してみましたが
同じように「パラメータ入力ボックス」が表示されました。

また、Q_支払明細書用は3つのテーブルから構成されます。
「T_CODE」フィールドは、3つのテーブルすべてに存在します。

あと少しの気がするのですが、なかなかゴールできなくて
やっぱりvbaは難しいですね。
・ツリー全体表示

【12705】Re:レポートをグループ毎にpdf出力に関す...
回答  かるびの  - 15/2/16(月) 0:51 -

引用なし
パスワード
    hatena さん
 御指摘ありがとうございます。
 【12704】に書きましたが、ADOでもDAOでも、レコードセットを開くに当たり、
QBF技法を使ったクエリを基にすることはできないのですね。
 勉強になりました。

 AWW さん
>(1)変数「strFilter」に日付を任意で指定したいのですが、上手くできませんでした。
>なので、strFilter = "UKEIREBI Between #2015/02/01# And #2015/02/28#"と日付をコードに直接書くことしかできませんでした。
 ヒントです。

 「txt県名」という名前のテキストボックスに「青森県」と入力されていて、
「txt台数」という名前のテキストボックスに「30」と入力されていて、
strMojiretuという変数がString型の変数であるときに
   strMojiretu = "都道府県は" & txt県名.Value & "です。台数は" _
         & txt台数.Value & "です。"
というコードを実行すると、変数strMojiretuには、
   都道府県は青森県です。台数は30台です。
という文字列が格納されます。

 これを応用すれば、その都度異なる値をstrFilterに格納できます。

>(2)上記コードを実行すると「T_CODE」毎にパラメータ表示がされ、対象の「T_CODE」を入力すると、対象の「T_CODE」のpdf出力が実行されるのですが、対象が多いと非常に効率が悪いので、パラメータ表示せずに実行できるようにしたいです。
 「パラメータ表示がされ」というのは、パラメータ入力ボックスのことですか。
それともメッセージボックスのことですか。
 パラメータ入力ボックスというのは、小さなウィンドウで、
キャプション(標題)が「パラメータの入力」となっており、
その下にラベルがあり、アクセスが解釈できないフィールド名が表示され、
その下にテキストボックスがあり、
その下に「OK」のコマンドボタンと「キャンセル」のコマンドボタンが横に並んでいるウィンドウのことです。

 「パラメータ表示がされ」というのは、どのコードで表示されますか。
コードを1行ずつ実行して確認してみてください。


 コードを見る限り、またこれまでのやり取りでなされたQ_支払明細書用の定義内容からして、「T_CODE」フィールドについてパラメータ入力ボックスが出ることはないと思うんですよね。
 そこで、サンプルを作って実験してみました。
 もっとも、当方のアクセスは2003なので、OutputToメソッドでPDFに出力することができないため、テキストファイルに出力してみました。
 しかし、パラメータ入力ボックスは出ませんでした。
・ツリー全体表示

【12704】Re:レポートをグループ毎にpdf出力に関す...
回答  かるびの  - 15/2/15(日) 1:27 -

引用なし
パスワード
    クエリの操作方法としてQBF技法というのがあります。
 抽出条件としてフォームのテキストボックスを指定する方法のことです。
 Q_支払明細書用では、「UKEIREBI」フィールドの抽出条件に
   Between [Forms]![F_支払明細書]![tx2開始日]
     And [Forms]![F_支払明細書]![tx2終了日]
と設定しているそうですが、まさにQBF技法ですね。


 12702 のhatenaさんのレスを受けて、実験してみました。
 QBF技法を使ったクエリからレコードセットを開くというものです。
 そうしたところ、レコードセットを開くところで、
   実行時エラー -22147217904 (80040e10)
   1つ以上の必要なパラメータの値が設定されていません。
とのエラーになりました。

 なお、DAOでも試してみると、やはりレコードセットを開くところで
   実行時エラー 3061
   パラメータが少なすぎます。1を指定してください。
とのエラーになりました。


 結論として、QBF技法を使ったクエリは、ADOやDAOでは使えない
ということになります。

 私の不明により無駄なやり取りをさせてしまいました。申し訳ありません。
・ツリー全体表示

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