OutlookVBA

# 添付ファイルをパスワードのいずれかで開く。
```powershell
param (
    [string]$filePath
)

# Excelオブジェクトを作成
$excel = New-Object -ComObject Excel.Application

# パスワードリスト
$passwords = @("", "password_a", "password_b")

# エラーが発生しないようにする
$ErrorActionPreference = "SilentlyContinue"

foreach ($password in $passwords) {
    # エラーフラグを初期化
    $errorFlag = $false
    
    # Excelファイルを開く
    $workbook = $excel.Workbooks.Open($filePath, $null, $true, $null, $password)
    
    # エラーが発生した場合、エラーフラグを設定
    if (-not $workbook) {
        $errorFlag = $true
    }
    
    # エラーフラグが設定されていない場合、ループを抜ける
    if (-not $errorFlag) {
        break
    }
}

# エラーフラグが設定されている場合、エラーメッセージを表示
if ($errorFlag) {
    Write-Host "正しいパスワードが見つかりませんでした。"
}

# Excelを表示
$excel.Visible = $true

# Excelオブジェクトを解放
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
```
# 表示しているメールから情報を取得
```vb
Sub ExtractEmailInfoFromCurrentMail()
    Dim olMail As Outlook.MailItem
    Dim emailInfo() As Variant
    
    ' 現在表示しているメールを取得
    Set olMail = Outlook.Application.ActiveInspector.CurrentItem
    
    ' メールが取得された場合
    If Not olMail Is Nothing Then
        ReDim emailInfo(1 To 1, 1 To 3)
        
        ' メールの情報を配列に格納
        emailInfo(1, 1) = olMail.SenderEmailAddress
        emailInfo(1, 2) = olMail.Subject
        emailInfo(1, 3) = olMail.ReceivedTime
        
        ' 配列の情報を表示（例としてメッセージボックスに表示）
        MsgBox "Sender: " & emailInfo(1, 1) & vbCrLf & _
               "Subject: " & emailInfo(1, 2) & vbCrLf & _
               "Received Time: " & emailInfo(1, 3)
    Else
        MsgBox "No email is currently being displayed."
    End If
End Sub
```
# 各スレッドのルートメールの一覧を表示
ユーザーフォーム上にカレンダーコントロールを追加します。これには、コントロールツールボックスから「Microsoft MonthView Control」を選択してユーザーフォームにドラッグアンドドロップします。
ユーザーフォームに「OK」ボタンと「キャンセル」ボタンを追加します。
```vb
' ユーザーフォームのコード
Private selectedDate As Date

Private Sub UserForm_Initialize()
    ' フォームが初期化されたときにカレンダーコントロールに現在の日付を表示
    Me.MonthView1.Value = Date
End Sub

Private Sub OKButton_Click()
    ' OK ボタンがクリックされたとき、選択された日付を取得しフォームを非表示にする
    selectedDate = Me.MonthView1.Value
    Unload Me
End Sub

Private Sub CancelButton_Click()
    ' キャンセル ボタンがクリックされたとき、選択された日付を空にしてフォームを非表示にする
    selectedDate = Empty
    Unload Me
End Sub

Public Function GetSelectedDate() As Date
    ' 選択された日付を返す関数
    GetSelectedDate = selectedDate
End Function
```
標準モジュール
```vb
Option Explicit
Sub OldestMailOnTop()
    Application.ScreenUpdating = False
    Dim olFolder As Outlook.Folder
    Dim olThreads As Outlook.Conversations
    Dim olThread As Outlook.Conversation
    Dim olRootItems As Outlook.Items
    Dim olItem As Object
    Dim selectedDate As Date
    Dim olFilteredRootItems As Outlook.Items
    
    ' カレンダーフォームを表示して日付を選択
    UserForm1.Show
    
    ' 選択された日付を取得
    selectedDate = UserForm1.GetSelectedDate
    
    ' 選択された日付が空でない場合、処理を続行
    If selectedDate <> Empty Then
        ' アクティブなOutlookフォルダを取得
        Set olFolder = Application.ActiveExplorer.CurrentFolder
        
        ' アクティブなフォルダ内のすべてのスレッドを取得
        Set olThreads = olFolder.GetConversation
        
        ' すべてのスレッドをループで処理
        For Each olThread In olThreads
            ' スレッド内のルートアイテム（最初のメール）を取得
            Set olRootItems = olThread.GetRootItems
            
            ' ルートアイテムの受信年月日でフィルタリング
            Set olFilteredRootItems = olRootItems.Restrict("[ReceivedTime] >= '" & Format(selectedDate, "yyyy-mm-dd") & "'")
            
            ' 最も古いメールが一番上にくるように、メールを日付で昇順にソート
            olFilteredRootItems.Sort "[ReceivedTime]", False
            
            ' 最も古いメールを一番上に表示
            For Each olItem In olFilteredRootItems
                olItem.Display
                Exit For ' 一つ目のメールを表示した後、ループを終了
            Next olItem
        Next olThread
    Else
        ' 選択された日付が空の場合、何もせずに終了
        Exit Sub
    End If
End Sub
```
# 選択のフォルダを個別表示にする
```vb
Option Explicit
Sub AlwaysIndividualDisplay()
    Application.ScreenUpdating = False
    ' 選択されたフォルダを確認
    If TypeName(Application.ActiveExplorer.CurrentFolder) <> "MAPIFolder" Then
        MsgBox "フォルダが選択されていません。", vbExclamation
        Exit Sub
    End If
    
    ' 選択されたフォルダの個別表示に設定
    Application.ActiveExplorer.CurrentFolder.CurrentView = "IPM.Note"
End Sub
```
# 受領連絡を全て行っているかの確認用メッセージボックス
```vb
Option Explicit
Sub DisplayRootMailInfo()
    Application.ScreenUpdating = False
    Dim olFolder As Outlook.Folder
    Dim olItems As Outlook.Items
    Dim olItem As Outlook.MailItem
    Dim olThread As Outlook.Conversation
    Dim olRoot As Outlook.MailItem
    Dim strSenderList As String
    Dim strRootSubject As String
    Dim dtReceived As Date
    Dim strMessage As String

    ' カレンダーフォームを表示して日付を選択
    UserForm1.Show
    
    ' 選択された日付を取得
    selectedDate = UserForm1.GetSelectedDate
    
    If selectedDate = Empty Then
        Exit Sub
    End If
    
    ' Initialize message string
    strMessage = ""
    
    ' Get the selected folder in Outlook
    Set olFolder = Application.ActiveExplorer.CurrentFolder
    
    ' Filter out only mail items
    Set olItems = olFolder.Items.Restrict("[MessageClass]='IPM.Note'")
    
    ' Loop through each thread in the folder
    For Each olThread In olItems.GetConversation
        ' Get the root mail of the thread
        Set olRoot = olThread.GetRootItems(1)
        
        ' Check if the root mail meets the criteria to be displayed
        If Not (olRoot.SenderEmailAddress Like "*helpdesk*" And Left(olRoot.Subject, 3) = "FW:") And olRoot.ReceivedTime >= Format(selectedDate, "yyyy-mm-dd") & "'") Then
            ' Get sender list
            strSenderList = ""
            For Each olItem In olThread.GetRootItems(1).GetTable.Columns("Sender").Items
                strSenderList = strSenderList & olItem & ", "
            Next olItem
            
            ' Get root mail's subject and received date
            strRootSubject = olRoot.Subject
            dtReceived = olRoot.ReceivedTime
            
            ' Add information to message string
            strMessage = strMessage & "Root Mail Subject: " & strRootSubject & vbCrLf & _
                         "Received Date and Time: " & Format(dtReceived, "yyyy-mm-dd hh:mm:ss") & vbCrLf & _
                         "Senders: " & Left(strSenderList, Len(strSenderList) - 2) & vbCrLf & vbCrLf
        End If
    Next olThread
    
    ' Display information in a message box
    If Len(strMessage) > 0 Then
        MsgBox strMessage, vbInformation, "Root Mail Information"
    Else
        MsgBox "No root mails found meeting the criteria.", vbInformation, "Root Mail Information"
    End If
End Sub
```
# 特定のフォルダに作成メールを保存する。
```vb
Sub ShowSaveDialogWithInitialPath()
​​    Dim fileDialog As FileDialog
​​    Dim selectedFilePath As String
​​
​​    ' FileDialogオブジェクトを作成
​​    Set fileDialog = Application.FileDialog(msoFileDialogSaveAs)
​​
​​    ' ダイアログの設定
​​    With fileDialog
​​        .Title = "名前をつけて保存"
​​
​​        ' 初期ディレクトリを指定
​​        .InitialFileName = "C:\Users\YourUsername\Documents\"
​​
​​        ' フィルタを設定
​​        .Filter = "Outlook メッセージファイル (*.msg), *.msg"
​​
​​        ' デフォルトの拡張子を設定
​​        .DefaultExt = "msg"
​​
​​        ' ダイアログを表示
​​        If .Show = -1 Then
​​            ' ユーザーが「保存」を選択した場合
​​            selectedFilePath = .SelectedItems(1) ' ユーザーが指定したファイルパスを取得
​​            MsgBox "ファイルが " & selectedFilePath & " に保存されました。", vbInformation
​​        End If
​​    End With
​​End Sub
```