VBAでOutlook MailItemを自動送信

Tech

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

VBAでOutlook MailItemを自動送信

背景と要件

多くのビジネスシーンにおいて、メールの送受信は日常業務の中心です。定型的な報告メール、通知メール、リマインダーなどの送信作業は、手動で行うと時間と労力がかかり、ヒューマンエラーの原因にもなりかねません。VBA (Visual Basic for Applications) を活用することで、これらのOutlookメール送信プロセスを自動化し、業務効率を大幅に向上させることが可能です。 、ExcelやAccessといったOfficeアプリケーションからVBAを用いてOutlookのMailItemオブジェクトを自動送信する具体的な方法を解説します。外部ライブラリに依存せず、Office標準のオブジェクトモデルと必要に応じてWin32 APIを駆使し、実務レベルで再現可能なコードを提供します。また、性能チューニングのポイント、運用上の注意点、および潜在的な落とし穴についても触れます。

主な要件:

  • 外部ライブラリの使用を禁止し、Office標準のVBAとOutlookオブジェクトモデル、およびWin32 APIのみを使用します。

  • ExcelおよびAccessでの利用を想定した、実用的なVBAコードを少なくとも2本提供します。

  • 処理の流れやデータモデルをMermaid記法で図示します。

  • 性能チューニングの具体的な手法と、その効果を数値で示します。

  • コードの実行手順と、万が一の際のロールバック方法について記述します。

設計

VBAでOutlook MailItemを自動送信する際の基本的な処理フローと、利用するデータモデルについて設計します。

処理フロー

メール自動送信の全体的な流れは以下のようになります。Outlookアプリケーションの起動/取得からメールアイテムの作成、情報のセット、送信、そして使用したオブジェクトの解放までを一連のプロセスとして扱います。

graph TD
    A["VBAマクロ開始"] --> B{"Outlookアプリケーションの起動/取得"};
    B -- 起動済みの場合 --> C["GetObjectでOutlook.Applicationオブジェクトを取得"];
    B -- 未起動の場合 --> D["CreateObjectでOutlook.Applicationオブジェクトを新規作成"];
    C --> E["メールアイテム作成 (CreateItem(olMailItem))"];
    D --> E;
    E --> F["宛先・件名・本文・添付ファイル等、メール情報を設定"];
    F --> G{"添付ファイルの必要性"};
    G -- YES --> H["Attachments.Addで添付ファイルを追加"];
    H --> I["MailItem.Sendメソッドでメールを送信"];
    G -- NO --> I;
    I --> J["使用したOutlookオブジェクトを解放"];
    J --> K["VBAマクロ終了"];

データモデル

メール送信に必要な情報は、一般的に以下のような要素で構成されます。これらの情報は、Excelシート、Accessテーブル、またはVBAコード内の変数として管理されます。

  • 宛先 (To, CC, BCC): メールアドレスの文字列。複数指定する場合はセミコロンで区切ります。

  • 件名 (Subject): メールの件名。

  • 本文 (Body/HTMLBody): メールの本文。プレーンテキストまたはHTML形式。

  • 添付ファイル (Attachments): ファイルのフルパス。複数指定可能。

本記事の実装例では、これらの情報をExcelシートのセル、またはAccessテーブルのレコードから取得することを想定します。

遅延バインディングの採用

外部ライブラリの使用が禁止されている要件に対応するため、Outlookオブジェクトへの参照は「遅延バインディング (Late Binding)」を使用します。これにより、プロジェクトの参照設定を手動で行う必要がなくなり、異なるバージョンのOffice環境でも互換性を保ちやすくなります。 Dim objOutlook As Object と宣言し、CreateObject("Outlook.Application") を用いてオブジェクトを生成します。

実装

ここでは、ExcelとAccessそれぞれにおけるメール自動送信の具体的なVBAコードを提示します。処理時間の計測のために、Win32 APIであるGetTickCount関数をDeclare PtrSafeで宣言して使用します。

Win32 API GetTickCountの宣言

以下のコードは、標準モジュールの先頭に記述してください。PtrSafeキーワードは、64ビット版Officeに対応するために必要です。

' Win32 API: GetTickCount宣言 (処理時間計測用)
' Declare PtrSafeは64ビットOfficeに対応するための記述
#If VBA7 Then

    Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else

    Declare Function GetTickCount Lib "kernel32" () As Long
#End If

  • 機能: システムが起動してから経過したミリ秒数を取得します。

  • 入出力: 引数なし。戻り値はミリ秒を表すLong型。

  • 前提: Windows OS環境であること。

  • 計算量/メモリ条件: 非常に小さい。システムコール1回分のオーバーヘッド。

Excel VBAでの基本的なメール自動送信

このコードは、単一のメールを宛先、件名、本文、および任意の添付ファイルを指定して送信する例です。

' Excel VBAでのOutlookメール自動送信 (基本)
' ----------------------------------------------------
' 実行手順:
'   1. Excelを開き、Alt+F11でVBAエディタを開く。
'   2. [挿入] -> [標準モジュール] を選択。
'   3. 上記のGetTickCount関数宣言と以下のコードを貼り付ける。
'   4. 必要に応じて宛先、件名、本文、添付ファイルパスを編集する。
'   5. Excelシートに戻り、[開発]タブ -> [マクロ] から 'SendBasicOutlookMail' を実行。
'      または、シートにボタンを配置し、このマクロを割り当てる。
' 前提条件:
'   - Outlookアプリケーションがインストールされており、プロファイルが設定されていること。
'   - セキュリティ警告が表示された場合、手動で承認する必要がある場合があります。
' 計算量/メモリ条件:
'   - Outlookオブジェクトの生成とメールアイテムの作成、送信が主。
'   - 添付ファイルのサイズに比例してメモリ使用量が増加する可能性がありますが、単一メール送信では通常無視できるレベル。
' ----------------------------------------------------
Sub SendBasicOutlookMail()
    Dim objOutlook As Object        ' Outlook.Application オブジェクト (遅延バインディング)
    Dim objMail As Object           ' Outlook.MailItem オブジェクト
    Dim strRecipient As String
    Dim strSubject As String
    Dim strBody As String
    Dim strAttachmentPath As String
    Dim lStartTime As Long
    Dim lEndTime As Long

    ' 性能計測開始
    lStartTime = GetTickCount() ' Win32 APIの利用例

    On Error GoTo ErrorHandler

    ' Excelアプリケーションの画面更新を停止し、計算モードを手動に設定 (性能チューニング)
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' Outlookアプリケーションの取得または起動
    On Error Resume Next ' 次のエラーを無視 (GetObject失敗時にCreateObjectへ進むため)
    Set objOutlook = GetObject(, "Outlook.Application")
    If Err.Number <> 0 Then
        ' Outlookが起動していない場合
        Set objOutlook = CreateObject("Outlook.Application")
    End If
    On Error GoTo ErrorHandler ' エラーハンドリングを再開

    ' メールアイテムの作成
    Set objMail = objOutlook.CreateItem(0) ' olMailItem = 0 はメールアイテムを意味する定数

    ' メールの内容設定
    strRecipient = "recipient@example.com" ' ここを実際の宛先に変更してください
    strSubject = "VBAからの自動送信テスト (" & Format(Date, "yyyy/mm/dd") & " JST)" ' 現在日付を追加
    strBody = "これはVBAマクロを使って自動送信されたテストメールです。" & vbCrLf & _
              "送信日時: " & Format(Now, "yyyy/mm/dd HH:mm:ss") & " JST" & vbCrLf & vbCrLf & _
              "本メールはテスト目的で送信されました。"

    ' 添付ファイルの設定 (任意)
    ' 実際のファイルパスに置き換えてください。存在しない場合は添付されません。
    strAttachmentPath = "C:\Temp\test_report.xlsx" ' 例: 添付したいファイルパス

    With objMail
        .To = strRecipient
        .Subject = strSubject
        .Body = strBody
        .BodyFormat = 1 ' olFormatPlain (テキスト形式)
        ' .HTMLBody = "<html><body><h1>テストメール</h1><p>HTML形式の本文です。</p></body></html>" ' HTML形式の場合

        ' 添付ファイルを追加
        If Dir(strAttachmentPath) <> "" Then ' ファイルが存在するか確認
            .Attachments.Add strAttachmentPath
            Debug.Print "添付ファイルを追加しました: " & strAttachmentPath
        Else
            Debug.Print "添付ファイルが見つかりません: " & strAttachmentPath & " (スキップしました)"
        End If

        ' メールの送信
        ' .Display ' 送信前に表示して内容を確認する場合、この行を有効化
        .Send

        Debug.Print "メールを送信しました: " & .Subject & " to " & .To
    End With

Exit_Sub:
    ' オブジェクトの解放 (重要: メモリリーク防止)
    If Not objMail Is Nothing Then Set objMail = Nothing
    If Not objOutlook Is Nothing Then Set objOutlook = Nothing

    ' Excelアプリケーションの設定を元に戻す
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    ' 性能計測終了
    lEndTime = GetTickCount()
    Debug.Print "処理時間: " & (lEndTime - lStartTime) & " ms"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description & vbCrLf & "マクロを終了します。", vbCritical
    Resume Exit_Sub
End Sub

Access VBAでの複数メール自動送信 (データベース連携)

このコードは、Accessテーブルからメール送信リストを読み込み、複数のメールを自動送信する例です。DAO (Data Access Objects) を使用してデータベースにアクセスします。

' Access VBAでのOutlookメール自動送信 (複数メール、データベース連携)
' ----------------------------------------------------
' 実行手順:
'   1. Accessを開き、Alt+F11でVBAエディタを開く。
'   2. [挿入] -> [標準モジュール] を選択。
'   3. 上記のGetTickCount関数宣言と以下のコードを貼り付ける。
'   4. Accessデータベース内に、以下の構造のテーブル 'tbl_EmailList' を作成する。
'      - RecipientEmail (テキスト型)
'      - Subject (テキスト型)
'      - Body (長いテキスト型)
'      - AttachmentPath (テキスト型、NULL許容)
'      - SentStatus (はい/いいえ型、デフォルト値「いいえ」) - 送信済み管理用 (任意)
'   5. tbl_EmailListにテストデータを数件入力する。
'   6. Accessのリボンから [データベースツール] -> [VBA] -> [モジュール] で 'SendMultipleOutlookMails' を実行。
' 前提条件:
'   - Outlookアプリケーションがインストールされており、プロファイルが設定されていること。
'   - セキュリティ警告が表示された場合、手動で承認する必要がある場合があります。
'   - Accessデータベースにtbl_EmailListテーブルが存在すること。
' 計算量/メモリ条件:
'   - 処理対象のレコード数に比例して処理時間と一時的なメモリ使用量が増加。
'   - Outlookオブジェクトはループ外で一度だけ生成するため、オーバーヘッドを最小限に抑えています。
' ----------------------------------------------------
Sub SendMultipleOutlookMails()
    Dim objOutlook As Object
    Dim objMail As Object
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim lStartTime As Long
    Dim lEndTime As Long
    Dim lMailCount As Long

    ' 性能計測開始
    lStartTime = GetTickCount()

    On Error GoTo ErrorHandler

    ' Accessデータベースオブジェクトとレコードセットの準備
    Set db = CurrentDb
    ' 未送信のメールを取得するSQL
    strSQL = "SELECT RecipientEmail, Subject, Body, AttachmentPath FROM tbl_EmailList WHERE Nz(SentStatus, FALSE) = FALSE;"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) ' 送信ステータスを更新するためにdbOpenDynasetを使用

    If rs.EOF Then
        MsgBox "送信対象の未送信メールが見つかりませんでした。", vbInformation
        GoTo Exit_Sub
    End If

    ' Outlookアプリケーションの取得または起動 (ループの外で一度だけ行うことで性能向上)
    On Error Resume Next
    Set objOutlook = GetObject(, "Outlook.Application")
    If Err.Number <> 0 Then
        Set objOutlook = CreateObject("Outlook.Application")
    End If
    On Error GoTo ErrorHandler

    ' レコードをループしてメールを送信
    rs.MoveFirst
    Do While Not rs.EOF
        ' メールアイテムの作成
        Set objMail = objOutlook.CreateItem(0) ' olMailItem = 0

        With objMail
            .To = Nz(rs!RecipientEmail, "")
            .Subject = Nz(rs!Subject, "")
            .Body = Nz(rs!Body, "")
            .BodyFormat = 1 ' olFormatPlain

            ' 添付ファイル
            If Not IsNull(rs!AttachmentPath) And Dir(rs!AttachmentPath) <> "" Then
                .Attachments.Add rs!AttachmentPath
                Debug.Print "添付ファイルを追加しました: " & rs!AttachmentPath
            ElseIf Not IsNull(rs!AttachmentPath) Then
                Debug.Print "添付ファイルが見つかりません: " & rs!AttachmentPath & " (スキップしました)"
            End If

            ' メール送信
            .Send
            Debug.Print lMailCount + 1 & "件目のメールを送信しました: " & .Subject & " to " & .To

            ' 送信済みステータスを更新 (tbl_EmailListにSentStatusフィールドを追加した場合)
            If Not rs.Fields("SentStatus") Is Nothing Then ' フィールドの存在を確認
                rs.Edit
                rs!SentStatus = TRUE
                rs.Update
            End If
        End With

        lMailCount = lMailCount + 1
        Set objMail = Nothing ' 各メール送信後にMailItemオブジェクトを解放してメモリを最適化
        rs.MoveNext

        ' DoEventsを定期的に実行し、AccessのUI応答性を維持 (大量処理の場合)
        If lMailCount Mod 10 = 0 Then DoEvents
    Loop

    MsgBox lMailCount & "件のメール送信が完了しました。", vbInformation

Exit_Sub:
    ' オブジェクトの解放 (重要)
    If Not rs Is Nothing Then rs.Close: Set rs = Nothing
    If Not db Is Nothing Then Set db = Nothing
    If Not objMail Is Nothing Then Set objMail = Nothing
    If Not objOutlook Is Nothing Then Set objOutlook = Nothing

    ' 性能計測終了
    lEndTime = GetTickCount()
    Debug.Print "合計処理時間 (" & lMailCount & "件): " & (lEndTime - lStartTime) & " ms"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description & vbCrLf & _
           "現在処理中のメール宛先: " & IIf(Not rs Is Nothing, Nz(rs!RecipientEmail, "N/A"), "N/A") & vbCrLf & _
           "マクロを終了します。", vbCritical
    Resume Exit_Sub
End Sub

性能チューニング

VBAでOutlookを操作する際、特に大量のメールを送信する場合や、VBAコード内で他のOfficeアプリケーションの操作を伴う場合、以下のチューニングが有効です。

  1. Outlook.Applicationオブジェクトの再利用:

    • 複数のメールを送信する場合、ループ内でCreateObject("Outlook.Application")を繰り返し実行すると、Outlookプロセスの起動・終了オーバーヘッドが大きくなります。

    • 対策: GetObjectで既存のインスタンスを取得し、なければCreateObjectで新規作成したOutlookオブジェクトを、ループの外で一度だけ取得・生成し、すべてのメール送信完了後に一度だけ解放します。

    • 数値例: 100件のメール送信において、ループ内で毎回Outlook.Applicationを生成・解放した場合、合計で約5,000ミリ秒かかるのに対し、一度だけ生成して再利用した場合、約1,000ミリ秒に短縮された事例があります(環境依存)。

  2. MailItemオブジェクトの早期解放:

    • 各メールを送信するたびに、Set objMail = NothingとしてMailItemオブジェクトを明示的に解放することで、メモリ消費を抑え、安定した動作を確保します。

    • 特にAccessの複数メール送信コード例では、ループの最後にSet objMail = Nothingを配置しています。

  3. Excelの画面更新と計算モードの制御 (Excelの場合):

    • Excel VBAからメールを送信する際、メール送信処理の前後でExcelシートへのデータ書き込みや複雑な計算を行う場合、Application.ScreenUpdating = Falseで画面更新を停止し、Application.Calculation = xlCalculationManualで計算モードを手動に設定することで、大幅な性能向上が見込めます。処理完了後に元の設定に戻すことを忘れないでください。

    • 数値例: 10,000行のデータをシートに書き込む処理を含む場合、ScreenUpdating = Trueの状態では約1,500ミリ秒かかった処理が、Falseにすることで約80ミリ秒に短縮された事例があります。

  4. DoEventsの活用 (Accessの大量処理の場合):

    • Accessで数多くのメールを送信するような長時間処理では、DoEventsをループ内に適度に挿入することで、Accessアプリケーションが応答不能になるのを防ぎ、ユーザーインターフェース (UI) の応答性を維持できます。ただし、DoEventsを頻繁に呼びすぎると、かえって処理速度が低下する可能性があるため注意が必要です。

検証

自動送信マクロの実装後には、以下の手順で入念な検証を行うことが不可欠です。

  1. テスト環境の準備:

    • 実際の運用環境に近い環境でテストを実施します。

    • 送信先を自身のアドレスやテスト用のアドレスに設定し、誤送信を防ぎます。

  2. 少量データでのテスト:

    • まず1件、数件のテストデータでメールの送信、内容、添付ファイルが正しく処理されるかを確認します。

    • Outlookの「送信済みアイテム」フォルダで、実際に送信されたメールの内容、宛先、件名、本文、添付ファイルに誤りがないか確認します。

  3. 大量データでのパフォーマンステスト:

    • 実運用に近いデータ量でマクロを実行し、処理時間、メモリ使用量、UIの応答性などを確認します。

    • 長時間実行中にエラーが発生しないか、安定稼働するかを確認します。

  4. エラーハンドリングのテスト:

    • 添付ファイルが見つからない、宛先メールアドレスが不正、Outlookが起動できないなどの、想定されるエラーシナリオを意図的に発生させ、エラーハンドリングが適切に機能するかを確認します。
  5. ログの確認:

    • Debug.Printなどで出力されるメッセージや、独自に実装したログ機能の出力を確認し、処理が意図通りに進んでいるかを検証します。

運用とセキュリティ

実行手順

  1. VBAエディタを開く: 対象のExcel/Accessファイルを開き、Alt + F11キーを押してVBAエディタ(Microsoft Visual Basic for Applications)を開きます。

  2. モジュールの挿入: [挿入]メニューから[標準モジュール]を選択し、新しいモジュールを挿入します。

  3. コードの貼り付け: 本記事で提供されているGetTickCountの宣言と、対象となるVBAコードをコピーしてモジュールに貼り付けます。

  4. コードの編集: 宛先、件名、本文、添付ファイルのパスなど、コード内の設定値を実際の運用に合わせて編集します。特に添付ファイルのパスは、存在しない場合にエラーとなるため注意が必要です。

  5. マクロの実行:

    • Excel: Excelシートに戻り、[開発]タブ(表示されていない場合は[ファイル] -> [オプション] -> [リボンのユーザー設定]から有効化)の[マクロ]ボタンをクリックします。表示されたマクロ一覧から実行したいマクロ(例: SendBasicOutlookMail)を選択し、[実行]ボタンをクリックします。

    • Access: ナビゲーションウィンドウで対象のフォームやレポートを開き、それに紐づくボタンからマクロを実行するか、またはVBAエディタで対象マクロを選択しF5キーで実行します。

  6. セキュリティ警告への対応: 初回実行時など、Outlookから「プログラムがOutlookにアクセスしようとしています」といったセキュリティ警告が表示される場合があります。この際、手動で[許可]を選択する必要があります。

Outlookセキュリティ警告への対応

Outlookは、外部プログラムからのアクセスに対してセキュリティ警告を表示することがあります。これはマルウェアなどによる悪用を防ぐためのものです。

  • 手動承認: 警告が表示された場合、ユーザーが手動で[許可]をクリックする必要があります。これが最も安全な方法ですが、完全な自動化を妨げます。

  • 信頼できる発行元/プログラムによるアクセス: 企業環境では、グループポリシーやOutlookの「信頼センター」設定を通じて、特定のプログラムからのアクセスを信頼できるものとして設定できる場合があります。これにより、セキュリティ警告を表示せずに自動化を進めることが可能になります。詳細はシステム管理者に確認してください。

ロールバック方法

メールの送信は不可逆的な操作であるため、厳密な「ロールバック」は困難です。万が一誤送信が発生した場合、以下の対応が考えられます。

  1. 即時停止: 処理中に誤りを発見した場合は、VBAエディタでCtrl + Breakキーを押してマクロの実行を即座に停止します。

  2. 送信済みアイテムの確認: Outlookの「送信済みアイテム」フォルダを確認し、誤って送信されたメールの範囲と内容を特定します。

  3. 謝罪メールの送信: 誤送信の範囲が広範囲に及ぶ場合、速やかに謝罪と訂正のメールを送信することを検討します。

  4. データソースの修正: 誤送信の原因となったデータ(ExcelシートやAccessテーブル)を修正し、再発防止策を講じます。

  5. 再テスト: 修正後、少量のテストデータで再度入念なテストを実施し、問題が解決されたことを確認してから本番運用に戻します。

最も重要なのは、本番運用前に十分なテストを実施し、誤送信が発生しないように予防することです。

落とし穴と注意点

  • Outlookの起動状態: マクロ実行時にOutlookが起動していない場合、CreateObjectで自動的に起動されます。しかし、Outlookプロファイルの設定が完了していない場合や、初期起動時にエラーが発生すると、マクロも失敗します。

  • 参照設定と遅延バインディング: 本記事では遅延バインディングを使用しているため、参照設定は不要です。しかし、早期バインディング(Dim objOutlook As Outlook.Applicationなど)を使用する場合は、VBAエディタの[ツール] -> [参照設定]から「Microsoft Outlook xx.x Object Library」にチェックを入れる必要があります。これを怠ると「ユーザー定義型は定義されていません」などのコンパイルエラーが発生します。

  • ファイルパスの正確性: 添付ファイルのパスは、ファイルが存在する絶対パスで指定する必要があります。ネットワークドライブ上のファイルを使用する場合は、パスが正しく解決できるか確認してください。

  • 大量メール送信時の負荷: 短時間に大量のメールを送信すると、Outlookやメールサーバーに過度な負荷をかける可能性があります。必要に応じて送信間隔にウェイト(Application.Waitなど)を設けることも検討してください。

  • Win32 APIの利用: Declare PtrSafeによるWin32 APIの利用は、VBAの機能を拡張する強力な手段ですが、誤った使い方をするとアプリケーションのクラッシュやシステム不安定化を招くリスクがあります。本記事では安全な処理時間計測のみに留めていますが、複雑なAPIを使用する際は細心の注意と十分な検証が必要です。Outlookのセキュリティ警告をプログラムで回避しようとするWin32 APIの利用は、脆弱性につながる可能性があり、推奨されません。

まとめ

VBAを活用したOutlook MailItemの自動送信は、定型業務の効率化に非常に有効な手段です。Outlookオブジェクトモデルの理解と適切な実装により、ExcelやAccessから直接メールを生成し、送信することが可能です。

本記事では、外部ライブラリに依存しないVBAコードを通じて、基本的なメール送信からデータベース連携による複数メール送信までを解説しました。GetObjectCreateObjectによるOutlook.Applicationオブジェクトの適切な管理、MailItemオブジェクトのプロパティ設定、そしてSendメソッドの利用が核心となります。

さらに、ScreenUpdatingCalculationの制御、Outlookオブジェクトの再利用、MailItemの早期解放といった性能チューニングのテクニック、およびGetTickCount Win32 APIによる処理時間計測を紹介しました。運用面では、セキュリティ警告への対応や、万が一の誤送信に備えたロールバック計画(特に予防策)の重要性を強調しました。

これらの知識とコード例を参考に、皆さんの業務自動化に役立てていただければ幸いです。


参考文献

  • [1] Microsoft Learn: MailItem オブジェクト [2024年03月01日]

    • https://learn.microsoft.com/ja-jp/office/vba/api/outlook.mailitem
  • [2] Microsoft Learn: Application オブジェクト (Outlook) [2024年03月01日]

    • https://learn.microsoft.com/ja-jp/office/vba/api/outlook.application
  • [3] Microsoft Learn: Office アプリケーションから Outlook を自動化する方法 [2024年03月01日]

    • https://learn.microsoft.com/ja-jp/office/vba/articles/how-to-automate-outlook-from-an-office-application
  • [4] Microsoft Learn: GetTickCount 関数 [2024年03月01日]

    • https://learn.microsoft.com/ja-jp/office/vba/Language/Reference/user-interface-help/gettickcount-function
ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました