[[20230131162735]] 『Outlookでの変数の宣言』(おっちょこちょい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Outlookでの変数の宣言』(おっちょこちょい)

初めまして。
対象がOutLookですが、エクセルから動かしすマクロなのでご容赦ください。

仕事のスケジュールを組んでエクセルに書き込んでいる方のブックから
自分のOutLookのスケジューラーに落とし込むマクロをネットで調べたりして
組みましたが、
下記コードのolItemBeforeの宣言がObjectでは何を差しているのか
分かりづらくて少し気持ち悪いので、
より正確に変数を宣言したいのですが・・・
よくわからないので知っている方がいたら教えて頂ければありがたいです。
また他に「こうしたらいい」という箇所がありましたら
ご教示いただけると幸いです。

コード:
Private Sub OutLookSceduling()

    '
    Dim olApp As New Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Outlook.Folder
    Dim olConItems As Outlook.Items
    Dim olItem As Outlook.AppointmentItem
    Dim olItemBefore As Object '←これ

    '
    Dim ws As Worksheet
    Dim r As Long, EndRow As Long
    Dim Time As String

    '
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items

    'この時間の予定はこれしかないので一旦全部消す
    For Each olItemBefore In olConItems
        If TypeName(olItemBefore) = "AppointmentItem" Then
            Time = Format(olItemBefore, "Short Time")
            If Time = "07:45" Then olItemBefore.Delete
        End If
    Next olItemBefore

    '新しく予定を入れなおす
    Set ws = MacroSheet
    EndRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    For r = 2 To EndRow
        Set olItem = olApp.CreateItem(olAppointmentItem)

        With olItem
            .Subject = ws.Cells(r, "C").Value & vbLf & ws.Cells(r, "D").Value
            .Start = ws.Cells(r, "B").Value & " 7:45:00"
            .End = ws.Cells(r, "B").Value & " 10:00:00"
            .Save
        End With
    Next r

End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 For Each olItemBefore In olConItems
 の行をステップ実行してみれば、ローカルウインドウで olItemBeforeの型を調べることができます。

 私はOUTLOOKつかってないので、実行できませんが、

 olConItemsの型は、Outlook.Items だから、ループ変数のolItemBeforeは Outlook.Item なのではないか?
 と想像しつつ、オブジェクトブラウザで調べると、Outlook.Items の Itemプロパティは、
 Function Item(Index) As Object となっているので、Object型が正しい  の で  は ...?
(´・ω・`) 2023/01/31(火) 17:08:47

 (´・ω・`)さんのおっしゃる通り、戻り値はObject型でよさそうです。
 >TypeName(olItemBefore)
 ここでTypeNameを問い合わせているので、olFolder.Itemsの中身は一定ではなさそうです。

 どちらかというと
 > Time = Format(olItemBefore, "Short Time")
 この部分でエラーになるので

    Dim olAppoItem As Outlook.AppointmentItem
’〜〜中略
    For Each olItemBefore In olConItems
        If TypeName(olItemBefore) = "AppointmentItem" Then
            Set olAppoItem = olItemBefore
            Time = Format(olAppoItem.Start, "Short Time")
            'If Time = "07:45" Then olItemBefore.Delete
        End If
    Next olItemBefore
 こんな感じに直すと、候補も出てきてわかりやすいんじゃないですかね?

 >    Set ws = MacroSheet
 ここもエラーだけど、敢えてぼかしてるでいいのかな?
(稲葉) 2023/01/31(火) 17:32:01

(´・ω・`)さん、稲葉さん、返答ありがとうございます。

Object型が正しいのですね。
稲葉さん提案のSet olAppoItem = olItemBeforeにしたら確かに候補出てきますね、使わせて頂きます。

Set ws = MacroSheetは当初クラスでプロシージャ分けていた時のPublic変数の名残ですね。
そこまで多くのプロシージャにならなかったので一つのモジュールに纏めてモジュール内の変数にしたのですが、
全てのwsを変更するのが面倒だったのでこの形になっています。

(おっちょこちょい) 2023/02/01(水) 12:18:25


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.