Microsoft Access 掲示板

views
4 フォロー
6,283 件中 3,841 から 3,880 までを表示しています。
1

標準モジュールのプロシージャをFunctionにしておけば、
「クリック時」プロパティに
=プロシージャ名()
と設定すれば呼び出せます。

47
もんぞう 2021/04/03 (土) 17:33:56 62ea7@f778d

hirotonさんへ

上の書き込みの追加です。

テーブルAにテキスト型の[入荷引当]というフィールドがあります。
0か1の判定があり、0のときは空白で1のときは「予」という文字を合計数量と各店舗の数量の左にいれたいと思っております。
1店舗でも「予」があれば合計数量にも「予」を入れて、1店舗も「予」がなければ合計数量も無しでお願いします。
画像1
よろしくお願いします。

3

もう一度、私の回答をよく読んでください。

データ型を数値型にしておいて、
桁数をそれえたいときは、書式プロパティに 0000000 とすれば見た目上そろいますので。

とか、

なにかの都合でテキスト型にする必要があるとき(そうすべき合理的な都合は思いつきませんが)、

それを理解したうえでどの点に疑問をお持ちですか。

私の場合は、主キーは数値型(あるいはオートナンバー型)以外(テキスト型とか)にしたことはないです。

2
サガノヘルマー 2021/04/03 (土) 15:35:28 2a30e@05952

決めたことがないということは1 10と増えていくということですか?

ソートするとき、も数値系ならご指摘のようにはなりませんか?

1

私は決めたことがないです。
データ型を数値型にしておいて、
桁数をそれえたいときは、書式プロパティに 0000000 とすれば見た目上そろいますので。

なにかの都合でテキスト型にする必要があるとき(そうすべき合理的な都合は思いつきませんが)、
桁数を揃えておかないと、並び替えのときに想定通りにならないことになります。

例えば1~12までを昇順にすると下記のようになっちゃいます。(それが想定通りならいいですが)

1
10
11
12
2
3
4
5
6
7
8
9

46
もんぞう 2021/04/02 (金) 16:22:47 62ea7@f778d

hirotonさんへ

追加アドバイスありがとうございます。

「ケース、バラの算出は[数量]を合計してから機械的にという方法です。」
こちらのやり方で大丈夫です。
無事できましたありがとうございます。

「合計数量の表示をVBAで対応する場合」がおかしくなってしまいました。
2ページ目以降に数量は空白なのですが単位が表示されてしまいます。

 , IIf([n0ケース数]>0,[n0ケース数]) AS n0ケース数表示
  , IIf([n0ケース数]>0,"ケース") AS n0ケース文字
  , IIf([n0バラ数]>0,[n0バラ数]) AS n0バラ数表示
  , IIf([n0バラ数]>0,"バラ") AS n0バラ文字

レポートは上記のやり方でしてます。
画像貼り付けますのでよろしくお願いします。
情報不足でしたら申し訳ありません。
画像1
画像2
画像3

45
hiroton 2021/04/02 (金) 10:19:47 修正 c5a8f@f966d

あ、見落としてました。[合計数量]もケース、バラに分解するんですね。やろうとした感じで出来るはずですがうまくいかないですか?

  , ケース入数

  , Sum(数量) AS 合計数量
  , Int([合計数量]/[ケース入数]) AS 合計ケース数
  , [合計数量] Mod [ケース入数] AS 合計バラ数

  , f0

  , Sum(IIf([店舗名]=[f0],[数量])) AS n0
  , Int([n0]/[ケース入数] ) AS n0ケース数
  , [n0] Mod [ケース入数] AS n0バラ数

それと、上記の方法はケース、バラの算出は[数量]を合計してから機械的にという方法です。そうではなく、
例えば

商品店舗数量ケース入数
A1510
A1610

なんてデータの場合、現実に即して数字を出すと

商品店舗数量合計ケース入数ケース合計バラ合計
A3110211

となることが考えられます(バラ数合計がケース入数を超える)。こういう計算をしたいのであれば合計する前の[数量]からケース数、バラ数を算出する必要があります

  , ケース入数

  , Sum(数量) AS 合計数量
  , Sum(Int([数量]/[ケース入数])) AS 合計ケース数
  , Sum([数量] Mod [ケース入数]) AS 合計バラ数

  , f0

  , Sum(IIf([店舗名]=[f0],Int([数量]/[ケース入数]))) AS n0ケース数
  , Sum(IIf([店舗名]=[f0],[数量] Mod [ケース入数])) AS n0バラ数

Int([数量]/[ケース入数][数量] Mod [ケース入数])が複数回でてきますが、レポート出力用クエリ「Qレポート出力データ」は集計を使ったクエリなので、これを個別のフィールドに置くことはできません。わかりやすく処理するなら事前にフィールドを作っておく必要があります。ちょうど前段階として「Q出力全ページデータ」があるので

Q出力全ページデータ

SELECT Py, テーブルA.*, Q出力店舗.*, Int([数量]/[ケース入数]) AS ケース数, [数量] Mod [ケース入数] AS バラ数
FROM Q出力店舗, テーブルA INNER JOIN Q出力商品ページグループ ON テーブルA.棚番号 = Q出力商品ページグループ.棚番号;

とすれば
Qレポート出力データ


  , Sum([数量]) AS 合計数量
  , Sum([ケース数]) AS 合計ケース数
  , Sum([バラ数]) AS 合計バラ数

  , f0

  , Sum(IIf([店舗名]=[f0],[ケース数])) AS n0ケース数
  , Sum(IIf([店舗名]=[f0],[バラ数])) AS n0バラ数

と作ることができます

「テーブルA」に
ケース入数
ケース数:Int([数量] / [ケース入数] )
バラ数: [数量] Mod [ケース入数]
の3つを追加してます。

なので、こっちのほうがやりたいことだったかな?

4

FileCopyステートメントだと、開いているファイルをコピーしようとするとエラーになるようです。
FileSystemObjectを使うとエラーにならずコピーできます。

3
まいまい 2021/04/01 (木) 18:39:35 58219@1d072

そうです。Application.CurrentProject.FullNameなどを使ったり、FileCopyステートメントでやってましたがエラーになって四苦八苦しておりました
リンク先をみてもう一度やってみようと思います

2

ひょっとして、現在開いてるAccessファイル(自分自身のファイル)のバックアップを取りたいということでしょうか。

だとしたら、下記辺りをご参考に。

データベースを開いている状態で自分自身をバックアップする 《FileSystemObject》|Access|ヘルプの森

1

ファイルコピーは FileCopyステートメントで。

タイムスタンプ文字列はFormat関数とDate関数またはNow関数で生成できます。

上記ヒントでチャレンジしてみてください。簡単ですよ。

44
もんぞう 2021/04/01 (木) 18:07:07 62ea7@f778d

hirotonさんへ

素早いアドバイスいつもありがとうございます。
まだ試せていませんので、できましたらまた書き込みさせていただきます。

2
セロハン 2021/04/01 (木) 11:47:22 0029a@1c915 >> 1

仰る通りです…(><)
うっかりして見落としてお手を煩わせて申し訳ありません。助かりました!ありがとうございました。

1

コード全体を提示してもらわないと適切な回答は難しいですが、
提示されている部分だけで推測すると、下記のような感じでしょうか。

strFilter = strFilter & " AND (([01] Is Null AND [01c] = False ) OR ([02] Is Null AND [02C] = False))"
6
hatena 2021/04/01 (木) 09:49:38 修正 >> 5

レコードは1件のみで、検索終了後はデータはクリアすればいいでしょう。

過去の抽出条件を再利用する可能性があるなら、レコードを追加して利用するのもありです。
開いたときは新規レコードにしておいて、コンボボックスで過去の条件データを選択することも可能にするという設計にしてもいいでしょう。

43
hiroton 2021/04/01 (木) 09:25:42 74598@f966d

ケース数:Int([数量] / [ケース入数] )
バラ数: [数量] Mod [ケース入数]

この計算自体はレポート出力の直前でやればいいですね

合計ケース数:Int([合計数量] / [ケース入数] )
合計バラ数: [合計数量] Mod [ケース入数]

レポート出力用のクエリは次のような形になっていると思います

  , Sum(数量) AS 合計数量

  , f0

  , Sum(IIf([店舗名]=[f0],[数量])) AS n0

GROUP BY

  , Q出力全ページデータ.Py
  , Q出力全ページデータ.Px

[合計数量]は各商品の全店舗の合計ですね。店舗ごとの数量としては、「(Px,Py)ページの1列目の店舗はf0フィールドの値、その時の数量はn0」のように作っているので、この「n0」に対して計算式を当ててあげればいいです

  , Sum(数量) AS 合計数量

  , f0

  , Sum(IIf([店舗名]=[f0],[数量])) AS n0
  , Int([n0] / [ケース入数] ) AS n0ケース数
  , [n0] Mod [ケース入数] AS n0バラ数

GROUP BY

  , Q出力全ページデータ.Py
  , Q出力全ページデータ.Px

0の場合、レポートに表示するときは空白でお願いします。

数値をチェックして必要な時(0より大きいとき)だけ出力すればいいですね

  , IIf([n0ケース数]>0,[n0ケース数]) AS n0ケース数表示
  , IIf([n0ケース数]>0,"ケース") AS n0ケース文字
  , IIf([n0バラ数]>0,[n0バラ数]) AS n0バラ数表示
  , IIf([n0バラ数]>0,"バラ") AS n0バラ文字

または、レポートに配置したあと書式を設定するでもいいかもしれません
数値フィールドまたは通貨フィールドの書式を設定する

n0ケース数
コントロールソース|n0ケース数
書式        |0;; 

n0バラ数
コントロールソース|n0バラ数
書式        |0;; 

n0ケース文字
コントロールソース|n0ケース数
書式        |ケース;; 

n0バラ文字
コントロールソース|n0バラ数
書式        |バラ;; 

表示できないですが、「;;」の後に「半角スペース」が入っています。
レポートのデザインビューで入力するときは自動整形が働くので、例えば、「0;;" "」と入力する必要があります。または「0;; 」(最後の文字は全角スペース)でもいいでしょう

5
ロマサガ 2021/04/01 (木) 01:46:13 2a30e@05952 >> 4

ありがとうございます

検索条件用入力用のテーブルのレコードは常に一つということですか?検索のたびに増えていきませんか?
それらのフィールドを元に検索をかけるのですよね?

4

VBAを使えば可能ですよ。
ラベルとチェックボックスを並べて作成すればできます。
ただ、面倒ですよね。

検索条件用入力用のテーブルを作成して、各フィールドは「複数値フィールド」にすれば、リストからチェックボックスで選択できるUIになります。これを使えば楽できそうですね。

複数値を持つフィールドの作成または削除 - Access

画像1

3
ロマサガ 2021/03/31 (水) 18:33:46 58219@05952

質問が曖昧で申し訳ないのですが
厳密にいうとフィルタではなく、検索ということになります
画像
画像のようなイメージです

伝え方があいまいで申し訳ないです

2
ロマサガ 2021/03/31 (水) 18:28:00 58219@05952

個人的なこだわり(UIデザイン的な)でデータシートビューは使いたくなったので、サンプルをみて勉強させてもらいます
データシートビューのように複数の項目にチェックをいれていき、すべてに適合するものを検索することはむずかしいですか?

42
もんぞう 2021/03/31 (水) 16:51:52 62ea7@f778d

hirotonさんへ

お願い④の件は1店舗分だけ作りましたがうまくいきました。

「テーブルA」に
ケース入数
ケース数:Int([数量] / [ケース入数] )
バラ数: [数量] Mod [ケース入数]
の3つを追加してます。

合計数量も[合計ケース数][合計バラ数]に分けて表示したいと思っております。
合計ケース数:Int([合計数量] / [ケース入数] )
合計バラ数: [合計数量] Mod [ケース入数]
のような感じで作ろうとしましたがうまくいきませんでした。
0の場合、レポートに表示するときは空白でお願いします。

41
もんぞう 2021/03/31 (水) 13:02:35 62ea7@f778d

hirotonさんへ

※hirotonの場合、レコードソースに存在するフィールドを表示するテキストボックスは、その名前をフィールド名と同じにする(レポートでもフォームでも)
※合計数量を表示するテキストボックスの名前を正しく指定していますか?

まったくこの通りのミスでした。
お手数おかけして申し訳ありませんでした。
処理の重さもまったく感じません。
ありがとうございます。

40

コードはレポートのモジュールに記述していますか?
合計数量を表示するテキストボックスの名前を正しく指定していますか?
画像1

1

データシートビューにすれば、ヘッダーをクリックするとエクセル的なフィルターが使えます。

画像1

ヘッダーに条件を入力するボックスを配置してVBAでフィルターをかける方法なら、下記にサンプルがあります。

複数条件の抽出フォームの設計 その1 - hatena chips

1

表計算ソフトとデータベースソフトでは、データの扱いがまったく異なるのでエクセル的な発想から離れてデータベース的な設計を意識するようにしたほうがいいと思います。

VBAで疑似的にオートフィル的な動作をさせることは可能ですが、あまりいい設計ではないと個人的には思います。

オートフィル的な動作が欲しいときの例として、例えば、一対多の関係のデータ(具体的には、請求書ヘッダーと請求明細など)なら、Accessならメインサブフォーム形式あるいはデータシート/サブデータシート形式の入力フォームを使います。

メインフォームで、顧客データ、請求日付を入力。サブフォームでは明細データを入力。という設計にすればオートフィルは必要ないです。

あるいは、連続してデータを入力するとき、前の同じデータを入力する場合が多いというときには、テキストボックスの既定値を設定をVBAで設定すれば、新規レコードに移動したときに既定値として表示させておくことが可能です。

連続値も同様に規定値で可能です。

ユーザーがエクセルでの入力に慣れているということなら、エクセルで入力させてインポートするという方法もあるでしょうが、私はしたことはありません。

Accessのフォームで入力しやすいUIを工夫するようにしてます。

39
もんぞう 2021/03/31 (水) 09:30:57 62ea7@f778d

hirotonさんへ

説明不足申し訳ございません。
「エラーの発生するタイミング」
レポートを開くまでは問題ないのですが、印刷プレビューを開いたときです。

「その時の挙動(どのような結果をエラーと言っているのか)」
「エラーメッセージが出るならそのメッセージを添えてください」
画像をはりつけますのでよろしくお願いします。
画像1
画像2

38

エラーの発生するタイミング
その時の挙動(どのような結果をエラーと言っているのか)
エラーメッセージが出るならそのメッセージを添えてください


想定しているレポートは>> 15から進んだものです

  , Sum(数量) AS 合計数量
ページヘッダー
Pyヘッダー
Pxヘッダー
棚番号合計数量f0f1f2
詳細
棚番号合計数量n0n1n2

クエリにフィールドとして「合計数量」を持ち、それをレポート上に配置している状態です。エラーが発生するとなると、「フィールドが存在しません」エラーですかね?

[合計数量]は合計数量を表示するテキストボックス(上記色付き部分のテキストボックス)の名前に変更してください


hirotonの場合、レコードソースに存在するフィールドを表示するテキストボックスは、その名前をフィールド名と同じにする(レポートでもフォームでも)ので、特に問題なく動くんですが、『[数量]フィールドのデータを表示するテキストボックスは[txt数量]とする』みたいなルールでやってるところもあるようなのでうまく読み取ってもらうしかないですね

37
もんぞう 2021/03/30 (火) 22:50:55 62ea7@f778d

hirotonさんへ

お願い②の件

計算式理解しました。
「A店~K店」のページが無い場合、合計数量が出ないということですね。

=IIf([Px]=DMin("Px","Q出力ページリスト","Py=" & [Py]),[合計数量])

前よりは軽いと思いますが、これも少し重いです。

「合計数量の表示をVBAで対応する場合」

Me![合計数量].Format = " "
の部分だと思うのですがエラーが出ます。

よろしくお願いします。

3

リンク先の方法とか、他にはページフォーマットでLineメソッドで直線を描画するとかの方法はありますよ。

Lineメソッドの使い方は下記が参考になるかと。

レコードがない場合も用紙の最後まで罫線を出力する関数 - hatena chips

まあ、上記のコードを書いている時間より、目分量でやる方が速いですけどね。

2

目分量の調整しかできないということですね
目分量で合わせて微妙な隙間は一枚目の画像のようになるものとして割り切るしかなさそうですね

1

私の場合は、ページ設定の「下余白」の値をプレビューしながら調整してます。

それが面倒ということなら、下記で紹介した方法を使うかですかね。

ページの最後の罫線を太線にする - hatena chips

36
もんぞう 2021/03/29 (月) 20:22:08 62ea7@f778d

hirotonさんへ

お願い①の件
無事できました。
何も分かっておらずお手数おかけしました。
順番がおかしかったので[棚番号]を追加しました。
「Q出力商品ページグループ」

SELECT Q出力商品リスト.棚番号, Q出力商品リスト.商品名, DCount("*","Q出力商品リスト","棚番号<'" & [棚番号] & "'") AS [No], Int([No]/17) AS Py
FROM Q出力商品リスト;

お願い②の件
少しお時間をください

'Q出力全ページデータ.f8を有効なフィールド名、または式として認識できません。の件
無事できましたが下記のような感じで大丈夫でしょうか?
「Q出力店舗」

TRANSFORM Max(Q出力店舗リスト_連番付き.店舗名) AS 店舗名の最大
SELECT Q出力店舗リスト_連番付き.Px
FROM Q出力店舗リスト_連番付き
GROUP BY Q出力店舗リスト_連番付き.Px
PIVOT "f" & [f] In ("f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10");

お願い④の件
少しお時間をください。

追加アドバイスありがとうございます。
まだ確認できてない部分もありますのでまた後日書き込みます。

4
りんご 2021/03/29 (月) 19:53:15 48103@0e907 >> 2

現在、ウィザードの設定で、テーブルAとテーブルBのリンクが出来た、
リンクが無いデータも登録出来る(=参照整合性OFF)状態と想像します。
リレーションシップの設定で、結合線を引いてダブルクリックすると、参照整合性をONに出来ます。
活用する事で、リンク切れを予防出来る意味があるのでしょう。

3
朝起き 2021/03/29 (月) 16:32:54 58219@d2f94 >> 2

ありがとうございます解説を読んでみます

>りんごさん
そうです。わざわざリレーションシップの設定でやる意味がわからずに質問しました

2
寿司マン 2021/03/29 (月) 16:31:38 58219@d2f94

できないんですね
フォームの印刷プレビューボタンを押すたびに、レポートを閉じて新しく開くような仕組みにするしかなさそうですね

2
りんご 2021/03/29 (月) 14:29:09 48103@0e907

テーブルBのフォームにテーブルA(のフォーム)をサブフォームとして配置すると、ウィザードのようなものが表示され、自動的にリレーション出来るじゃないか!?という質問でよろしいでしょうか?

1

印刷プレビューは更新や再クエリ出来ないので、いったん閉じて再度開くしかないと思います。

35

合計数量の表示をVBAで対応する場合
レポートデザインで「Py」にヘッダーセクションを付けます
改ページを「カレント セクションの前」に設定します

'Pyヘッダーのフォーマット時
Private Sub グループヘッダー1_Format(Cancel As Integer, FormatCount As Integer)
    Me!合計数量.Format = ""
End Sub

'ページヘッダーのフォーマット時
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
    Me!合計数量.Format = " "
End Sub

※グループヘッダー1は「Py」のヘッダーの名前です。実際のデータに合わせて変更してください


あれこれ試していたら思っていたよりも簡素になりました。ただ、これが何で正しく動くのかというのは結構難解な気がします。解説は必要であれば、ということで