テキスト形式のメールを指定文字数で折り返すマクロ

コメントにて以下のようなご要望をいただきました。


Outlook2010を使用しています。
ほぼ1年前の124のコメントで「ある」さんが書かれていますが、私も送信してみないと折り返しの状況がわからないのは大変不便に感じています。
「ある」さんのご要望は送信前のプレビューでしたが、いっそのことVBAで強制的に改行させることはできませんでしょうか?
使い方としては、
1.普通にメールを作成
2.整形したい部分を範囲選択
3.マクロ実行で、その部分を整形(折り返し桁数で改行)
4.必要に応じて修正
5.メールを送信
のような感じです。
高機能な整形は不要で、単純に強制改行させるだけで良いのですが、マクロのご検討をお願いできませんでしょうか?


こちら、選択した範囲ではなくメール本文全体を折り返すということであれば、以下のようなマクロで可能です。一応、半角英数字で構成される単語は途中で改行しないようなロジックを入れたため、ちょっと複雑になっています。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub WrapLines()
    Const LINE_MAX = 70 ' 折り返しの文字数を指定します
    Dim strBody As String
    Dim strNewBody As String
    Dim strLine As String
    Dim c As String
    Dim pCur As Long
    Dim pWB As Long
    Dim iLen As Long
    Dim bWrap As Boolean
    '
    strBody = ActiveInspector.CurrentItem.Body
    strBody = Replace(strBody, vbCrLf, vbLf)
    pCur = 1
    pWB = 0
    strNewBody = ""
    strLine = ""
    iLen = 0
    pc = ""
    bWrap = False
    While pCur <= Len(strBody)
        c = Mid(strBody, pCur, 1)
        If c = vbLf Then
            If Not bWrap Then
                strNewBody = strNewBody & strLine & vbLf
            End If
            strLine = ""
            iLen = 0
            pWB = 0
            bWrap = False
        ElseIf Asc(c) < 0 Or &H7F < Asc(c) Then
            iLen = iLen + 2
            If iLen + 1 >= LINE_MAX Then
                strNewBody = strNewBody & strLine & c & vbLf
                strLine = ""
                iLen = 0
                bWrap = True
            Else
                strLine = strLine & c
                bWrap = False
            End If
            pWB = Len(strLine)
        Else
            If c = " " Then
                pWB = Len(strLine) + 1
                bWrap = False
            End If
            iLen = iLen + 1
            If iLen >= LINE_MAX Then
                If pWB > 0 Then
                    strNewBody = strNewBody & Left(strLine, pWB) & vbLf
                    strLine = Mid(strLine, pWB + 1) & c
                    If c = " " Then
                        If Mid(strBody, pCur - 1, 1) = vbLf And Mid(strBody, pCur + 1, 1) = " " Then
                            strLine = ""
                        End If
                    End If
                    bWrap = False
                Else
                    strNewBody = strNewBody & strLine & c & vbLf
                    strLine = ""
                    bWrap = True
                End If
                iLen = LenB(StrConv(strLine, vbFromUnicode))
            Else
                strLine = strLine & c
                bWrap = False
            End If
        End If
        pCur = pCur + 1
    Wend
    If strLine = "" Then
        strNewBody = strNewBody & strLine
    End If
    ActiveInspector.CurrentItem.Body = strNewBody
End Sub

マクロの登録方法やメニューへの追加について

複数の PST を一括でプロファイルに追加するマクロ

コメントにて以下のようなご要望をいただきました。


はじめまして。英語のサイトも探してみたのですが、なかなかうまくできないので、お知恵を拝借させて頂きたくご連絡致しました。

Outlook2010ですが、ネットワークドライブ上に置かれた20個程のPSTファイルを全てOpenするマクロまたはVBAを組みたい、というものですが、可能でしょうか?

LANの不具合でネットワークドライブが外れた際に、OpenしていたPSTファイルが全て外れてしまい、毎回手動でOpenしなければならず、、
何卒、何卒宜しくお願い申し上げます。


はじめに、ネットワーク ドライブにおいた PST を使うというのはサポート対象外の使用方法となります。
詳細は下記の技術文書に記載されています。

297019 LAN リンクまたは WAN リンク上での個人用フォルダー (.pst) ファイルの使用の制限

一時的にネットワーク上の PST を開くこともあるため、PST を接続する際にはネットワーク上の PST も参照可能ですが、恒久的に使用した場合以下のような現象が発生します。

  • パフォーマンスが低下する。
  • ネットワーク トラフィックが増大する。
  • ネットワークの一時的な障害でPSTが破損し、PST内のデータが喪失する。
  • PSTを保持しているサーバーに負荷がかかり、サーバーが異常終了する。

そのため、ネットワークドライブ上の20ものPSTファイルを開くという運用は全くおすすめはできません。

とりあえず、指定した PST をすべて接続するというマクロを作りましたので、"c:\temp\test1.pst" などをネットワークドライブ上の PST のフルパスに置き換えればご要望は満たせると思います。PST を追加したい場合は、Array("c:\temp\test1.pst", "c:\temp\test2.pst", "c:\temp\test3.pst") というように、Array の後のかっこの中にカンマで区切って "" に括った PST のフルパスを追加してください。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub MountPSTs()
    Dim arrPSTs
    Dim i As Integer
    Dim j As Integer
    arrPSTs = Array("c:\temp\test1.pst", "c:\temp\test2.pst")
    '   
    For i = 0 To UBound(arrPSTs)
        Session.AddStore arrPSTs(i)
    Next
End Sub

マクロの登録方法やメニューへの追加について

Outlook 2010/2007 の累積的な修正プログラム 2012 年 12 月分がリリース

12/12 に Office 2010 製品および Office 2007 製品の累積的な修正プログラム (以下、CU) がリリースされました。以下は各製品のそれぞれ CU の KB へのリンクです。

Office 2010 製品

Outlook 2010 の修正

2553391 Description of the Outlook 2010 hotfix package (Outlook-x-none.msp): December 11, 2012

Outlook 2010 の不具合が 4 件修正されています。
なお、この CU を適用する前に KB2597061 または KB2687396 の修正を適用しておかないと 予定表をメールで送信できなくなるという問題が発生しますので、こちらも合わせて適用してください。

Word 2010 の修正

2589388 Description of the Word 2010 hotfix package (Word-x-none.msp): December 11, 2012

Outlook 2010 に影響があると思われる Word の不具合が修正されています。

Office 2007 製品

Outlook 2007 の修正

2596845 Description of the Outlook 2007 hotfix package (Outlook-x-none.msp): December 11, 20122

Outlook 2007 の不具合が 1 件修正されています。
こちらについても、この CU を適用する前に KB2596985 または KB2687329 の修正を適用しておかないと 予定表をメールで送信できなくなるという問題が発生しますので、合わせて適用してください。

Word 2007 の修正

2596621 Description of the Word 2007 hotfix package (Word-x-none.msp): December 11, 2012

Outlook 2007 に影響がある不具合が修正されています。

その他の修正

他の Office 製品の修正へのリンクは、以下の KB にまとめて記載されています。

2789671 Office 2010 の累積的な更新に 2012年 12 月
2789670 2007 Office システムの累積的な更新に 2012年 12 月

既定の予定表の予定を別の予定表にコピーするマクロ

コメントで以下のようなご要望をいただきました。


Outlook2007で、複数の予定表を使い分けているのですが、事情があってデフォルトの予定表(”予定表”)と別の予定表(”仕事”)を同期したいと思っています。

最初の方針として、デフォルトの予定表をいったんicsファイルで書き出してローカルに保存し、それを予定表(仕事)にインポートするということを考えました。この方法なら、予定のコピーだけでなく、修正された予定の変更もできるはずです。しかし、Outlookでファイルからのインポートを行うと、インポートされた予定はデフォルトの予定表に取り込まれてしまいました。特定の予定表を指定して、そこにicsファイルからインポートすることはできないのでしょうか。また、もしできるのなら、マクロでその作業を行う方法をお教え下さい。なおicsファイルに書き出すマクロはすでにあります。

icsファイル経由が難しければ、デフォルト予定表からアイテムを一つずつコピーするのが次善の方針と思います。それぞれのフォルダを取得するコードは、Outlookのヘルプ等からなんとか見つけたのですが、アイテムをコピーするコードが分かりません。お教えいただけますとありがたく思います。望ましくは、単なるコピーではなく同期(予定の削除や変更も反映)できるとよいのですが、これは無理なのでしょうか。


Outlook 2007 で ics ファイルを開く場合、デフォルトの予定表以外にコピーすることはできないようです。

ただ、予定表のデータをコピーするなら ics ファイルを経由するのではなく、直接コピーするほうが手間がかからないでしょう。

以下は予定表のアイテムをその直下の「仕事」というフォルダーにコピーするマクロです。コピーの際には「既定の予定表からコピー」という分類項目を設定しており、コピー前にあらかじめ以前コピーしたデータを削除する動作にしています。 これなら、結果として変更や削除も同期できます。(仕事のフォルダーで変更したデータは失われますが…)

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub SyncCalendar()
    Const SYNC_CATEGORY = "既定の予定表からコピー"
    Dim calSrc As Folder
    Dim calDst As Folder
    Dim fldDeleted As Folder
    Dim colAppt As Items
    Dim apptSrc As AppointmentItem
    Dim apptDst As AppointmentItem
    Dim i As Integer
    ' 既定の予定表とその下の仕事という名前のフォルダーを取得
    Set calSrc = Session.GetDefaultFolder(olFolderCalendar)
    Set calDst = calSrc.Folders("仕事")
    ' コピー先のフォルダーから以前コピーしたアイテムを削除
    Set colAppt = calDst.Items.Restrict("[分類項目]='" & SYNC_CATEGORY & "'")
    For i = colAppt.Count To 1 Step -1
        colAppt.Item(i).Delete
    Next
    ' 削除済みに残ったアイテムを完全削除
    Set fldDeleted = Session.GetDefaultFolder(olFolderDeletedItems)
    Set colAppt = fldDeleted.Items.Restrict("[分類項目]='" & SYNC_CATEGORY & "'")
    For i = colAppt.Count To 1 Step -1
        colAppt.Item(i).Delete
    Next
    ' アイテムをコピー
    For Each apptSrc In calSrc.Items
        Set apptDst = apptSrc.CopyTo(calDst, olCreateAppointment)
        apptDst.Categories = SYNC_CATEGORY
        apptDst.Save
    Next
End Sub

マクロの登録方法やメニューへの追加について

Outlook のアイテム一覧表示のカスタマイズが突然変更される現象について

Outlook ではアイテムの一覧表示で並び替え方法や表示される項目を自由にカスタマイズすることができます。
このようにカスタマイズ可能な一覧表示のレイアウトのことを Outlook ではビューと呼んでいます。

ビューの設定はフォルダーごとに保存することができ、たとえば受信トレイで表示される項目と、そのサブフォルダーで表示される項目を別にするというようなことも可能です。しかし、保存処理自体はユーザーが行うのではなく、自動的に行われます。
そして、この「自動的に行われる」ということが、時々問題を引き起こします。

通常、最初に表示されるビューは「メッセージ」または「コンパクト」となっており、ユーザーが特に意識しない限りこれらの名前のビューに変更が保存されます。
ただし、基本的には前述の通りビューの変更はフォルダーごとに保存され、特定のフォルダーの変更がほかのフォルダーには反映されません。

しかし、以前「既定のビューをカスタマイズする方法」で紹介したように、特定の操作を行うと現在のフォルダーのビューの設定をほかのフォルダーの同じ名前のビューに反映させることができます。
つまり、意図せずほかのフォルダーのビューを上書きしてしまうことがあるのです。

また、何らかの理由によりビューの保存に失敗することがあれば、既定のビュー設定に戻るということも考えられます。

したがって、ある特定のフォルダーに固有のビューが必要であり、それを誤って変更されたくないというような場合は、既定のビューとは異なるフォルダー固有のビューを作成したほうが良いでしょう。
ビューの作成手順などについては、以下の Office ヘルプ ページを参照してください。

ビューを作成、変更、またはカスタマイズする

パブリックフォルダーの連絡先をマクロで活用する

連絡先をマクロで活用する」という記事のコメントで、検索をする連絡先をパブリック フォルダー上の連絡先とそのサブフォルダーにしたいというご要望をいただきました。

特定のフォルダーとそのフォルダーについて検索処理などを順次行う必要がある場合、再帰という手法を使用します。

たとえば、「連絡先をマクロで活用する」のマクロを、パブリック フォルダーの連絡先以下のサブフォルダーまで検索するように変更したマクロは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。
'
' メール受信時に発生するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim i As Integer
    Dim c As Integer
    Dim colID As Variant
    If InStr(EntryIDCollection, ",") = 0 Then
        RewriteSender EntryIDCollection
    Else
        colID = Split(EntryIDCollection, ",")
        For i = LBound(colID) To UBound(colID)
            RewriteSender colID(i)
        Next
    End If
End Sub
'
' 差出人の名前を置き換えるサブプロシージャ
Private Sub RewriteSender(ByVal strEntryID As String)
    On Error Resume Next
    Dim objMail 'As MailItem
    Dim objContact As ContactItem
    Dim strSenderAddress As String
    '
    Set objMail = Application.Session.GetItemFromID(strEntryID)
    If objMail.MessageClass = "IPM.Note" Then
        strSenderAddress = objMail.SenderEmailAddress
        Set objContact = FindContactByAddress(strSenderAddress)
        If Not objContact Is Nothing Then
            objMail.SentOnBehalfOfName = objContact.FileAs
            objMail.Save
        End If
    End If
End Sub
'
' 受信トレイの差出人の名前を置き換えるサブプロシージャ
Public Sub RewriteSenderInInbox()
    On Error Resume Next
    Dim objMail 'As MailItem
    '
    For Each objMail In Application.Session.GetDefaultFolder(olFolderInbox).Items
        RewriteSender objMail.EntryID
    Next
End Sub
'
' PF 連絡先を検索する関数
Private Function FindContactByAddress(strAddress As String)
    Dim objContacts As Folder
    Dim objContact As ContactItem
    '
    Set objContacts = Application.Session.Folders("パブリック フォルダ").Folders("すべてのパブリック フォルダ").Folders("連絡先")
    ' Outlook 2010 は下記を使用、sample@example.com を自分のメールアドレスに置き換える
    'Set objContacts = Application.Session.Folders("パブリック フォルダー - sample@example.com").Folders("すべてのパブリック フォルダー").Folders("連絡先")
    Set FindContactByAddress = FindContactRecursive(objContacts, strAddress)
End Function
'
' 連絡先フォルダーを再帰的に検索する関数
Private Function FindContactRecursive(objContacts As Folder, strAddress As String)
    Dim objSubFolder As Folder
    Set objContact = objContacts.Items.Find("[Email1Address] = '" & strAddress _
        & "' or [Email2Address] = '" & strAddress _
        & "' or [Email3Address] = '" & strAddress & "'")
    ' 見つからなければサブフォルダーを検索
    If objContact Is Nothing Then
        For Each objSubFolder In objContacts.Folders
            ' 再帰的に検索
            Set objContact = FindContactRecursive(objSubFolder, strAddress)
            If Not objContact Is Nothing Then
                ' 見つかったら検索終了
                Set FindContactRecursive = objContact
                Exit Function
            End If
        Next
    End If
    Set FindContactRecursive = objContact
End Function

マクロの登録方法やメニューへの追加について

Outlook 2010/2007 用の重要な更新プログラムがリリース

11/14 に、Outlook 2010 と Outlook 2007 の更新プログラムが Microsoft ダウンロード センターよりダウンロード可能となり、Windows Update でも重要な更新プログラムとして表示されるようになりました。

こちらの修正は、セキュリティに関する修正ではないのですが、重要な修正が含まれるということで自動更新の対象となったようです。

それぞれの KB は以下の通りです。

Outlook 2010 – 2687623 Outlook 2010 の更新プログラムの説明: 2012 年 11 月 13日

Outlook 2007 – 2687404 Outlook 2007 更新プログラム: 2012 年 11 月 13日

ただし、上記記事には「最新の修正プログラム」と記載されているのですが、実際には 8 月の累積的な修正プログラムと同等のものであり、最新の 10 月リリース分の修正は含まれていません。

よって、すでに10月の修正プログラムが適用されている環境には適用できないということになります。(10 月リリース分には今回の修正も含まれているので、適用する必要もありませんが。)

この修正パッケージのメリットとしては以下のようなものがあります。

  • Windows Sever Update Service で配布ができる。
  • 共通モジュールと言語依存モジュールの両方のパッケージが同時に適用できる。

ちなみに、この修正がリリースされる件については以下のブログで予告されていました。

http://blogs.technet.com/b/exchange/archive/2012/09/11/office-365-password-expiration-notifications-in-outlook.aspx

Note: In order to install these updates, you’ll need administrator permissions on the Windows computers. Please contact your Tenant Admin if you are not able to install the updates due to permissions issue. Also, in the coming months these updates are planned to be released via Microsoft Update

Outlook 2010/2007 の累積的な修正プログラム 2012 年 10 月分がリリース

11/4 に Office 2010 製品および Office 2007 製品の累積的な修正プログラム (以下、CU) がリリースされました。以下は各製品のそれぞれ CU の KB へのリンクです。

Office 2010 製品

Outlook 2010 の修正

2687608 Description of the Outlook 2010 hotfix package (Outlook-x-none.msp): October 30, 2012

Outlook 2010 の不具合が 26 件修正されています。
なお、この CU を適用する前に KB2597061 または KB2687396 の修正を適用しておかないと 予定表をメールで送信できなくなるという問題が発生しますので、こちらも合わせて適用してください。

Microsoft Exchange アドインの修正

2687620 Description of the Outlook 2010 hotfix package (Outexum-x-none.msp): October 30, 2012

会議出席依頼に関する不具合が修正されています。

Office 2010 共通モジュールの修正

2596501 Description of the Office 2010 hotfix package (Mso-x-none.msp): October 25, 2011

Outlook 2010 での印刷に関する不具合が修正されています。

Word 2010 の修正

2687556 Description of the Word 2010 hotfix package (Word-x-none.msp, Kb2428677-x-none.msp): October 30, 2012

Outlook 2010 に影響がある Word の不具合が修正されています。

Office 2007 製品

Outlook 2007 の修正

2687540 Description of the Outlook 2007 hotfix package (Outlook-x-none.msp): October 30, 2012

Outlook 2007 の不具合が 9 件修正されています。
こちらについても、この CU を適用する前に KB2596985 または KB2687329 の修正を適用しておかないと 予定表をメールで送信できなくなるという問題が発生しますので、合わせて適用してください。

Office 2007 共通モジュールの修正

2760380 2007 Office システム修正プログラム パッケージ (mso x none.msp) の説明: 2012 年 10 月 30日

Office 2007 製品でハイパーリンクの挿入を行う際にクラッシュするという不具合が修正されています。

Word 2007 の修正

2687537 Word 2007 修正プログラム パッケージ (Wordconv の x-none.msp、単語の x-none.msp) の説明: 2012 年 10 月 30日

Outlook 2007 に影響がある不具合は確認されていないようですが、念のため適用しておいたほうが良いかもしれません。

その他の修正

他の Office 製品の修正へのリンクは、以下の KB にまとめて記載されています。

2757117 Office 2010 の累積的な更新は、2012年 10 月
2757116 2007 Office system cumulative update for October 2012

色分類項目のマスターをエクスポート/インポートするスクリプト

Outlook 2007 以降では色分類項目という機能が追加され、分類項目ごとに色分けができるようになりました。
しかし、この色の情報は個々のアイテムに保存されるのではなく、メールボックスの隠しアイテムとして保存されるものであるため、ほかのユーザーに送信すると色が変わってしまったり、なくなってしまったりします。

そこで、ほかのユーザーと色情報を共有したり、この情報をバックアップしたりするためのスクリプトを作成しました。

まず、色分類項目をエクスポートするスクリプトは以下のようになります。EXPORT_FILE を実際にエクスポートするファイルのフルパスに置き換えてください。

' ここをトリプルクリックでスクリプト全体を選択できます。
Const EXPORT_FILE = "C:\temp\categories.txt"
Dim olkApp 'As Outlook.Application
Dim objFSO 'As FileSystemObject
Dim stmFile 'As TextStream
Dim objCategory 'As Outlook.Category
'
Set olkApp = CreateObject("Outlook.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set stmFile = objFSO.CreateTextFile(EXPORT_FILE, True, False)
For Each objCategory In olkApp.Session.Categories
    stmFile.WriteLine objCategory.Color & ";" & objCategory.ShortcutKey & ";" & objCategory.Name
Next
stmFile.Close

次に、上記のスクリプトでエクスポートした色分類項目をインポートするスクリプトは以下のようになります。こちらも IMPORT_FILE を実際にインポートするファイルのフルパスに置き換えてください。

' ここをトリプルクリックでスクリプト全体を選択できます。
On Error Resume Next
Const IMPORT_FILE = "C:\temp\categories.txt"
Dim olkApp 'As Outlook.Application
Dim objFSO 'As FileSystemObject
Dim stmFile 'As TextStream
Dim strLine 'As String
Dim arrField 'As Variant
Dim objCategory 'As Outlook.Category
'
Set olkApp = CreateObject("Outlook.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set stmFile = objFSO.OpenTextFile(IMPORT_FILE, 1 ) ' ForReading
While Not stmFile.AtEndOfStream
    strLine = stmFile.ReadLine
    arrField = Split(strLine, ";")
    olkApp.Session.Categories.Add arrField(2), arrField(0), arrField(1)
    If Err.Number <> 0 Then ' エラーが発生した場合は既存のものがあるのでそれを上書き
        Set objCategory = olkApp.Session.Categories.Item(arrField(2))
        objCategory.Color = arrField(0)
        objCategory.ShortcutKey = arrField(1)
    End If
Wend
stmFile.Close

Excel のデータをほかのユーザーの予定表に書き込むマクロ

コメントにて以下のようなご要望をいただきました。


備品の管理をOUTLOOK2010(Exchange)で行う事になり、こちらのマクロ
を参考にしようとしたのですが、知識が乏しくなかなか思った通りに
ならない状況です。

掲載されているマクロでは「会議出席依頼」を送信する仕組みですが、
共有設定されているフォルダ(ユーザ?)に「予定」を入れるように
することは出来ないでしょうか。


備品の管理用のメールボックスの予定表への書き込み権限か、メールボックス自体のフルメールボックス権限を持つユーザーであれば、GetSharedDefaultFolder メソッドでほかのメールボックスの予定表を開くことができます。
Excel で以下のようなデータがある場合に、管理用のメールボックスに直接予定を書き込む Excel のマクロをご紹介しましょう。

  A B C D E F
1 日付 開始時刻 終了時刻 件名 場所 受信者
2 2012/10/27 10:00 10:30 予定1 会議室1 equip1
3 2012/11/3 11:00 12:00 予定2 会議室2 equip2

マクロは以下の通りです。このマクロは Excel で実行します。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub PublishOtherscalendar()
    Dim olkApp 'As Outlook.Application
    Dim objRecp 'As Outlook.Recipient
    Dim fldAppt 'As Outlook.Folder
    Dim objAppt 'As Outlook.AppointmentItem
    Dim r As Integer
    ' Outlook アプリケーションを作成
    Set olkApp = CreateObject("Outlook.Application")
    ' 2 行目から開始
    r = 2
    ' A 列が空欄になるまで繰り返す
    While Sheet1.Cells(r, 1) <> ""
        ' F 列の受信者を取得
        Set objRecp = olkApp.Session.CreateRecipient(Sheet1.Cells(r, 6))
        objRecp.Resolve
        ' 受信者の予定表フォルダーを取得
        Set fldAppt = olkApp.Session.GetSharedDefaultFolder(objRecp, 9) ' olFolderCalendar
        ' 予定アイテムを作成
        Set objAppt = fldAppt.Items.Add
        ' 予定の日時や件名、場所を設定して保存
        objAppt.Start = CDate(Sheet1.Cells(r, 1) & " " & CDate(Sheet1.Cells(r, 2)))
        objAppt.End = CDate(Sheet1.Cells(r, 1) & " " & CDate(Sheet1.Cells(r, 3)))
        objAppt.Subject = Sheet1.Cells(r, 4)
        objAppt.Location = Sheet1.Cells(r, 5)
        objAppt.Save
        ' 次の行へ
        r = r + 1
    Wend
End Sub

マクロの登録方法やメニューへの追加について