2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

« ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その2) | トップページ | ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その4) »

2011年10月30日 (日)

◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その3)

メール誤送信防止チェックの最終回です。今回は標準モジュールとフォームです。

(1)Outlookを起動したら、
(2)Alt+F11を押下してMicrosoft Basic Editorを表示します。
(3)どこでも良いですがProject1(VbaProject.OTM)上で右クリックし、メニュー「挿入」→「標準モジュール」を選択し、以下の標準モジュールの内容をコピペします。
(4)(3)と同様に右クリックし、メニュー「挿入」→「ユーザフォーム」を選択。追加されたフォームを下記の画像の通りに作成します。右クリックし、「コードの表示」を選択し、以下のユーザフォームの内容をコピペします。

'------------------------------
' 標準モジュール
'------------------------------
Public gTitle As String
Public gAddress
Public gTempFile
Public SendFlg As Boolean

Sub m_SendCheck(Optional ByVal dummy As String)
    U1.Show
End Sub

User_form

'------------------------------
' ユーザフォーム
'------------------------------
Private Sub CommandButton1_Click()
    SendFlg = False
    Unload U1
End Sub

Private Sub CommandButton2_Click()
    SendFlg = True
    Unload U1
End Sub

Private Sub UserForm_Initialize()
    '件名
    If gTitle <> "" Then
        U1.TextBox1.Text = gTitle
    Else
        U1.TextBox1.Text = "**** 件名なし ****"
    End If
   
    '宛先
    U1.Label3.Caption = U1.Label3.Caption & " 件数:" & gAddress.Count
    Dim lcnt As Integer
    lcnt = 0
    For Each oAddress In gAddress
        lcnt = lcnt + 1
        U1.ListBox1.AddItem Format(lcnt, "00") & "." & oAddress.Name & " 【" & oAddress.Address & "】"
    Next
   
    '添付ファイル
    U1.Label4.Caption = U1.Label4.Caption & " 件数:" & gTempFile.Count
    lcnt = 0
    If gTempFile.Count > 0 Then
        For Each oTempFile In gTempFile
            lcnt = lcnt + 1
            U1.ListBox2.AddItem Format(lcnt, "00") & "." & oTempFile.FileName
        Next
    Else
        U1.ListBox2.AddItem "**** 添付ファイルなし ****"
       
    End If
   
    Set oAddress = Nothing
    Set oTempFile = Nothing
   
End Sub

それでは解説です。
まず標準モジュールのPublic変数は前回解説したThisOutlookSessionモジュール内で設定した内容を
ユーザフォームに渡すものです。またSendFlgは送信か否かを受け取るフラグ変数です。
処理の内容は単にユーザフォームを表示(show)するだけです。
なぜThisOutlookSessionでやらないのかというと、このPublic変数がThisOutlookSession内で定義出来無かった
ので、変数定義だけではつまらないのでm_SendCheckを書いたという理由です。

次に、ユーザフォームです。
まずフォームの作成について何点か補足します。
件名を表示するTextBoxのBorderStyleプロパティでは1を定義しています。
そして、EnabledプロパティにはFalseを定義しています。この設定は処理とは関係有りません、私の趣味です。
■宛先と■添付ファイルのLabelですが、ロジックで件数情報を付加していますので横長に定義しましょう。
キャンセルボタンのCancelプロパティ、Defaultプロパティは共にTrueを設定しています。
今回の誤送信防止チェックのコンセプトはEnterキーで間違って送信しないように、意識的にデフォルトボタンは「いいえ」か「キャンセル」にしています。
次にロジックですが、UserForm_Initializeでフォームを初期表示した際の処理と、送信ボタン、キャンセルボタンが押下された時の処理があるだけです。
宛先のメールアドレスはアドレスと表示名を両方表示できるようにしています。
件名と添付ファイルが存在しない場合は、文言で無いことが一目で分かるようにしています。
あとは大したことはしていませんので解説は不要でしょう。

以上でプログラムの説明が終わりました。
この機能を利用すればある程度チェックが働きますので誤送信防止に寄与するでしょう。私自身も重宝しています。よかったら利用してみてください。
<関連記事>
その1
その2

最後に、以下のサイトを参考にさせて頂きました。ありがとうございました。
http://d.hatena.ne.jp/fyts/20070813/outlook

« ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その2) | トップページ | ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その4) »

パソコン・インターネット」カテゴリの記事

コメント

平陽凛さん、お久しぶりです。
なるほど、非常に勉強になります。私も以前同様のコードを作ろうとして、変数のユーザーフォームへの引き渡しがうまくできずに諦めた経緯がありますが、標準モジュールの宣言セレクションにパブリック変数で宣言すればよいのですね。
ポイントとして、gAddressとgTempFileをバリアント型で宣言してるところもあるのかなと思いました。
objectと宣言するとうまくいかなかった記憶があります。
ところで私が最近考えているのがエクセルからIEを操り、毎月行うHTMLフォームへの手入力を自動化できないだろうか、というものです。
まだ何も手を付けていない状態ですが、コードを作るにあたってアドバイス・注意点などがあればぜひお願いします。

nobuoさん、こんばんは

最近会社はメールの誤送信に神経をとがらせていて、なにか問題が発生するとその原因はなんだ?再発防止策は?となります。送信ボタンをクリックして即座に送信されてしまうと本当に怖くなってしまいます。

さて、VBAからのIE操作ですが、私も自動ログインツールを作成していますので参考にしてみてください。
ポイントは操作したいサイトの入力フィールドなどの要素を一意に特定するための名称を知ることです。
以下のサイトもわかりやすいです。参考にしてみてください。
http://www.ken3.org/cgi-bin/group/vba_ie.asp

>ポイントは操作したいサイトの入力フィールドなどの要素を一意に特定するための名称を知ることです。

やはりそれですね!そこが分からなきゃ話にならないですよね。ちょっと本気で勉強してみます。早速のお返事ありがとうございました!!

こちら参考にさせていただきましたが、初心者でよくわかりません。。

すべて、コピペした後にマクロの実行すると
実行エラー424 オブジェクトが必要ですというダイアログだ出てきます。

デバックをおすと標準モジュールでコピペした部分の

U1.Showという部分がどうやら間違っているようです。

こちら解決方法はございますでしょうか。

何卒よろしくお願いいたします

blueさん

こんにちは、平陽凛です。
ご質問の内容から想像すると、追加した
ユーザフォームの名前がU1になっていない
からだと思います。
記事にはそこまで記載していませんでしたね。

Microsoft Visual Basicメニュー「表示」→「プロパティウィンドウ」でプロパティウィンドウを表示し、
(オブジェクト名)のところをU1と入力してEnterキーで確定します。
この状態で実行してみてください。

こんにちは。
とても参考になりました。
私のOUTLOOKにも実装させていただきました。
ただ、少し困ったことになっていて、OUTLOOKを再起動したらこのチェックが動かなくなってしまいました。
ググってみたところ、デジタル署名を入れないとだめと書かれているところがあったので、入れてみたのですがやはり動きません。
原因に心当たりがあるようでしたらご教示ください。
OUTLOOKは2010を使っています。

けーさん
こんばんは。
お問い合わせの件ですが、当方でも確かに2010で動作しませんね。もともと2000くらいに作成したマクロなので、気が付きませんでした。
いろいろセキュリティの設定などいじってみても変わりませんね。もう少し試してみます。

outlook2010でも問題なく動きますよ。(確認済み)
セキュリティーセンターの、マクロの設定が必要。
http://office.microsoft.com/ja-jp/excel-help/HA010354316.aspx#_Toc311698312
ついでに、outlook2010の再起動も必要。

ちなみに私は、
「署名後にマクロ変えた・・・」という意味の
エラーが出て、強制的にマクロ無効化される
状態になったので、以下の操作で回避しました。

ユーザフォームとか、モジュールとかを
エクスポートした後(特にユーザフォームは重要)に、
VbaProject.OTMを削除してしまうと、
再作成される(マクロが全部初期化される)ので、
その後ユーザフォーム等をインポートして、
マクロ部分を復活させ、
上書き保存後にoutlook2010を再起動したら、
マクロ有効化を再度聞いて来ました。

こんばんは。
情報提供ありがとうございます。
2010でも動くことが分かり、良かったです。
自分自身、まだ確認していませんが、
デジタル署名を作成することがポイントの
ようですね。

失礼します。
outlook2010を使用してます。
宛先がグループでリスト化されると、

【" & oAddress.Address & "】
↑この部分が文字化けしてしまいます。
oAddressを宣言valiant型で宣言する必要があるのでしょうか?
それとも、その前の部分でアドレスがリスト化されているから調べてから一つ一つループで表示させる必要があるのでしょうか?

いきなりの質問ですみません。
10月からoutlookを使用し始めて宛先確認のマクロ調べてこちらに行き着きました。
文字化けで、行き詰まってしまい、
何かご教示頂きたいです。宜しくお願いします。


   

コメントを書く

(ウェブ上には掲載しません)

« ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その2) | トップページ | ◆Outlook VBA(メール誤送信防止のためのチェックあれこれ その4) »