Din cnt As Long
cnt = DCount("メールテンプレID","T_送付","チェック= True AND メールテンプレID Is Null"))
If cnt > 0 Then
MsgBox "チェックしたデータの中にメールテンプレを選択していないものが" & cnt & "件あります。"
Exit Sub '中止
End If
Private Sub btn案件NO検索_Click()
Dim ctl As Control
For Each ctl In Me.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox
If ctl.Name <> "txt案件NO検索" Then ctl.Value = Null
End Select
Next
DoCmd.OpenForm "F_案件", , "", "[案件NO]=[Forms]![F_メインメニュー]![txt案件NO検索]"
End Sub
DCountでよかったのですね。。
簡単な方法にすぐ結び付けず、教えていただいてたすかります。
ちなみに、
DCount("メールテンプレID",
とすると、メールテンプレIDがNullのせいか、中止が適用されなかったため
DCount("チェック",
にしたところ、うまく作動し、数も数えてくれました。
ありがとうございました!
hiroton さん
+と&の違いは気になっていたところでした。詳しく教えていただきありがとうございます。
確かに、IIfだとわたしでも理解できました。
Format関数の解説もありがとうございます。あとでじっくり確認させていただきます。
アドバイスありがとうございます。
最低限必要な設定は大変参考になりました。
まずは試しみたいと思います。
=[Cc1] & Format([Cc2],"\,&") & Format([Cc3],"\,&")
今更ですが、「"\,&") 」これの意味がわかりきれておりません。
解説ページを探すのですが、検索できず…
その他、①nullについて②""の使い方←SQLのWHEREと関係ある??
がなかなか理解できず困っております。
ありがとうございます。こちらを使わせていただきます!
nullは難しいですね…
説明を読んでも未だ、理解しきれておりません。
空白だったら…の条件を設定する際はいつも悩んでしまいます。
このQA面白いですね。とても勉強になります
kitasueさん、cerophanさん
VBAは文字列の連結に「+」を許容しますが、特別な理由がない限り「&」を使うべきです。Nz()関数は評価値がNullであることを条件に特別な処理をする関数ですが、評価値の最初に
Chr(13)
がある時点で、これがNullになることがあるのか?と疑問に思ってしまいます。条件分岐で処理をするならとするほうが、何をしているのかわかるコードになります。hatenaさん指摘のとおり、データ形式によってはうまく動作しないことも考えられます
Format 関数
改めて眺めていましたが難しい関数ですね。
Nullはまだしも「長さ0の文字列("")」は「すべての文字列データ」に該当しないんですねぇ
何もしないためにFormat()関数を使うのはかなり高等テクニックだと思います。さすがhatenaさんですね
ちなみに、チェックするだけなら、下記のように DCont関数でチェックすることもできます。
strSQL = "SELECT チェック, メールテンプレID FROM T_送付 WHERE チェック= True AND メールテンプレID Is Null)"
上記の部分の最後の
)
が余分です。削除するか、;
に変更してください。hatenaさま
>ウィザードで作成するとテーブルの書式設定を引き継ぐと思いますが、自分で配置した場合は引き継がないので、自分で書式を設定する必要があります。
そういうことだったんですね。よくわかりました。
ありがとうございました。
"{添付2}", Format([添付2案件], Chr(13) & Chr(10) & "&")),
"{添付3}", Format([添付3案件], Chr(13) & Chr(10) & "&")),
"{添付4}", Format([添付4案件], Chr(13) & Chr(10) & "&")) _
だと、[添付2案件] が Null でも "" でもOKです。
kitasue様
うまくいきました!ありがとうございました。
"{添付2}", Nz(Chr(13) + Chr(10) + [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) + [添付3案件], "")),
"{添付4}", Nz(Chr(13) + Chr(10) + [添付4案件], "")) _
でいかがでしょうか。
>空欄がない場合は
⇒空欄の場合は・・の間違いです・・
ありがとうございます。
後者を使いたいのですが、空欄が出る欄については空欄がない場合は改行をしたくないという条件を付けたく思っています。そこで、下記の式を作りましたが、データがあってもなくても改行してしまいます…なぜでしょうか。
勉強のため、大変でなければ、Replaceでの正解も教えていただけると助かります。
"{添付2}", Nz(Chr(13) + Chr(10) & [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) & [添付3案件], "")),
"{添付4}", Nz(Chr(13) + Chr(10) & [添付4案件], "")) _
まずは、最低限下記の設定を行っておきます。
データベース パスワードを使用してデータベースを暗号化する - Access
テーブルデータを保護する - hatena chips
ライセンス認証に関しては、その機能を提供てくれるソフトやシステムがあるかどうかは私は知りません。(さくっと検索してみましたが見つけることかできなかった)
自前で作成するなら、サーバーを用意して、データベースとサーバーサイトシステムでユーザー管理をすることになると思いますが、それに関しては、Accessとはまた別の話になりますので、ここで質問するより、別の適切な掲示板で質問したほうが情報は得やすいと思います。
Nz関数をつかう。
Replace([本文], "【氏名】", Nz([氏名],""))
あるいは、
テーブルのデザインビューでフィールドの「値要求」プロパティを「はい」に、「空文字列の許可」を「はい」に設定する。
上記の2つの対策のどちらかをしてください。
後者の方がお勧めです。
VBAでイミディエイトウィンドウでテストしてみたところ、どうもフィールドが空のところを追加するとエラーが出るようでした。解決方法を探ってみることにします。
=Replace(Replace(Replace(Replace(Replace([本文], "【氏名】", [氏名]), "【品名】", [品名]), "【入荷予定日】", [入荷予定日]), "【価格】", [価格]), "【担当者】", [担当者])
↑この式を使って、クエリに入力してタイトルはうまくいったのですが、メール本文の式が長すぎてエラーが出ます。
VBAに組み込みたいと思ったのですが、どうやって組み込んだらいいか、答えが見つからない状況です…
方法はありますでしょうか。
返信が遅れて申し訳ありません。。
kitasueさんのご回答内容を元に出来ました。
感謝致します。
クエリに式を入れたらうまくいきました!
WEBスクレイピングの件も、調べてみます。ありがとうございました!!
メールテンプレを作成してみたのですが、
コントロールソースに
=Replace([メールタイトル],"【タイトル一部】",[タイトル一部])
と入れるとエラーになり、#Type!と表示されています。
ちなみに、
=Replace([メールタイトル],"【タイトル一部】","テスト")
や
[タイトル一部]
はうまくいきます。
ウィザードで作成するとテーブルの書式設定を引き継ぐと思いますが、自分で配置した場合は引き継がないので、自分で書式を設定する必要があります。
テキストボックスの書式プロパティにテーブルのフィールドに設定した書式と同じものを設定すればいいでしょう。
もちろん、Accessだけでは難しいと思います。しかし、世の中にはAccessで作られたパッケージソフトが販売されていて、それらはライセンス認証をしないと使えないようになっています。おそらく別ソフト・システムが必要だと思うのですが、一体何を使っているのか、ご存じの方がおられれば、教えて頂きたいです。
あと、メーラーがWEBメールなら、WEBスクレイピングという方法で自動化できるかもしれません(セキュリティがきつく設定してあるとできない場合もありますが)。
「VBA WEBスクレイピング」で検索する解説ページがいろいろ見つかります。
なるほど…本当に勉強になります。素晴らしいですね!
Cc1, Cc2, Cc3 というフィールドがあるということなら、
Cc欄のテキストボックスのコントロールソースを下記のようにすればいいでしょう。
ごめんなさい、作成方法は今から確認しようと思いながら違う質問をしたつもりでしたが、同じことで対応できそうですね!すみません。確認します。
ありがとうございます!メーラーが会社の規定のもので、WEBメーラーなので送信にはつなげられないかもしれませんが、作成の部分は参考にさせていただき、今から作成していきます!
そこで1つ質問です。
差込印刷では以下のようなことが可能でした。アクセスで行うにはどうしたらよいでしょうか。
コントロールソースへの式?クエリの設定?悩んでいます・・
TO欄
To1&","&To2
Cc欄
Cc1&","&Cc2&","&Cc3
メールアドレス欄。複数の場合は間に","が必要。
Ccについて、例えばCc1とCc2しかなければ、Cc3のまえの","が不要となる。
パスワードでロックする仕様のソフトなら、パスワードが分かれなば、コピーし放題ですよね。
そのために、最近のソフトはネットを通じて認証するような仕組みになってますよね。
そのような仕組みをAccessだけで構築するのは難しいですね。
コンボボックスの値集合ソースに MT_F_ID を設定したということでしょうか。
コンボボックスの値集合ソースはスナップショット(読み取り専用)ですので、ほかに影響を与えることは原理的にないです。原因は別にあると思います。
まず、そのVBAはどこに記述してあり、どのタイミングで実行されるのか。
また、そのコードのプロシージャ全体(Sub から End Sub まで)を提示してください。
それぞれのフォームで連結しているテーブルも異なり、検索対象のフィールドも異なるなら、ポップアップフォームで共通化するのはなかなかの難易度かと思います。
仕様の詳細が不明なのでなんともいえませんが。
もし少し仕様を明確にする方がいいでしょう。それがきまってなければ共通化しようがありません。
例えば「検索」(全件表示したまま該当レコードへ移動する)なのか「抽出」(フィルターをかける)なのか。
抽出結果は別フォームを開いて表示するのか、帳票フォームのヘッダーに条件を入力してそのフォームに抽出結果を表示するのか。
複数条件を設定する必要があるのか、ないのか。
とりあえず、「フォームフィルター」機能を使えば抽出機能(フィルターをかける機能)は簡単に実現できます。
■T'sWare Access Tips #590 ~フォームフィルタの使い方~
>hatena様
ありがとうございます!時間を取って確認しながら導入したいと思っております。
>hiroton様
なるほど、そこを変えた方がいいですね。現在はトップメニューと、
それぞれ中に入ったところにも手軽に検索できるように、ヘッダーに複数の検索ボックスを置いていました。
ポップアップで表示するように、検討してみたいと思います。
ありがとうございます。
「検索」という機能があちこちに分散している上に、それに使う値も「検索」機能のあるフォーム(ページ)とは違う場所から持ってきているんですか?
「検索」機能で本当にやりたいことがよくわかりませんが、インターフェースの設計を見直したほうがいい気がします
「検索」用のフォームを独立してつくり、各ページにサブフォームとして埋め込むとか、「検索」フォームのポップアッププロパティを「はい」にして開くとかすれば、検索機能を何回も作る必要はなくなります
やろうと思えばできますよ。
T_メールテンプレート
「本文」フィールドに下記のような感じでテンプレート文を入力します。
送信データテーブルは下記とします。
T_メール送信
クエリを作成して T_メール送信 と T_メールテンプレート を テンプレートID で結合します。
これをレコードソースとするフォームを作成して、テキストボックスを配置してコントロールソースを下記のように設定します。
これでフィールドのデータが差し込まれた本文が表示されます。
あとは、下記のような方法でメール送信できます。
■T'sWare Access Tips #463 ~既定のメールソフトで新規メールにデータを添付する方法~
AccessからVBAでメールを送信する2つの方法|アズビーパートナーズ
こんな方法があったんですね。うまくいきました!ありがとうございました。
クエリの設計が分からないということですね。
現状のクエリに、担当者のマスターテーブルを追加してあると思いますが、同じテーブルを複数追加することができます。
同じテーブルを追加していくと「担当者マスター_1」「担当者マスター_2」・・・と別名が付いていきますので、
担当者1、担当者2、担当者3 フィールドと各々のテーブルを結合していけばいいでしょう。
合体できない=一つのフィールドのみの条件という仕様にするなら、下記のようなコードにすればいいでしょう。
このようなフォーム、コントロールが多数あるというなら、汎用関数にしてそれを各フォームから呼び出すという方法にもできますが、まずは上記のコードを理解してからですね。
複数の抽出条件を設定したいということなら、下記を参考にしてください。
複数条件の抽出フォームの設計 その1 - hatena chips
上記はヘッダーに条件コントロールを配置して自身のフォームにフィルターをかけてますが、別のフォームを開く場合は、
生成された抽出条件(strFilter)を DoCmd.OpenForm のWhere条件引数に渡せばいいだけです。
こちらの件で引き続きの質問です。
フォームに担当者を選択するためのコンボボックスを4つ並べ、選択できる状態にはできました。
しかし、すべてID情報を取得するように設定すると、それをテキストボックスで表示する際
リレーションシップの問題で、複数のボックスに表示ができません。
(変なことを言ってたり、わかりづらければ申し訳ありません。)
直接表示させたいものを取得すれば複数でも可能ですが、
IDを取得して変換するのは無理でしょうか?(IDを取得して、ほかの情報もひっぱりたいため…)
ほかのボックスに検索条件が残っていると、
条件を合体できていると勘違いされそうなので、
どこかのタイミングで自動で消えるようにしたいと考えていました。
いずれは、検索条件を合体させたい(検索した結果から新たに絞り込みできる)
とも考えていたのですが複雑になりそうでしょうか。
いろんなページに複数の検索ボックスを配置しているので、あまり複雑なら
クリアボタン1個配置にとどめようかと考えています。
検索ボックスの1つは以下になります。
Private Sub btn案件NO検索_Click()
DoCmd.OpenForm "F_案件", , "", "[案件NO]=[Forms]![F_メインメニュー]![txt案件NO検索]"
End Sub
この検索はどのようにしてますか。VBAでしょうか。もし、そうならそのVBAを提示してください。
ただ、どのような検索条件の結果なのか確認するためにも、条件入力用コントロールの値は残っていた方がいいのよう思いますが。
検索条件クリアボタンを配置しておいて、そのクリックで条件入力用コントロールの値を消して、抽出も解除するようにすべきだと思います。