
法律事務所では、かかってきた電話の内容などを弁護士に間違いなく伝えることが大事ですよね。
そこで、エクセルのマクロを使った「電話メモ」を紹介します。

エクセルで作った電話メモだったら、今でも使っていますよ。

マクロを使えば、エクセルからメールを自動送信することもできるようになりますよ。

そんなことができるんですか?
ぜひ、教えて下さい。
サンプルのダウンロード
インストール方法
操作マニュアル
仕様
1. プロジェクト概要
本プロジェクトは、Excel上で動作する「電話メモ」アプリケーションのVBAマクロです。
ユーザーがシート上でダブルクリック操作を行うことで、自動採番、入力者の自動取得、日時の自動入力、動的なドロップダウンリストの生成、Outlook連携によるメール送信、および日次自動バックアップを行います。
2. 前提となるExcelオブジェクトの構成
コードを正確に生成・動作させるため、以下のシートとテーブル(構造化参照)が存在することを前提とします。
2.1. ワークシート構成
- sht11 (コードネーム) / シート名「電話メモ」: メインのデータ入力シート。
- shtOpt (コードネーム) / シート名「オプション」: 各種マスタや設定値を保持するシート。
- shtMan (コードネーム) / シート名管理用など: 現在はVBAコードを持たないがモジュールは存在する。
2.2. テーブル・名前付き範囲構成
- 「電話メモ」シート内:
- テーブル名:
電話メモ - 主要列名:
番号,日時,相手先,電話番号,宛先,用件,対応,内容,入力者,メール送信日時,確認者,処理
- テーブル名:
- 「オプション」シート内:
- テーブル名:
所員別設定(列:ユーザー名(Windows),所員名,メールアドレス) - 名前付き範囲(または1列のテーブル):
用件,対応,処理 - 名前付きセル:
バックアップフォルダ(バックアップの保存先パスを保持)
- テーブル名:
3. モジュール別 実装要件
3.1. クラスモジュール: Evnt
- 概要: マクロ実行中のイベント発生、画面描画、自動計算の抑止および再開を制御する。
- メソッド:
Sub Disable(): 処理速度向上のため、ScreenUpdating = False,Cursor = xlWait,EnableEvents = False,Calculation = xlCalculationManualを設定する。Sub Enable(): 上記の設定を全て標準(True, xlNormal, xlCalculationAutomatic)に戻す。
3.2. 標準モジュール: Setup
- 概要: アプリケーションの初期設定・外部連携時処理、およびバックアップ処理を行う。
- モジュールレベル変数:
Public Evnt As New Evnt(イベント制御用クラスのインスタンス) - プロシージャ:
Public Sub VABridge_AfterLoad(Optional ByVal dummy As Byte = 0)- エラーハンドリング(
On Error GoTo)を実装。 Evnt.Disableでイベントを停止。sht11.SortTable(※ダミー引数付きで呼び出し想定) およびsht11.FormatTableを実行。PerformDailyBackupを実行後、Evnt.Enableでイベントを再開。
- エラーハンドリング(
Sub PerformDailyBackup(Optional ByVal dummy As Byte = 0)- 「電話メモ」テーブルの行数が0の場合は終了。
shtOpt.Range("バックアップフォルダ")の値を読み取る(読み取り時のエラーはOn Error Resume Nextで回避)。空白、またはフォルダが存在しない場合は終了。- ファイル名は
yyyymmdd_ベース名.xlsx(ベース名は現在のブック名から “V” 以降を除いたもの)。 - 同日のバックアップがなければ、
ThisWorkbook.Sheets.Copyで新規ブックを作成し、マクロなし(xlOpenXMLWorkbook)で保存して閉じる。警告ダイアログ(DisplayAlerts)は一時的に非表示にする。
3.3. 標準モジュール: Mail
- 概要: Outlookを利用して、指定行の電話メモ内容をメールで送信する。
- プロシージャ:
Sub SendMail(r)(引数rはテーブル行番号)- Outlookオブジェクトは実行時バインディング(
CreateObject("Outlook.Application"))を使用する。 shtOptの「所員別設定」テーブルから、対象行の「宛先」に該当する「メールアドレス」をWorksheetFunction.XLookupで取得。アドレス未設定時はメッセージを出して終了。- 送信確認のMsgBoxを表示し、キャンセルなら終了。
- 対象行のデータを連結してメール本文を作成(日時は
Format関数で日付と時間に分ける)。 - メールを送信後、対象行の「メール送信日時」列に現在時刻(
Now)を記録。 - オブジェクト(
Outlook.Application,MailItem)を明示的にNothingで解放する。
- Outlookオブジェクトは実行時バインディング(
3.4. ドキュメントモジュール: ThisWorkbook
- 概要: ワークブックのイベント制御。
- プロシージャ:
Private Sub Workbook_Open()sht11(電話メモシート)をアクティブにする。Setup.Evnt.Disableを呼び出し。Setup.PerformDailyBackupを実行。Setup.Evnt.Enableを呼び出し。
3.5. ドキュメントモジュール: sht11 (電話メモシート)
- 概要: シート上のイベント検知、およびテーブルの書式・ドロップダウンリストの動的制御。
- プロシージャ:
Private Sub Worksheet_Activate()- 「電話メモ」テーブル(
Range("電話メモ"))のInterior.Pattern等を初期化し、塗りつぶしを解除。
- 「電話メモ」テーブル(
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)- Targetがテーブルの入力可能範囲(見出しの下〜最終行+1)か判定し、範囲外なら
Exit Sub。 Cancel = Trueで通常のセル編集モードをキャンセル。Evnt.Disableでイベント停止。- テーブル全体の入力規則(
Validation)と塗りつぶしをクリア。 - ダブルクリックされた列のヘッダー名(
Range("電話メモ")(0, s).Value)に応じて分岐(Select Case):- “番号”の場合: 新規行なら最大値+1を採番、
InputUserName(r)呼出、日時にNowを入力、FormatTable呼出、「相手先」セルを選択し、その行へスクロール。 - “日時”の場合: 現在日時(
Now)を再入力。 - “メール送信日時”の場合:
Mail.SendMail(r)を呼び出し。
- “番号”の場合: 新規行なら最大値+1を採番、
- 分岐終了後、対象行に対して
FormatRow(r)を呼び出し、入力規則を再設定。 Evnt.Enableでイベント再開(エラー時もスキップラベルを通って必ず再開すること)。
- Targetがテーブルの入力可能範囲(見出しの下〜最終行+1)か判定し、範囲外なら
Private Sub FormatTable()- ステータスバーに処理中メッセージを表示。
- 「電話メモ」テーブルを「番号」列で昇順ソート(
xlPinYin,xlSortNormal)。 - シート全体のセルに対して折り返し表示(
WrapText = True)と高さ自動調整(Rows.AutoFit)を実行。 - 「日時」「メール送信日時」列の表示形式を
yyyy/m/d h:mmに設定。 - ステータスバーをクリア。
Private Sub FormatRow(r)shtOptの各種マスタ範囲を取得。- 対象行の「入力者」「宛先」「確認者」(所員別設定[所員名])、「用件」、「対応」、「処理」の6セルに対して、動的にドロップダウンリスト(入力規則の
xlValidateList)を設定。 - 要素が複数の場合は
Join(WorksheetFunction.Transpose(範囲), ",")を使用してカンマ区切りの文字列を生成して設定すること。
Private Sub InputUserName(r)WScript.Networkのオブジェクトを作成し、UserName(Windowsログイン名)を取得。shtOptの「所員別設定」テーブルを参照し、XLookupで該当する所員名を取得して対象行の「入力者」列に入力する。エラー時はスキップ。
3.6. ドキュメントモジュール: shtOpt, shtMan
- コードは記述しない(
Option Explicitのみ)。
4. コーディングガイドライン(厳守事項)
- モジュールヘッダー: 各モジュールの先頭に
'更新日時: YYYY/MM/DD HH:MMおよび'概要: ...を記載すること。 - プロシージャ概要: すべてのSub/Functionの直前に、概要・引数・戻り値を説明するヘッダーコメントを付与すること。
- 変更履歴:
ThisWorkbookの先頭に、指定されたフォーマットで詳細な変更履歴を残すこと。 - 文字列リテラルの保護: シート名、テーブル名、列名(
電話メモ[番号]など)の文字列は一切変更しないこと。 - エスケープ処理: JSON出力の要件に従い、ダブルクォーテーションや改行コードはJSONフォーマットとして厳格にエスケープすること。

コメント
ファイルの共有の方法を「各人別ファイル」から「一時データ(CSV)ファイル」に変更したため、ファイルの共有に関する記述を削除しました。
ファイルの共有に関しては、こちらをご覧ください。
「共同編集を使わずにファイルを共有」で紹介しているデータの外部保存機能を追加しました。(Ver304)
外部データベース関連プログラムを更新しました。(Ver383)
データベースのキーが2つ以上の場合に最初のキーが重複するデータが表示されないバグを修正しました。(Ver384)
以下の機能を追加しました。(Ver3A0)
・オプションに「アーカイブファイルの保存」機能を追加
・レコードファイルを削除する前にテーブルファイルにデータがあることを確認するように変更
・データ入力時にレコードファイルに書き込んだ後、レコードファイルを読み込むように変更
・モード変更時にテーブルのスタイルを変更
・入力モードでフィルタを使用可能に変更
・起動時にデータベースへの書き込みを自動実行する機能を追加