【VBA】ユーザー目線で開発する5
ユーザーフォームとAccessDBでツール作成
一日に2ℓくらい水を飲むjimです。どうも✋
今回は、、というか、今回もかな?
【VBA】ユーザー目線で開発する4の続きです。
『ユーザーが使いやすいように、ユーザーフォームで開発。そして、参照先は全てAccessにしてみよう。』ってことだったんだけど、長くなったね😆
この5回で最後にするつもりですが、実は山ほど書きたいことはある。。。
はい、というわけで⇒
ユーザーフォーム追加
同一ファイルにユーザーフォームを追加します。
新しくユーザーフォームを挿入して、下図のようにコマンドボタンを配置します。

オブジェクト名はそのままです。
Userform2にCommandButton1とCommandButton2が並んでいるだけです。
登録フォーム
CommandButton2から実装します。
以下の内容をUserform2に記述します。
Private Sub CommandButton2_Click()
UserForm1.Show
End Sub
単純に登録用のフォームを表示させるだけです。
メール作成機能
CommandButton1の機能を実装します。
最初に参照設定を行います。
Outlookのライブラリにチェックを入れます。
↓のライブラリは古いです。(MicrosoftOutlook○○ObjectLibraryにチェック)

次に、メールの本文に使うデータを問い合わせる関数を作成します。
Userform1の初期化とほぼ一緒です。
Private Sub CommandButton1_Click()
Dim mailStr(3) As String
Call GetUser(mailStr(0), mailStr(1), mailStr(2), mailStr(3))
End Sub
Private Sub GetUser(ByRef mailStr0, mailStr1, mailStr2, mailStr3 As String)
Const dbname = "\\共有サーバー\適当.accdb"
Dim adoCn, adoRs As Object
Dim sqlStr As Object
Dim WshNetworkObject As Object
Dim userName As String
Set WshNetworkObject = CreateObject("WScript.Network")
userName = WshNetworkObject.userName
Set adoCn = CreateObject("ADODB.Connection")
Set adoRs = CreateObject("ADODB.Recordset")
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbname & ";"
sqlStr = "SELECT * FROM 個人設定 WHERE ユーザー名 ='" & userName & "' ;"
adoCn.Open sqlStr, adoCn
If adoRs.EOF = True Then
If IsNull(adoRs!名字) = False Then mailStr0 = adoRs!名字
If IsNull(adoRs!名前) = False Then mailStr1 = adoRs!名前
If IsNull(adoRs!保存先) = False Then mailStr2 = adoRs!保存先
If IsNull(adoRs!メールアドレス) = False Then mailStr3 = adoRs!メールアドレス
End If
adoRs.Close
adoCn.Close
End Sub
これで名字からメールアドレスまで取得できたので、この情報をもとにOutlookのメールを作成します。
Option Explicit
Private Sub CommandButton1_Click()
Dim mailStr(3) As String
Dim outlookObject As Outlook.Application
Dim mailObject As Outlook.MailItem
Dim bodyStr As String
Call GetUser(mailStr(0), mailStr(1), mailStr(2), mailStr(3))
Set outlookObject = New Outlook.Application
Set mailObject = outlookObject.CreateItem(olMailItem)
bodyStr = "○○様" & vbCrLf
bodyStr = bodyStr & "いつもお世話になっております。"
bodyStr = bodyStr & mailStr(0) & mailStr(1) & "です。" & vbCrLf
bodyStr = bodyStr & "保存先:" & mailStr(2) & vbCrLf
bodyStr = bodyStr & "-------------------------"
bodyStr = bodyStr & mailStr(0) & mailStr(1) & vbCrLf
bodyStr = bodyStr & mailStr(3)
With mailObject
.To = "gake.com"
.CC = "gake.com"
.Subject = "【格納連絡】"
.Body = bodyStr
.BodyFormat = olFormatHTML
.Display
End With
End Sub
Private Sub GetUser(ByRef mailStr0, mailStr1, mailStr2, mailStr3 As String)
Const dbname = "\\共有サーバー\適当.accdb"
Dim adoCn, adoRs As Object
Dim sqlStr As Object
Dim WshNetworkObject As Object
Dim userName As String
Set WshNetworkObject = CreateObject("WScript.Network")
userName = WshNetworkObject.userName
Set adoCn = CreateObject("ADODB.Connection")
Set adoRs = CreateObject("ADODB.Recordset")
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbname & ";"
sqlStr = "SELECT * FROM 個人設定 WHERE ユーザー名 ='" & userName & "' ;"
adoCn.Open sqlStr, adoCn
If adoRs.EOF = True Then
If IsNull(adoRs!名字) = False Then mailStr0 = adoRs!名字
If IsNull(adoRs!名前) = False Then mailStr1 = adoRs!名前
If IsNull(adoRs!保存先) = False Then mailStr2 = adoRs!保存先
If IsNull(adoRs!メールアドレス) = False Then mailStr3 = adoRs!メールアドレス
End If
adoRs.Close
adoCn.Close
End Sub
Private Sub CommandButton2_Click()
UserForm1.Show
End Sub
これで実装完了です。
メール作成ボタンを押せば、以下のようなメールが作成されるはずです。
(ちなみ、全然テストしてません。エラー出るかも。。。)

まとめ
はい、いかがでしたか?
参照先をAccessにすることで、マクロファイルを編集することがなくなりますし読専にすることも可能です。それによって、複数のユーザーが同時に使用可能になります。開くときに邪魔なメッセージも出なくなるので、ユーザーのストレスも減るでしょう。
今回は登録とメール作成の2つ機能をユーザーフォーム実装しましたが、自分は複数の業務を1つのユーザーフォームにモリモリ盛ったりします。
例えば、今回のような登録フォームやカレンダーフォーム。それからラベルを並べてスプレッドシート風にしたり。。。
うん、色々。
ものによってはオブジェクトの数が多すぎて苛々します。
それでも、発想次第では凄く便利なものができるので、皆さんも挑戦してみては?
あっ、そういえば、今回のやつパワポで作ってたんだけど、パワポはアプリケーションを非表示にできないの忘れてた😓
そうそう、だからWordで作るようにしてたんだった。。。
テヘペロ
Wordなら、ThisDocumentモジュールに以下のコードを記述し、
Private Sub Document_Open()
Application.Visible = False
UserForm2.Show
End Sub
Userform2に以下のコードを記述する。そうすると、ツール使用時はユーザーフォームだけが表示されるようになります。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.Visible = True
Application.Quit
End Sub
Application.Quitは、Wordだったら開いている全てのWordを・Excelなら開いている全てのExcelを終了してしまうので注意が必要です。
それじゃまたね✋



ディスカッション
コメント一覧
まだ、コメントがありません