Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,441 から 4,480 までを表示しています。
9
ポンタ 2020/11/05 (木) 20:23:38 0029a@1c915 >> 6

ケアレスミスしてました…うまくいきました。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)


If IsNull(Me.グループA) Or IsNull(Me.グループB) Then
Else
Cancel = (Me.グループA = Me.グループB)
End If
End Sub
8
ポンタ 2020/11/05 (木) 16:45:35 0029a@1c915 >> 6

こちらの方法で1回うまくいったと思っていたのですが、「nullの値が不正です」との警告が出て、固まるようになりました。なにか間違っているのでしょうか…

2
nankyoku 2020/11/05 (木) 14:51:14 0029a@1c915

ありがとうございました。
新たに立ち上げると、イントラへのログインが必要だったため、うまくいきませんでしたが勉強になりました。

4
hiroton 2020/11/05 (木) 10:25:32 b95b2@f966d

テーブルにするなら
ComboBox.NotInList event (Access)

テーブルにしないならサブフォームのフォーカス取得時/喪失時イベントで値集合ソースの比較をするとかかな?

7
hatena 2020/11/05 (木) 09:54:12 修正 >> 6

グループヘッダーに集計用テキストボックス=Sum()=Count()を置いた場合でもちゃんとグループ内の集計が取得できますので、formatイベントに関係なくグループ全体の集計をしているみたいですね。

ちなみに詳細セクションに集計関数を置くと全体の修正をするようです。一番目のレコードでも全体集計になります。

3
トマト 2020/11/05 (木) 09:13:09 0029a@1c915

先日教えていただいた、値リストの編集を便利に活用しております。
わがままな要望なのですが、この値リストをサブフォームとメインフォームで共有することはできますでしょうか。
テーブルにすれば可能だと思いますが、テーブルにした場合コンボボックスから直接編集はできますでしょうか…
難しそうであればメインに絞ろうとは思っているのですが、可能であれば教えていただけると助かります。

6
hiroton 2020/11/05 (木) 08:27:04 修正 b95b2@f966d >> 4

これすごいですねぇ。試してみたら確かにBグループのフッターのformatイベントでAグループのフッターの小計が取れました。Aグループのフッターのformatイベント入る前なのでどうかと思ってたんですが計算自体は終わってる上にちゃんと自分のグループの数値が取れるんですね

テストデータ

IDABn
1A1
2A10
3B1
4B10
5C100
6D1000
7D10000
8E1
9E10

レポートのグループ化の設定
グループ化:A、フッターにテキストボックス[A小計](=Sum([n]))
└グループ化:B、フッターにテキストボックス[B小計](=Sum([n]))

テストコード

Private Sub Aグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print "AFooter", Me!A小計
End Sub

Private Sub Bグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print Me!ID, Me!A小計, Me!B小計
End Sub

出力結果

 1             11            11 
AFooter        11 
 3             11111         11 
 5             11111         100 
 6             11111         11000 
AFooter        11111 
 8             11            11 
AFooter        11 

※未出力のフッターの集計がきちんととれてる(Me!A小計)
※レコードの参照はグループの最後のレコードっぽい(並び順指定してなかったらIDはなぜか降順に・・・)

2
nokonoko 2020/11/04 (水) 17:01:20 653a6@54883

回答ありがとうございました。
教えていただいた方法で、無事デバッグできました。(FROMの直前にスペースがありませんでした)

1

サブフォームの場合は、下記の書式で参照できます。

[Forms]![メインフォーム名]![サブフォームコントロール名].[Form]![コントロール名]

サブフォームコントロール名は下記を参照してください。

サブフォームとサブフォームコントロールの違いとは? - hatena chips

5
ポンタ 2020/11/04 (水) 15:46:28 0029a@1c915

おっしゃるとおり、「Bレベルグループの数を事前に数えておく」ところでひっかかってしまい、後回しにしていました。
いずれも教えていただき助かりました。
hiroton様、hatena様、ありがとうございました!

4
hatena 2020/11/04 (水) 14:47:46 修正

簡単に実現できる方法を思いつきました。

各グループの小計はグループフッターセクションで表示しているとします。
それぞれのグループの小計を表示しているテキストボックス名を、
A小計、B小計 とします。

Bグループのフッターセクションのフォーマット時に下記のように記述します。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)
    Cancel = (Me.A小計 = Me.B小計)
End Sub

要は、Aグループ内のBグループ数が1件ならA小計とB小計は同じになります。同じものを表示するのは無駄だということですよね。
同じなら、Cancel を True にしてそのセクションの出力をキャンセルしてます。

グループ内で集計テキストボックスを参照するとそのグループ内での集計値が取得できますので上記のコードでうまくいきます。

もし、マイナスの集計があり、たまたまA小計とB小計が同じになる可能性かあるなら、=Count(*) で件数を表示させるテキストボックスを配置しておいてそれを比較するようにすればいいでしょう。

3
hiroton 2020/11/04 (水) 14:05:23 73b0a@f966d >> 2

グループのカウントはそんな感じですね。SQLの知識的なのは人に寄りけりってことでとりあえず回答に含めない感じでした

別案としては[page]使って事前にformat走らせて自前でカウントするなんてのも考えたんですが、レポートの印刷の都合考える必要ないんでクエリで事前に計算させとくのが楽だろうなとも

2

①枠線がきれいにいかない

枠線に関しては、私は使ってないので分かりません。
枠線が実装される前から、直線コントロールかLineメソッドで罫線は引いていたので、ずっとその方法を使ってます。
境界線で罫線を引くと横罫線の太さが違ったりしたことがあったので上記の方法をとってます。

私もhirotonさんの回答の方法にすると思いますが、Bレベルグループの数を事前に数えておくというのがちょっと難しいですね。

Aグループ、Bグループでグループ化した集計クエリ、あるいは固有の値をはいにしたクエリを作成。
そのクエリからさらにAグループでグループ化、Bグループをカウントする集計クエリを作成。
このクエリをレポートのレコードソースのクエリに追加して、Aグループのキーフィールドで結合することになりますね。

1
hiroton 2020/11/04 (水) 12:34:29 73b0a@f966d

②グループが2重にあり、小計を出しています。

Bレベルグループの数を事前に数えておいてAレベルグループのヘッダーで表示の切り替えをすればよさげ

Private Sub Aグループヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me.Bグループフッター.Visible = Me!グループカウント <> 1
End Sub
7

承知しました。
コメント対応していただき、ありがとうございました。

6

グループコード担当者マスタの主キーはIDです。
T_TOKUの主キーは鍵マークが無いです。

2つのテーブルを結合する場合は、結合するフィールドの片方は主キー(あるいは重複なしインデックス)である必要があります。そうしないと更新できないクエリになったり、データに重複が出たりします。

「T_TOKUの主キーは鍵マークが無い」というのはデータベースの設計としては致命的な欠陥です。
テーブル設計から見直す必要があります。

提示されているフィールド名から推測するに少なくとも、
顧客マスター
グループマスター
担当者マスター
に相当するテーブルが必要になります。
あるいはそのように分割する必要があります。

このような掲示板でのやり取りで解決できる案件ではないように思います。

5

何年か前に作成し、現在は修正できる人がいません。
グループコード担当者マスタの主キーはIDです。
 T_TOKUの主キーは鍵マークが無いです。
フィールド名は
得意先CD、得意先名、担当者CD、担当者営業所CD、旧得意先CD
です。

4

ひょっとして自分で作成したものではなく、前任者が製作したものの改修作業をしているのでしょうか。
前任者に聞くのが一番早いのですが、連絡がとれないとうい状況なんでしょうか。

グループコード担当者マスタというテーブルを作成しました。

そのテーブルの主キーフィールドはなんでしょうか。

また、SQLをみると T_TOKU というテーブルがあるようですが、そのテーブル内のフィールド名と主キー設定を教えてください。

3

教えてください。
グループコード担当者マスタというテーブルを作成しました。
フィールドは
ID、グループNo、グループ名、代表営業所CD、得意先CD、得意先名、営業所名、担当者CD、担当者名を作りました。

現在利用中のクエリを見てみると、下記SQL文が記載されています。この意味と、
このSQL文に営業所名、担当者CD、担当者名を追加記述するにはどうやって書いたらいいか教えてください。
T_TOKUというテーブルのフィールドには担当者CD、T_TOKU2というテーブルのフィールドにTANCD、TANM(担当者名)があります。

SELECT
 T_TOKU.得意先CD, T_TOKU.得意先名, T_TOKU.担当営業所CD AS 営業所CD,
 IIf(IsNull([グループコード担当者マスタ]![グループNo]),[T_TOKU]![得意先CD],[グループコード担当者マスタ]![グループNo]) AS [グループCD/得意先CD],
 IIf(IsNull([グループコード担当者マスタ]![グループNo]),[T_TOKU]![得意先名],[グループコード担当者マスタ]![グループ名]) AS [グループ名/得意先名],
 T_TOKU.旧得意先CD
FROM
 T_TOKU LEFT JOIN [グループコード担当者マスタ] ON T_TOKU.得意先CD = [グループコード担当者マスタ].得意先CD
ORDER BY T_TOKU.得意先CD;

9
どんぐり 2020/11/03 (火) 23:14:01 f1ed8@73413

スミマセン。いじってたらまた正常に動くようになりました…
何回も繰り返しているので、またおかしくなるかもしれないのですが、とりあえず今日のところは解決しました😰
失礼しました…

8
どんぐり 2020/11/03 (火) 22:09:58 0029a@1c915

解決が難しい問題だとは思うのですが、ここ2ヶ月ほど悩まされており質問いたします。
上記教えていただいた「案件管理どんぐり」を参考に2つフォームを作って運用しているのですが
時々謎のエラー、「引数が無効です」に悩まされます。
色々いじってるとエラーが出なくなったり、同じ状況なのにまた出たりと
完全に謎のエラーです。2か月程ずっと色々試してきましたが、気まぐれなエラーです。

そして、「引数が無効です」と出ても結局選択値が反映されるので、まぁなんとか問題ない感じもするのですが
そのエラーのせいで、メインフォームのIDを引っ張ってこれず、また別のエラーになります。
手動でメインフォームのIDを記入すれば良いのですが、一般ユーザーにそれを求めるわけにもいかず
邪道ですっきりしないのですが、
①引数が無効ですのエラーを表示させない(on error なんとかで対応…?)
②コンボボックスを選択したら自動でメインフォームのIDを引っ張ってくる(コンボボックスの更新後処理で対応…?)
という処理をしようかと考えています・・・
でも気が重く・・・何か解決方法は思い当たりませんでしょうか。
解決方法に結び付く、確認方法などあれば何卒ご教示ください。

ちなみに「引数が無効です」エラーのことは何回も検索し、
xmlでテーブルをエクスポートしてインポートするなどは試しました。
バージョンは2016です。

なにとぞ、宜しくお願いいたします。

1

クエリのSQLビューにstrSQLの内容を貼り付けた場合は正常に表示されますか。

下記のコードを実行するとイミディエイトウィンドウにstrSQLの内容が出力されますのでそれをコピーして貼り付けるといいでしょう。

Dim strSQL As String

strSQL = "SELECT MT_Product.P_ID, MT_Product.L_ID, MT_Formation.L_Name" & _
        "FROM MT_Formation " & _
        "INNER JOIN MT_Product ON MT_Formation.L_ID = MT_Product.L_ID;"
Debug.Print strSQL
1
hatena 2020/11/02 (月) 21:21:49 修正

ブラウザのアドレス欄に直接そのURLを入力した場合は、開けますか。

開けるなら、下記の方法を試してみてください。

【VBA】ブラウザを起動し指定URLを表示する | 自恃ろぐ-jizilog.com-

3

②行を詰めるのと同じでプロパティでも可能でしょうか。今から作成に取りかかっていきたいと思います。

列詰めはコントロールの移動が必要なので、VBAでやるのがシンプルだと思います。
クエリでやろうと思えばできないことはないですが。

下記はレコードソースがクロス集計クエリで列数が変化する場合のサンプルです。

列数が変化するクロス集計クエリと連結するフォーム - hatena chips

フォームですが、レポートでも同じ方法で可能です。

2
ポンタ 2020/11/01 (日) 19:52:17 f1ed8@2b9f5

いずれもできるとのことで、嬉しくなりました!
①VBAでチャレンジしてみたいと思います。
参考サイトを探し、不明な場合はまた質問させていただきます。
②行を詰めるのと同じでプロパティでも可能でしょうか。今から作成に取りかかっていきたいと思います。

1

手動で修正したいところも出てきそうなので、レポートと共にEXCELでもレポートライクなものを作りたいと思っているのですが、EXCELはレポートから出力できないと知りました…

xls形式なら、レポートのプレビューからExcelに出力できますよ。

レポートは(*.xlsx)ファイル形式に出力できない | Access 2013 | 初心者のためのOffice講座

ただし、レポートの体裁がそのまま正確に再現できるかどうかは分かりません。

①VBAでEXCEL出力する際、レポートのようなものは作れますでしょうか。

VBAを使えば簡単ではないですが、何でもできます。
それなりのスキルは必要です。

②レポートについてはレイアウトの問題ですが、列(フィールド)の増減に対応できますか?見積によって、特定のフィールドに何もデータがない場合があります。

可能です。
いろいろ方法はあります。

7
cerophan 2020/11/01 (日) 10:03:59 f1ed8@f7cb8 >> 4

ありがとうございます!式を修正し、うまく動くようになりました。

6
顧客ID = 123 AND 担当ID = 23 AND 伝票NO="001" Or 伝票NO="002" Or 伝票NO="003"

ANDとORではANDの方が優先順位が高いので上の式だと下記のように評価されます。

(顧客ID = 123 AND 担当ID = 23 AND 伝票NO="001") Or 伝票NO="002" Or 伝票NO="003"

演算子の優先順位 | Microsoft Docs

伝票NO の OR を先に評価させたい場合は()で囲むようにします。

顧客ID = 123 AND 担当ID = 23 AND (伝票NO="001" Or 伝票NO="002" Or 伝票NO="003")
5
cerophan 2020/10/31 (土) 22:40:23 0029a@1c915

表示順が前後されてしまいましたが、試してみた結果新たに生まれた問題点を上の4に記載しております。。
申し訳ございませんが、ご確認をお願いいたします。

4
cerophan 2020/10/31 (土) 22:39:19 0029a@1c915 >> 2

早速試し、上記の件についてはうまく行くことを確認いたしました!感謝です。

しかし、当初の他の条件と重ね合わせる部分がうまくいきませんでした。
以下コードで確認してみると

Debug.Print Mid(strFilter, Len(" AND ") + 1)

顧客ID = 123 AND 担当ID = 23 AND 伝票NO="001" Or 伝票NO="002" Or 伝票NO="003"

とイミディエイトウィンドウに表示され、伝票NOの3つしか表示されません。

顧客と担当で絞ったときはうまく表示されます。
度々申し訳ございませんが、ご教示宜しくお願いいたします。

3
cerophan 2020/10/31 (土) 18:29:41 f1ed8@73413

なるほど!ありがとうございます!
後ほど試してみます!ありがとうございました😊

2
伝票NO="001" And 伝票NO="002" And 伝票NO="003"

というような条件になると、伝票番号が001かつ002かつ003のレコードを抽出という意味になりますが、それに該当する伝票はないですよね。(一つの伝票には一つの伝票番号しかないので)

伝票番号が001または002または003のレコードを抽出ということがご希望のことだと思いますので、イミディエイトウィンドウの結果が下記のようになるようにコードを修正しましょう。

伝票NO="001" Or 伝票NO="002" Or 伝票NO="003"

ちなみに、In演算子を使って下記の式でも上記と同じ結果になりますので、下記のようになるようなコードでもOKです。

伝票NO In ("001","002","003")
4
ワッフル 2020/10/31 (土) 17:21:18 3b34d@7602d

ご丁寧かつ迅速なご返答をありがとうございます。
ご指導いただいたように試してみたいと思います。

またわからなかったら、質問させてください。
ありがとうございます。

1
cerophan 2020/10/31 (土) 11:45:14 0029a@1c915

ちなみに、1つの伝票番号のみだと検索ができます。複数入れると何も検索できません。

2
リモコン 2020/10/31 (土) 11:22:15 0029a@1c915

うまくいくようになりました。ありがとうございました。
クエリが絡むデータは、requeryを使わないといけないんですね。
ようやくスッキリしました。感謝いたします。

15
セロハン 2020/10/30 (金) 23:33:11 f1ed8@2b9f5 >> 13

詳しくありがとうございました。プリントして保存し、今後じっくり理解していきたいと思います。仰るとおり、結局4の方法で対応いたしました。

2
トマト 2020/10/30 (金) 23:26:17 f1ed8@2b9f5 >> 1

2番目のリンク先を参考にして、コンボボックスから直接値リストを表示できました!ありがとうございます。

7

「ちょっと怖い」というのはコード自体に危険性があるということではなく感覚的にメインフォームのレコードが削除されてしまうという誤解をしかねないという意味です。

サブフォームがデータシートビューの時はメインフォームに配置するしかないと思います。その場合はコマンドボタンのキャプションをサブフォームのデータの削除だと明確に分かるようにしておくといいでしょう。

帳票フォームなら詳細セクションに削除ボタンを配置するがいいのではと思います。どのレコードを削除するのか明確になりますので。

データシートビューの場合も、非連結のテキストボックスを配置して、コントロールソースに ="削除" と設定して、クリック時(またはダブルクリック時)のイベントプロシージャにレコード削除のコードを記述すれば可能です。

6
すー 2020/10/30 (金) 09:21:19 becda@b9210

やはり無理なのですね。
サブレポートの方向で考えたいと思います。
ありがとうございました。