考え方は同じですよ 論理演算(基礎知識)や演算子の優先順位(システムによりけり)に気を付ける必要はありますが
例えばクエリにフィールドを追加するなら
フィールド|式1: IsNull([条件1テキスト]) And Not [条件1] Or IsNull([条件2テキスト]) And Not [条件2] Or IsNull([条件3テキスト]) And Not [条件3] Or IsNull([条件4テキスト]) And Not [条件4] 抽出条件 |True
すばらしい!そのようなアイデアがありましたね。ありがとうございます。
条件が追加されました・・ 条件1~4はチェックボックスなのですが、それぞれ関連するテキストボックスがあり それぞれ「「条件1テキストボックス」が空かつ「条件1チェックボックス」がfalse」という条件になりました。 こうなってくると、やはり4行(12行)ですよね。
各メールアドレスの最初にかならず「,」をつけて、最後に1文字目を取り除くとか
Mid(Format([Cc1], "\,&") & Format([Cc2], "\,&") & Format([Cc3], "\,&") & "," & testMail, 2)
In演算子のことを勉強したことがありましたが、すっかり忘れていました。 このような使い方ができるのですね。ありがとうございます!
混雑時を避ければ表示は、早いのでformatによる整形とMe.Visible = Falseを入れてみたりして改善してみます。非常に助かりました。有難う御座いました。
定義域集計関数をループで繰り返し呼び出したり、クエリ内の演算フィールドで使う場合は重くなる可能性がありますが、 一回だけ呼び出すのなら、定義域集計関数の第2引数に設定するテーブル、クエリの設計、第3引数の抽出条件の設定次第です。 他の方法(DAO, ADOなど)を使ってもテーブル、クエリの設計、抽出条件の設定が悪ければ同様に時間がかかります。
T'sWareさんの定義域集計関数とSQLの比較でも10000回呼び出して差が10秒ですので1回あたりでは0.001秒ですので体感できる差ではないです。一回だけ呼び出すのなら、代替関数と比較すべきですのて、むしろ遅くなってます。
定義域集計関数で時間がかかっているのなら(それも本当にそうなかの検証も必要です。別の部分で時間がかかっているのかも知れません。)、テーブル、クエリの設計、抽出条件の設定から検討する必要があります。
高速化について参考になれば Q.Access って1万件超えると遅くて使い物にならないって本当ですか?(Fly me to the Access Heaven (クラウド対応版)さん) 定義域集計関数とSQLの比較(T'sWareさん)
ネットワーク越しで何度も読み込みたくないならフォームを作って閉じる代わりにMe.Visible = Falseするような仕掛けが簡単かな
Me.Visible = False
私も、そこまで詳しくないので、VBAで探すか、クエリで集計しておくか、フォームのテキストボックスに計算式入れておくかで、軽くなるのかよくわかりません。分かる人に、回答を任せますね。
ご回答有難う御座いました。恐らくなんとかなりそうです。 一般的に、合計を求めてダイアログボックスに表示する方法は、集計関数を使う方法しかないのでしょうか?レコード数であればadoという手もあるのですが。ローカルな環境では無い為、混雑してる時間ですと8個の計算結果を1つのダイアログボックスに表示している為、パソコンが固まり、タスクマネージャーで消すというリスクがある為、一般的にもこの様な事象が起こっているのか気になりまして。そこの所を教えて頂けないでしょうか?
VBA TextBoxに入力された8桁の数値を日付に変換する、をググるといけるかも?
ご回答有難う御座います。テキストボックスには、8桁日付けしか入れれない為Format関数をどのタイミングで入れれば良いか分かりません。msgboxの前に変数の構文を作りそれに対して使えば良いのでしょうか?set 変数=format(value)見たいな感じでしょうか?
Format関数、“mm月dd日“でどうですか?
有難うございます。上手く行きました。テキストボックスの日付もmsgboxに表示する為に、me.日付入力.valueも入れています。ただ、8桁日付けで本日でしたら20201116と表示され見た目が良くない為、11月16日と置き換える事は、できますでしょうか?宜しくお願い致します。
エラーの状況がよくわからないけれど、 フォームに名前プロパティ:日付け入力のテキストボックスを作って クエリの抽出条件に [Forms]![作成したフォームの名前]![日付け入力] でどうですか?
「商品番号」という名前から主キーのような感じですが、主キーですか。 主キーなら、「商品番号」を指定してたらレコードは1件になるので、ラジオボタンの意味がないと思いますが。
あるいは、商品番号とオプショングルーブで指定した区別の2つはAND条件ではなく、OR条件ということでしょうか。
社員情報テーブルに目標IDフィールドを追加、社員情報履歴テーブルの作成でも行けるかも? 例えば、 ①朝の出勤ラッシュが終わったら、出勤した社員情報データを社員情報履歴テーブルに追加クエリ。 (とりあえず、社員IDと目標IDと日付) ②1日の業務が終わったら、出勤した社員情報テーブルの目標IDを更新クエリ。
hiroton さんの回答でいいと思いますが、別案を。 In演算子を使うと下記のように記述できます。
よく理解できました。場合分けが面倒で、妥協しようかと思ってたところもあったので、かなり助かりました。ありがとうございます!
フォームのプロパティを下記のように設定すれば下図のようにはなります。
角丸は画像を使えば可能ですが、そこまで労力をかけるまでもないとは思います。
「本日の目標」は営業日のみです
日付 名前 目標ID 2020/11/12 田中 1 2020/11/12 鈴木 1 2020/11/12 高橋 1 2020/11/13 田中 2 2020/11/13 鈴木 2 : : 2020/12/13 田中 40 2020/12/14 田中 1
と、日付が変わるごとに目標IDをずらしていき 最後まで来ると、また1から、というループにしたいです
プロパティを適当にいじってたら治ったようです。一時的なもので、また動かなくなる気もしますが。。 とりあえずリフレッシュの件を勉強できてよかったです。 hiroton様ありがとうございました!
ありがとうございます!時間が取れるタイミングでリフレッシュしてみたいと思います。 1つ気づいたことがあったので報告させていただきます。
該当のフォームをダブルクリックした時波打つと書いていましたが、 正確にはデスクトップに並んでいるアイコンが一瞬チカチカする感じでした。。
名刺上では無理でしょう。 ローマ字表記にするしかないのでは。
というか名刺には社員名が印字されていますよね。 わさわざQRコードにする意味はなんですか。
メールアドレスとかをQRコードにするなら分かりますが。
謎の現象が起きる場合はとりあえずリフレッシュ AccessのDBファイルを長期的に安定して使用するには(hatena chips さん) 該当箇所は記事の下のほうです
もしかすると Windows 10 バージョン 2004 (20H1) / 20H2 上で 半角カナのフォームを含んだ Access ファイルでエラーが発生する
たぶんそう(12行に)なると思います が、条件が複雑になるときは、「条件式でフィールドを作る」とすっきりできる場合があります
たとえばクエリデザインで
式1: Not [条件1] Or Not [条件2] Or Not [条件3] Or Not [条件4]
というフィールドを追加します。このクエリを表示すると式1フィールドに「条件1~4のいずれかがfalse」なら「-1」、それ以外なら「0」と表示されます。このフィールドに対して抽出条件を設定すれば「①のために抽出条件を4行作っています。」が1行で済むようになります
ちなみに上記の「-1」「0」はそれぞれ「True」「False」に対応しています。フィールドには内部的な値(数値)が表示されるということですね。なので、抽出条件の部分には「True」と指定してあげれば望みの条件になります
③「条件6が"済"か"途中"か"開始"」
も、抽出にHITさせたいときには「True」となるような条件式のフィールド
フィールド->式2: [条件6]="済" Or [条件6]="途中" Or [条件6]="開始" 抽出条件->True
を作ってあげれば1行で済み、「① AND ② AND ③」の形で抽出条件は1行にできます
hiroton 様 ご回答ありがとうございます。 おっしゃるとおり社員名フィールドは日本語です。
社員名フィールドを社員番号フィールドにするとしたらどうやって社員名と紐づけしたらよろしいのでしょうか・・?
社員名に日本語を使っていませんか?Microsoft Barcode Controlは全角文字に対応していないのでそういう文字が含まれていると表示されないようです
再現確認、ありがとうございます。 とりあえず、ListCount<2で対応中です。
試してみました(ACCESS2013)たしかに謎の挙動をしますね フォームを開いた後何もせずに(ACCESSも触らずに)ほかの作業をしてしばらくしてからテキストボックスをクリックすると「1」になることもある。 Me.RecalcやMe.リスト2.Requeryを入れると必ず「0」になる。 等の挙動を追加で確認できました
Me.Recalc
Me.リスト2.Requery
とりあえず、データがないときのListCountの値が重要になるとも思えないのでListCount<2の判定で処理を組んだらどうでしょうか
ListCount
ListCount<2
すみません。解決しました。 具体的には、2個のクエリを使い、ご指摘の部分のみ1個目のクエリで変更。 2個目のクエリでそれ以外を変更し、うまくいきました。 ありがとうございました。
更新ボタンを押したら、 以下、VBA 新データの先頭レコードに移動 旧データの非連結テキストボックス(事前準備)に新データのIDを代入 旧データを非連結テキストボックスとクエリ(事前準備)で絞り込み 旧データの利益率フィールドに新しい利益率を代入 新データの次行に移動 の繰り返しが出来れば、どうだろうという感じです。
休業日とか決まってないのですか。普通の営業形態は、休業日か決まっていて(当然営業日も決まる)。休日出勤があるとしても「本日の目標」は営業日のみにあるのが普通かなと思いましたが。
とくに休業日が決まっていないなら、全ての日付のマスターテーブルを作成してそれに連番を持たせるようにすればいいでしょう。 社員が出社したときだけ本日の目標を発行するということなら、その都度、営業日マスターにその日付を追加するようにすればいいでしょう。
営業日をマスタ化するのですか? 営業日が前もって決まっているわけではなく、出勤簿をつけるときにはじめて確定します 紙ベースでいうと出勤簿用紙があり、日付などを書いたあとに、出勤順にリスト状に記入していく感じです
ありがとうございます。 一旦該当のテキストボックスから数値を変数化して、クエリの部分をVBAにして、繰り返しさせるようなイメージでしょうか…
ご確認ありがとうございます。ご指摘の部分が、非連結のテキストボックスになっており、クエリ内に反映できない状況です。この部分はメインフォームで、その他はサブフォームになっています。 ヒントをいただいているのに、質問ばかりで申し訳ありません。
[Forms]![F_見積作成]![txt利益率反映]
YESのデータが50件エクセル行みたいなイメージであるとします。1件目の先頭データ行に移動すると、フォーカスがあたり編集出来るっぽい状態になるかもしれない。そこで、更新クエリをすると、1件目の結果が反映。次の行に移動して、2件目の結果を反映。…1件ずつの結果を50回更新クエリする感じでしょうか?
Q_見積明細.利益率 = [Forms]![F_見積作成]![txt利益率反映],というようにフォームを参照するのではなく、クエリ内のフィールドの値を利用して利益率を計算するようにしてください。
Q_見積明細.利益率 = [Forms]![F_見積作成]![txt利益率反映],
パーセンテージ表示はうまくいきました。ありがとうございました。 >クエリ内で利益率を計算
下記に修正してみましたが、結果は変わらず1件の結果が他のものに反映されます… 勘違いしていますか?解決法はありますでしょうか。
UPDATE Q_見積明細 SET Q_見積明細.利益率 = [Forms]![F_見積作成]![txt利益率反映], Q_見積明細.提供単価 = Int([仕入価格]/(1-[利益率])/[数量]+0.5) WHERE (((Q_見積明細.[チェック])=Yes));
おかげ様で解決いたしました!! ラベル(テキストボックス)の方の設定が不十分でした・・・ 本当にありがとうございました。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
考え方は同じですよ
論理演算(基礎知識)や演算子の優先順位(システムによりけり)に気を付ける必要はありますが
例えばクエリにフィールドを追加するなら
すばらしい!そのようなアイデアがありましたね。ありがとうございます。
条件が追加されました・・
条件1~4はチェックボックスなのですが、それぞれ関連するテキストボックスがあり
それぞれ「「条件1テキストボックス」が空かつ「条件1チェックボックス」がfalse」という条件になりました。
こうなってくると、やはり4行(12行)ですよね。
各メールアドレスの最初にかならず「,」をつけて、最後に1文字目を取り除くとか
In演算子のことを勉強したことがありましたが、すっかり忘れていました。
このような使い方ができるのですね。ありがとうございます!
混雑時を避ければ表示は、早いのでformatによる整形とMe.Visible = Falseを入れてみたりして改善してみます。非常に助かりました。有難う御座いました。
定義域集計関数をループで繰り返し呼び出したり、クエリ内の演算フィールドで使う場合は重くなる可能性がありますが、
一回だけ呼び出すのなら、定義域集計関数の第2引数に設定するテーブル、クエリの設計、第3引数の抽出条件の設定次第です。
他の方法(DAO, ADOなど)を使ってもテーブル、クエリの設計、抽出条件の設定が悪ければ同様に時間がかかります。
T'sWareさんの定義域集計関数とSQLの比較でも
10000回呼び出して差が10秒ですので1回あたりでは0.001秒ですので体感できる差ではないです。一回だけ呼び出すのなら、代替関数と比較すべきですのて、むしろ遅くなってます。定義域集計関数で時間がかかっているのなら(それも本当にそうなかの検証も必要です。別の部分で時間がかかっているのかも知れません。)、テーブル、クエリの設計、抽出条件の設定から検討する必要があります。
高速化について参考になれば
Q.Access って1万件超えると遅くて使い物にならないって本当ですか?(Fly me to the Access Heaven (クラウド対応版)さん)
定義域集計関数とSQLの比較(T'sWareさん)
ネットワーク越しで何度も読み込みたくないならフォームを作って閉じる代わりに
Me.Visible = False
するような仕掛けが簡単かな私も、そこまで詳しくないので、VBAで探すか、クエリで集計しておくか、フォームのテキストボックスに計算式入れておくかで、軽くなるのかよくわかりません。分かる人に、回答を任せますね。
ご回答有難う御座いました。恐らくなんとかなりそうです。
一般的に、合計を求めてダイアログボックスに表示する方法は、集計関数を使う方法しかないのでしょうか?レコード数であればadoという手もあるのですが。ローカルな環境では無い為、混雑してる時間ですと8個の計算結果を1つのダイアログボックスに表示している為、パソコンが固まり、タスクマネージャーで消すというリスクがある為、一般的にもこの様な事象が起こっているのか気になりまして。そこの所を教えて頂けないでしょうか?
VBA TextBoxに入力された8桁の数値を日付に変換する、をググるといけるかも?
ご回答有難う御座います。テキストボックスには、8桁日付けしか入れれない為Format関数をどのタイミングで入れれば良いか分かりません。msgboxの前に変数の構文を作りそれに対して使えば良いのでしょうか?set 変数=format(value)見たいな感じでしょうか?
Format関数、“mm月dd日“でどうですか?
有難うございます。上手く行きました。テキストボックスの日付もmsgboxに表示する為に、me.日付入力.valueも入れています。ただ、8桁日付けで本日でしたら20201116と表示され見た目が良くない為、11月16日と置き換える事は、できますでしょうか?宜しくお願い致します。
エラーの状況がよくわからないけれど、
フォームに名前プロパティ:日付け入力のテキストボックスを作って
クエリの抽出条件に
[Forms]![作成したフォームの名前]![日付け入力]
でどうですか?
「商品番号」という名前から主キーのような感じですが、主キーですか。
主キーなら、「商品番号」を指定してたらレコードは1件になるので、ラジオボタンの意味がないと思いますが。
あるいは、商品番号とオプショングルーブで指定した区別の2つはAND条件ではなく、OR条件ということでしょうか。
社員情報テーブルに目標IDフィールドを追加、社員情報履歴テーブルの作成でも行けるかも?
例えば、
①朝の出勤ラッシュが終わったら、出勤した社員情報データを社員情報履歴テーブルに追加クエリ。
(とりあえず、社員IDと目標IDと日付)
②1日の業務が終わったら、出勤した社員情報テーブルの目標IDを更新クエリ。
hiroton さんの回答でいいと思いますが、別案を。
In演算子を使うと下記のように記述できます。
よく理解できました。場合分けが面倒で、妥協しようかと思ってたところもあったので、かなり助かりました。ありがとうございます!
フォームのプロパティを下記のように設定すれば下図のようにはなります。
角丸は画像を使えば可能ですが、そこまで労力をかけるまでもないとは思います。
「本日の目標」は営業日のみです
日付 名前 目標ID
2020/11/12 田中 1
2020/11/12 鈴木 1
2020/11/12 高橋 1
2020/11/13 田中 2
2020/11/13 鈴木 2
:
:
2020/12/13 田中 40
2020/12/14 田中 1
と、日付が変わるごとに目標IDをずらしていき
最後まで来ると、また1から、というループにしたいです
プロパティを適当にいじってたら治ったようです。一時的なもので、また動かなくなる気もしますが。。
とりあえずリフレッシュの件を勉強できてよかったです。
hiroton様ありがとうございました!
ありがとうございます!時間が取れるタイミングでリフレッシュしてみたいと思います。
1つ気づいたことがあったので報告させていただきます。
該当のフォームをダブルクリックした時波打つと書いていましたが、
正確にはデスクトップに並んでいるアイコンが一瞬チカチカする感じでした。。
名刺上では無理でしょう。
ローマ字表記にするしかないのでは。
というか名刺には社員名が印字されていますよね。
わさわざQRコードにする意味はなんですか。
メールアドレスとかをQRコードにするなら分かりますが。
謎の現象が起きる場合はとりあえずリフレッシュ
AccessのDBファイルを長期的に安定して使用するには(hatena chips さん)
該当箇所は記事の下のほうです
もしかすると
Windows 10 バージョン 2004 (20H1) / 20H2 上で 半角カナのフォームを含んだ Access ファイルでエラーが発生する
たぶんそう(12行に)なると思います
が、条件が複雑になるときは、「条件式でフィールドを作る」とすっきりできる場合があります
たとえばクエリデザインで
というフィールドを追加します。このクエリを表示すると式1フィールドに「条件1~4のいずれかがfalse」なら「-1」、それ以外なら「0」と表示されます。このフィールドに対して抽出条件を設定すれば「①のために抽出条件を4行作っています。」が1行で済むようになります
ちなみに上記の「-1」「0」はそれぞれ「True」「False」に対応しています。フィールドには内部的な値(数値)が表示されるということですね。なので、抽出条件の部分には「True」と指定してあげれば望みの条件になります
も、抽出にHITさせたいときには「True」となるような条件式のフィールド
を作ってあげれば1行で済み、「① AND ② AND ③」の形で抽出条件は1行にできます
hiroton 様
ご回答ありがとうございます。
おっしゃるとおり社員名フィールドは日本語です。
社員名フィールドを社員番号フィールドにするとしたらどうやって社員名と紐づけしたらよろしいのでしょうか・・?
社員名に日本語を使っていませんか?Microsoft Barcode Controlは全角文字に対応していないのでそういう文字が含まれていると表示されないようです
再現確認、ありがとうございます。
とりあえず、ListCount<2で対応中です。
試してみました(ACCESS2013)たしかに謎の挙動をしますね
フォームを開いた後何もせずに(ACCESSも触らずに)ほかの作業をしてしばらくしてからテキストボックスをクリックすると「1」になることもある。
Me.Recalc
やMe.リスト2.Requery
を入れると必ず「0」になる。等の挙動を追加で確認できました
とりあえず、データがないときの
ListCount
の値が重要になるとも思えないのでListCount<2
の判定で処理を組んだらどうでしょうかすみません。解決しました。
具体的には、2個のクエリを使い、ご指摘の部分のみ1個目のクエリで変更。
2個目のクエリでそれ以外を変更し、うまくいきました。
ありがとうございました。
更新ボタンを押したら、
以下、VBA
新データの先頭レコードに移動
旧データの非連結テキストボックス(事前準備)に新データのIDを代入
旧データを非連結テキストボックスとクエリ(事前準備)で絞り込み
旧データの利益率フィールドに新しい利益率を代入
新データの次行に移動
の繰り返しが出来れば、どうだろうという感じです。
休業日とか決まってないのですか。普通の営業形態は、休業日か決まっていて(当然営業日も決まる)。休日出勤があるとしても「本日の目標」は営業日のみにあるのが普通かなと思いましたが。
とくに休業日が決まっていないなら、全ての日付のマスターテーブルを作成してそれに連番を持たせるようにすればいいでしょう。
社員が出社したときだけ本日の目標を発行するということなら、その都度、営業日マスターにその日付を追加するようにすればいいでしょう。
営業日をマスタ化するのですか?
営業日が前もって決まっているわけではなく、出勤簿をつけるときにはじめて確定します
紙ベースでいうと出勤簿用紙があり、日付などを書いたあとに、出勤順にリスト状に記入していく感じです
ありがとうございます。
一旦該当のテキストボックスから数値を変数化して、クエリの部分をVBAにして、繰り返しさせるようなイメージでしょうか…
ご確認ありがとうございます。ご指摘の部分が、非連結のテキストボックスになっており、クエリ内に反映できない状況です。この部分はメインフォームで、その他はサブフォームになっています。
ヒントをいただいているのに、質問ばかりで申し訳ありません。
YESのデータが50件エクセル行みたいなイメージであるとします。1件目の先頭データ行に移動すると、フォーカスがあたり編集出来るっぽい状態になるかもしれない。そこで、更新クエリをすると、1件目の結果が反映。次の行に移動して、2件目の結果を反映。…1件ずつの結果を50回更新クエリする感じでしょうか?
Q_見積明細.利益率 = [Forms]![F_見積作成]![txt利益率反映],
というようにフォームを参照するのではなく、クエリ内のフィールドの値を利用して利益率を計算するようにしてください。パーセンテージ表示はうまくいきました。ありがとうございました。
>クエリ内で利益率を計算
下記に修正してみましたが、結果は変わらず1件の結果が他のものに反映されます…
勘違いしていますか?解決法はありますでしょうか。
おかげ様で解決いたしました!!
ラベル(テキストボックス)の方の設定が不十分でした・・・
本当にありがとうございました。