Microsoft Access 掲示板

6,622 件中 5,321 から 5,360 までを表示しています。
3
cerophan 2020/08/03 (月) 11:12:25 0029a@1c915 >> 1

DCountでよかったのですね。。
簡単な方法にすぐ結び付けず、教えていただいてたすかります。
ちなみに、
DCount("メールテンプレID",
とすると、メールテンプレIDがNullのせいか、中止が適用されなかったため
DCount("チェック",
にしたところ、うまく作動し、数も数えてくれました。
ありがとうございました!

20
cerophan 2020/08/03 (月) 10:27:22 0029a@1c915 >> 17

hiroton さん
+と&の違いは気になっていたところでした。詳しく教えていただきありがとうございます。
確かに、IIfだとわたしでも理解できました。
Format関数の解説もありがとうございます。あとでじっくり確認させていただきます。

4
nishizw 2020/08/03 (月) 10:26:23 e15b7@029ad

アドバイスありがとうございます。
最低限必要な設定は大変参考になりました。
まずは試しみたいと思います。

19
cerophan 2020/08/03 (月) 10:24:15 0029a@1c915

=[Cc1] & Format([Cc2],"\,&") & Format([Cc3],"\,&")

今更ですが、「"\,&") 」これの意味がわかりきれておりません。
解説ページを探すのですが、検索できず…

その他、①nullについて②""の使い方←SQLのWHEREと関係ある??
がなかなか理解できず困っております。

18
cerophan 2020/08/03 (月) 10:11:56 0029a@1c915 >> 16

ありがとうございます。こちらを使わせていただきます!
nullは難しいですね…
説明を読んでも未だ、理解しきれておりません。
空白だったら…の条件を設定する際はいつも悩んでしまいます。

17
hiroton 2020/08/03 (月) 09:44:15 46c09@f966d

このQA面白いですね。とても勉強になります

buf = "a" & "1"  'a1'
buf = "a" + "1"  'a1'
buf = "a" & 1    'a1'
buf = "a" + 1    'エラー'
buf = "a" & Null 'a'
buf = "a" + Null 'Null'
buf = "a" & ""   'a'
buf = "a" + ""   'a'

buf = Format("a", "追加文字&")   '追加文字a'
buf = Format("", "追加文字&")    '(空文字)'
buf = Format(Null, "追加文字&")  '(空文字)'

kitasueさん、cerophanさん
VBAは文字列の連結に「+」を許容しますが、特別な理由がない限り「&」を使うべきです。Nz()関数は評価値がNullであることを条件に特別な処理をする関数ですが、評価値の最初にChr(13)がある時点で、これがNullになることがあるのか?と疑問に思ってしまいます。条件分岐で処理をするなら

IIf([添付2案件]<>"",Chr(13) & Chr(10) & [添付2案件])

とするほうが、何をしているのかわかるコードになります。hatenaさん指摘のとおり、データ形式によってはうまく動作しないことも考えられます

Format 関数
改めて眺めていましたが難しい関数ですね。

1 セクションのみ 書式はすべての文字列データに適用されます。
2 セクション 最初のセクションは文字列データに適用され、第 2 のセクションは Null 値と長さ 0 の文字列 ("") に適用されます。

Nullはまだしも「長さ0の文字列("")」は「すべての文字列データ」に該当しないんですねぇ
何もしないためにFormat()関数を使うのはかなり高等テクニックだと思います。さすがhatenaさんですね

2

ちなみに、チェックするだけなら、下記のように DCont関数でチェックすることもできます。

Din cnt As Long
cnt = DCount("メールテンプレID","T_送付","チェック= True AND メールテンプレID Is Null")) 
If cnt > 0 Then
    MsgBox "チェックしたデータの中にメールテンプレを選択していないものが" & cnt & "件あります。"
    Exit Sub '中止
End If
1

strSQL = "SELECT チェック, メールテンプレID FROM T_送付 WHERE チェック= True AND メールテンプレID Is Null)"

上記の部分の最後の ) が余分です。削除するか、; に変更してください。

2
コロコロなるままに 2020/08/03 (月) 08:52:53 0029a@1c915 >> 1

hatenaさま
>ウィザードで作成するとテーブルの書式設定を引き継ぐと思いますが、自分で配置した場合は引き継がないので、自分で書式を設定する必要があります。

そういうことだったんですね。よくわかりました。
ありがとうございました。

16

"{添付2}", Format([添付2案件], Chr(13) & Chr(10) & "&")),
"{添付3}", Format([添付3案件], Chr(13) & Chr(10) & "&")),
"{添付4}", Format([添付4案件], Chr(13) & Chr(10) & "&")) _

だと、[添付2案件] が Null でも "" でもOKです。

15
cerophan 2020/08/02 (日) 12:25:24 0029a@1c915

kitasue様

うまくいきました!ありがとうございました。

14
kitasue 2020/08/02 (日) 11:11:00 ce705@e9d43

"{添付2}", Nz(Chr(13) + Chr(10) + [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) + [添付3案件], "")),
"{添付4}", Nz(Chr(13) + Chr(10) + [添付4案件], "")) _
でいかがでしょうか。

13
cerophan 2020/08/02 (日) 10:16:44 0029a@1c915

>空欄がない場合は
⇒空欄の場合は・・の間違いです・・

12
cerophan 2020/08/02 (日) 10:15:29 0029a@1c915

ありがとうございます。
後者を使いたいのですが、空欄が出る欄については空欄がない場合は改行をしたくないという条件を付けたく思っています。そこで、下記の式を作りましたが、データがあってもなくても改行してしまいます…なぜでしょうか。

勉強のため、大変でなければ、Replaceでの正解も教えていただけると助かります。

"{添付2}", Nz(Chr(13) + Chr(10) & [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) & [添付3案件], "")),

"{添付4}", Nz(Chr(13) + Chr(10) & [添付4案件], "")) _

3
hatena 2020/08/02 (日) 09:57:42 修正

まずは、最低限下記の設定を行っておきます。

ライセンス認証に関しては、その機能を提供てくれるソフトやシステムがあるかどうかは私は知りません。(さくっと検索してみましたが見つけることかできなかった)
自前で作成するなら、サーバーを用意して、データベースとサーバーサイトシステムでユーザー管理をすることになると思いますが、それに関しては、Accessとはまた別の話になりますので、ここで質問するより、別の適切な掲示板で質問したほうが情報は得やすいと思います。

11
hatena 2020/08/01 (土) 23:24:30 修正

どうもフィールドが空のところを追加するとエラーが出るようでした。

Nz関数をつかう。
Replace([本文], "【氏名】", Nz([氏名],""))

あるいは、
テーブルのデザインビューでフィールドの「値要求」プロパティを「はい」に、「空文字列の許可」を「はい」に設定する。

上記の2つの対策のどちらかをしてください。
後者の方がお勧めです。

10
cerophan 2020/08/01 (土) 23:04:33 0029a@1c915

VBAでイミディエイトウィンドウでテストしてみたところ、どうもフィールドが空のところを追加するとエラーが出るようでした。解決方法を探ってみることにします。

9
cerophan 2020/08/01 (土) 22:14:21 0029a@1c915

=Replace(Replace(Replace(Replace(Replace([本文], "【氏名】", [氏名]), "【品名】", [品名]), "【入荷予定日】", [入荷予定日]), "【価格】", [価格]), "【担当者】", [担当者])

↑この式を使って、クエリに入力してタイトルはうまくいったのですが、メール本文の式が長すぎてエラーが出ます。
VBAに組み込みたいと思ったのですが、どうやって組み込んだらいいか、答えが見つからない状況です…
方法はありますでしょうか。

3
oGFzgtnIStrl6D0 2020/08/01 (土) 14:37:36

返信が遅れて申し訳ありません。。
kitasueさんのご回答内容を元に出来ました。
感謝致します。

8
cerophan 2020/08/01 (土) 10:32:27 0029a@1c915

クエリに式を入れたらうまくいきました!
WEBスクレイピングの件も、調べてみます。ありがとうございました!!

7
cerophan 2020/08/01 (土) 10:13:01 0029a@1c915

メールテンプレを作成してみたのですが、
コントロールソースに
=Replace([メールタイトル],"【タイトル一部】",[タイトル一部])
と入れるとエラーになり、#Type!と表示されています。

ちなみに、
=Replace([メールタイトル],"【タイトル一部】","テスト")

[タイトル一部]
はうまくいきます。

1

ウィザードで作成するとテーブルの書式設定を引き継ぐと思いますが、自分で配置した場合は引き継がないので、自分で書式を設定する必要があります。

テキストボックスの書式プロパティにテーブルのフィールドに設定した書式と同じものを設定すればいいでしょう。

2
nishizw 2020/07/31 (金) 17:23:14 e15b7@029ad

もちろん、Accessだけでは難しいと思います。しかし、世の中にはAccessで作られたパッケージソフトが販売されていて、それらはライセンス認証をしないと使えないようになっています。おそらく別ソフト・システムが必要だと思うのですが、一体何を使っているのか、ご存じの方がおられれば、教えて頂きたいです。

6

あと、メーラーがWEBメールなら、WEBスクレイピングという方法で自動化できるかもしれません(セキュリティがきつく設定してあるとできない場合もありますが)。
「VBA WEBスクレイピング」で検索する解説ページがいろいろ見つかります。

5
cerophan 2020/07/31 (金) 15:45:01 0029a@1c915

なるほど…本当に勉強になります。素晴らしいですね!

4

Cc1, Cc2, Cc3 というフィールドがあるということなら、
Cc欄のテキストボックスのコントロールソースを下記のようにすればいいでしょう。

=[Cc1] & Format([Cc2],"\,&") & Format([Cc3],"\,&")
3
cerophan 2020/07/31 (金) 13:41:48 0029a@1c915

ごめんなさい、作成方法は今から確認しようと思いながら違う質問をしたつもりでしたが、同じことで対応できそうですね!すみません。確認します。

2
cerophan 2020/07/31 (金) 13:18:11 0029a@1c915

ありがとうございます!メーラーが会社の規定のもので、WEBメーラーなので送信にはつなげられないかもしれませんが、作成の部分は参考にさせていただき、今から作成していきます!
そこで1つ質問です。
差込印刷では以下のようなことが可能でした。アクセスで行うにはどうしたらよいでしょうか。
コントロールソースへの式?クエリの設定?悩んでいます・・

TO欄
To1&","&To2
Cc欄
Cc1&","&Cc2&","&Cc3

メールアドレス欄。複数の場合は間に","が必要。
Ccについて、例えばCc1とCc2しかなければ、Cc3のまえの","が不要となる。

1
hatena 2020/07/30 (木) 19:25:16 修正

パスワードでロックする仕様のソフトなら、パスワードが分かれなば、コピーし放題ですよね。

そのために、最近のソフトはネットを通じて認証するような仕組みになってますよね。
そのような仕組みをAccessだけで構築するのは難しいですね。

1

フォームにコンボボックスを作り、そのソースに[MT_F_ID]を指定したところ、

コンボボックスの値集合ソースに MT_F_ID を設定したということでしょうか。

前述のコード部分で実行時エラー 3008([MT_F_ID]が排他的どうこう)が出るようになりました。
エラーが出る原因はコンボボックスのソースにあることはわかりますが

コンボボックスの値集合ソースはスナップショット(読み取り専用)ですので、ほかに影響を与えることは原理的にないです。原因は別にあると思います。

まず、そのVBAはどこに記述してあり、どのタイミングで実行されるのか。
また、そのコードのプロシージャ全体(Sub から End Sub まで)を提示してください。

6

それぞれのフォームで連結しているテーブルも異なり、検索対象のフィールドも異なるなら、ポップアップフォームで共通化するのはなかなかの難易度かと思います。
仕様の詳細が不明なのでなんともいえませんが。

もし少し仕様を明確にする方がいいでしょう。それがきまってなければ共通化しようがありません。

例えば「検索」(全件表示したまま該当レコードへ移動する)なのか「抽出」(フィルターをかける)なのか。

抽出結果は別フォームを開いて表示するのか、帳票フォームのヘッダーに条件を入力してそのフォームに抽出結果を表示するのか。

複数条件を設定する必要があるのか、ないのか。

とりあえず、「フォームフィルター」機能を使えば抽出機能(フィルターをかける機能)は簡単に実現できます。

■T'sWare Access Tips #590 ~フォームフィルタの使い方~

5
cerophan 2020/07/30 (木) 12:36:57 0029a@1c915

>hatena様
ありがとうございます!時間を取って確認しながら導入したいと思っております。

>hiroton様
なるほど、そこを変えた方がいいですね。現在はトップメニューと、
それぞれ中に入ったところにも手軽に検索できるように、ヘッダーに複数の検索ボックスを置いていました。
ポップアップで表示するように、検討してみたいと思います。
ありがとうございます。

4
hiroton 2020/07/30 (木) 09:22:05 6f154@f966d

いろんなページに複数の検索ボックスを配置している

    DoCmd.OpenForm "F_案件", , "", "[案件NO]=[Forms]![F_メインメニュー]![txt案件NO検索]"

「検索」という機能があちこちに分散している上に、それに使う値も「検索」機能のあるフォーム(ページ)とは違う場所から持ってきているんですか?
「検索」機能で本当にやりたいことがよくわかりませんが、インターフェースの設計を見直したほうがいい気がします

「検索」用のフォームを独立してつくり、各ページにサブフォームとして埋め込むとか、「検索」フォームのポップアッププロパティを「はい」にして開くとかすれば、検索機能を何回も作る必要はなくなります

1

本当はアクセス内で解決したいですが、メールの長文の中に名前を差込むようなワードの差込印刷のような機能はありませんよね…?

やろうと思えばできますよ。

T_メールテンプレート

  • テンプレートID 数値型 主キー
  • タイトル テキスト型
  • 本文 テキスト型

「本文」フィールドに下記のような感じでテンプレート文を入力します。

【氏名】様

ご注文の【品名】の入荷予定日は【入荷予定日】です。
価格は【価格】円です。

株式会社 〇〇
担当 【担当者名】

送信データテーブルは下記とします。

T_メール送信

  • テンプレートID
  • 送信日
  • メールアドレス
  • 氏名
  • 品名
  • 入荷予定日
  • 価格
  • 担当者名

クエリを作成して T_メール送信 と T_メールテンプレート を テンプレートID で結合します。

これをレコードソースとするフォームを作成して、テキストボックスを配置してコントロールソースを下記のように設定します。

=Replace(Replace(Replace(Replace(Replace([本文], "【氏名】", [氏名]), "【品名】", [品名]), "【入荷予定日】", [入荷予定日]), "【価格】", [価格]), "【担当者】", [担当者])

これでフィールドのデータが差し込まれた本文が表示されます。

あとは、下記のような方法でメール送信できます。

■T'sWare Access Tips #463 ~既定のメールソフトで新規メールにデータを添付する方法~

AccessからVBAでメールを送信する2つの方法|アズビーパートナーズ

5
cerophan 2020/07/29 (水) 20:28:56 0029a@1c915

こんな方法があったんですね。うまくいきました!ありがとうございました。

4

しかし、すべてID情報を取得するように設定すると、それをテキストボックスで表示する際
リレーションシップの問題で、複数のボックスに表示ができません。

クエリの設計が分からないということですね。

現状のクエリに、担当者のマスターテーブルを追加してあると思いますが、同じテーブルを複数追加することができます。
同じテーブルを追加していくと「担当者マスター_1」「担当者マスター_2」・・・と別名が付いていきますので、
担当者1、担当者2、担当者3 フィールドと各々のテーブルを結合していけばいいでしょう。

3
hatena 2020/07/29 (水) 17:17:16 修正

条件を合体できていると勘違いされそうなので、
どこかのタイミングで自動で消えるようにしたいと考えていました。

合体できない=一つのフィールドのみの条件という仕様にするなら、下記のようなコードにすればいいでしょう。

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

このようなフォーム、コントロールが多数あるというなら、汎用関数にしてそれを各フォームから呼び出すという方法にもできますが、まずは上記のコードを理解してからですね。

いずれは、検索条件を合体させたい(検索した結果から新たに絞り込みできる)
とも考えていたのですが複雑になりそうでしょうか。

複数の抽出条件を設定したいということなら、下記を参考にしてください。

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

上記はヘッダーに条件コントロールを配置して自身のフォームにフィルターをかけてますが、別のフォームを開く場合は、
生成された抽出条件(strFilter)を DoCmd.OpenForm のWhere条件引数に渡せばいいだけです。

3
cerophan 2020/07/29 (水) 16:51:35 0029a@1c915

こちらの件で引き続きの質問です。
フォームに担当者を選択するためのコンボボックスを4つ並べ、選択できる状態にはできました。
しかし、すべてID情報を取得するように設定すると、それをテキストボックスで表示する際
リレーションシップの問題で、複数のボックスに表示ができません。
(変なことを言ってたり、わかりづらければ申し訳ありません。)
直接表示させたいものを取得すれば複数でも可能ですが、
IDを取得して変換するのは無理でしょうか?(IDを取得して、ほかの情報もひっぱりたいため…)

2
cerophan 2020/07/29 (水) 16:34:21 0029a@1c915

ほかのボックスに検索条件が残っていると、
条件を合体できていると勘違いされそうなので、
どこかのタイミングで自動で消えるようにしたいと考えていました。

いずれは、検索条件を合体させたい(検索した結果から新たに絞り込みできる)
とも考えていたのですが複雑になりそうでしょうか。
いろんなページに複数の検索ボックスを配置しているので、あまり複雑なら
クリアボタン1個配置にとどめようかと考えています。

検索ボックスの1つは以下になります。

Private Sub btn案件NO検索_Click()
    DoCmd.OpenForm "F_案件", , "", "[案件NO]=[Forms]![F_メインメニュー]![txt案件NO検索]"
End Sub

1

また、検索した瞬間にも消えてほしいです。

この検索はどのようにしてますか。VBAでしょうか。もし、そうならそのVBAを提示してください。

ただ、どのような検索条件の結果なのか確認するためにも、条件入力用コントロールの値は残っていた方がいいのよう思いますが。

検索条件クリアボタンを配置しておいて、そのクリックで条件入力用コントロールの値を消して、抽出も解除するようにすべきだと思います。