[[20220627143113]] 『FreeBusyを01で取得して、0の時間帯だけをまとめax(estariol) ページの最後に飛ぶ

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

 

『FreeBusyを01で取得して、0の時間帯だけをまとめて表示したい』(estariol)

お世話になっております。

OutlookのFreeBusyで特定のアカウントの約2か月分(57日分)の予定を01表示で取得しました。
0が空き時間で、1が予定ありです。
時間帯は08:00〜19:00で、30分単位なので1日が22文字分です。

このうち、空き時間の部分だけを集めて、最終的には次のようにexcelのシートに書き込みたいと思っています。

   A    B      C      D            E             F
1 6月 27日 月曜日 8:00end9:00 9:30end10:30 17:00end19:00
2 6月 28日 火曜日 8:00end9:00 13:00end14:30 18:00end19:00
3 6月 29日 水曜日 8:00end9:30 13:00end14:00 18:30end19:00
 (以下略)

自力ではマクロでそこまでたどり着けなくて、22文字を1文字ずつに分けて時間帯に入れてみたのですが、そこからもどうすればよいのかわかりません。
現在のコードでは次のような状態です。

   A    B     C      D    E    F    G     ...  W     X     Y   
1                    8:00 8:30 9:00 9:30  ...  17:30 18:00 18:30
2 6月 27日 月曜日  0    0    1    0     ...  0     0     0
3 6月 28日 火曜日 0    0    1    1     ...  1     0     0
4 6月 29日 水曜日 0    0    0    1     ...  1     1     0
 (以下略)

現在のコード

Public Sub GetFreeBusyInfo()

    Dim olApp As Outlook.Application
    Dim myNameSpace As Outlook.Namespace
    Dim myRecipient As Outlook.Recipient
    Dim myFBInfo As String
    Dim myFBInfo2 As String
    Dim days(1 To 57) As Variant
    Dim day As Variant

    Dim wbBook As Workbook
    Dim wsSheet As Worksheet

    Set wbBook = ThisWorkbook
    Set wsSheet = wbBook.Worksheets("freebusy")
    wsSheet.Activate

    Set olApp = New Outlook.Application
    Set myNameSpace = olApp.GetNamespace("MAPI")
    Set myRecipient = myNameSpace.CreateRecipient("sample@example.com")

    On Error GoTo ErrorHandler

    myFBInfo = myRecipient.FreeBusy(Date, 30, False)
    myFBInfo2 = myRecipient.FreeBusy(DateAdd("d", 29, Date), 30, False)
  '1日分48文字が28日分つながっているので、必要な22文字分を切り出しています
    days(1) = Mid(myFBInfo, 17, 22)
    days(2) = Mid(myFBInfo, 65, 22)
    days(3) = Mid(myFBInfo, 113, 22)
    days(4) = Mid(myFBInfo, 161, 22)
    days(5) = Mid(myFBInfo, 209, 22)
    days(6) = Mid(myFBInfo, 257, 22)
    days(7) = Mid(myFBInfo, 305, 22)
    days(8) = Mid(myFBInfo, 353, 22)
    days(9) = Mid(myFBInfo, 401, 22)
    days(10) = Mid(myFBInfo, 449, 22)
    days(11) = Mid(myFBInfo, 497, 22)
    days(12) = Mid(myFBInfo, 545, 22)
    days(13) = Mid(myFBInfo, 593, 22)
    days(14) = Mid(myFBInfo, 641, 22)
    days(15) = Mid(myFBInfo, 689, 22)
    days(16) = Mid(myFBInfo, 737, 22)
    days(17) = Mid(myFBInfo, 785, 22)
    days(18) = Mid(myFBInfo, 833, 22)
    days(19) = Mid(myFBInfo, 881, 22)
    days(20) = Mid(myFBInfo, 929, 22)
    days(21) = Mid(myFBInfo, 977, 22)
    days(22) = Mid(myFBInfo, 1025, 22)
    days(23) = Mid(myFBInfo, 1073, 22)
    days(24) = Mid(myFBInfo, 1121, 22)
    days(25) = Mid(myFBInfo, 1169, 22)
    days(26) = Mid(myFBInfo, 1217, 22)
    days(27) = Mid(myFBInfo, 1265, 22)
    days(28) = Mid(myFBInfo, 1313, 22)
    days(29) = Mid(myFBInfo, 1361, 22)
    days(30) = Mid(myFBInfo2, 17, 22)
    days(31) = Mid(myFBInfo2, 65, 22)
    days(32) = Mid(myFBInfo2, 113, 22)
    days(33) = Mid(myFBInfo2, 161, 22)
    days(34) = Mid(myFBInfo2, 209, 22)
    days(35) = Mid(myFBInfo2, 257, 22)
    days(36) = Mid(myFBInfo2, 305, 22)
    days(37) = Mid(myFBInfo2, 353, 22)
    days(38) = Mid(myFBInfo2, 401, 22)
    days(39) = Mid(myFBInfo2, 449, 22)
    days(40) = Mid(myFBInfo2, 497, 22)
    days(41) = Mid(myFBInfo2, 545, 22)
    days(42) = Mid(myFBInfo2, 593, 22)
    days(43) = Mid(myFBInfo2, 641, 22)
    days(44) = Mid(myFBInfo2, 689, 22)
    days(45) = Mid(myFBInfo2, 737, 22)
    days(46) = Mid(myFBInfo2, 785, 22)
    days(47) = Mid(myFBInfo2, 833, 22)
    days(48) = Mid(myFBInfo2, 881, 22)
    days(49) = Mid(myFBInfo2, 929, 22)
    days(50) = Mid(myFBInfo2, 977, 22)
    days(51) = Mid(myFBInfo2, 1025, 22)
    days(52) = Mid(myFBInfo2, 1073, 22)
    days(53) = Mid(myFBInfo2, 1121, 22)
    days(54) = Mid(myFBInfo2, 1169, 22)
    days(55) = Mid(myFBInfo2, 1217, 22)
    days(56) = Mid(myFBInfo2, 1265, 22)
    days(57) = Mid(myFBInfo2, 1313, 22)

    Application.ScreenUpdating = False

    With wsSheet
        .Range("A2").CurrentRegion.Clear
        .Cells(1, 4).Value = "8:00"
        .Cells(1, 5).Value = "8:30"
        .Cells(1, 6).Value = "9:00"
        .Cells(1, 7).Value = "9:30"
        .Cells(1, 8).Value = "10:00"
        .Cells(1, 9).Value = "10:30"
        .Cells(1, 10).Value = "11:00"
        .Cells(1, 11).Value = "11:30"
        .Cells(1, 12).Value = "12:00"
        .Cells(1, 13).Value = "12:30"
        .Cells(1, 14).Value = "13:00"
        .Cells(1, 15).Value = "13:30"
        .Cells(1, 16).Value = "14:00"
        .Cells(1, 17).Value = "14:30"
        .Cells(1, 18).Value = "15:00"
        .Cells(1, 19).Value = "15:30"
        .Cells(1, 20).Value = "16:00"
        .Cells(1, 21).Value = "16:30"
        .Cells(1, 22).Value = "17:00"
        .Cells(1, 23).Value = "17:30"
        .Cells(1, 24).Value = "18:00"
        .Cells(1, 25).Value = "18:30"
        .Cells(2, 1).Value = Format(Date, "m月")
        .Cells(2, 2).Value = Format(Date, "d日")
        .Cells(2, 3).Value = Format(Date, "aaaa")
        .Cells(3, 1).Value = Format(DateAdd("d", 1, Date), "m月")
        .Cells(3, 2).Value = Format(DateAdd("d", 1, Date), "d日")
        .Cells(3, 3).Value = Format(DateAdd("d", 1, Date), "aaaa")
        .Cells(4, 1).Value = Format(DateAdd("d", 2, Date), "m月")
        .Cells(4, 2).Value = Format(DateAdd("d", 2, Date), "d日")
        .Cells(4, 3).Value = Format(DateAdd("d", 2, Date), "aaaa")
        .Cells(5, 1).Value = Format(DateAdd("d", 3, Date), "m月")
        .Cells(5, 2).Value = Format(DateAdd("d", 3, Date), "d日")
        .Cells(5, 3).Value = Format(DateAdd("d", 3, Date), "aaaa")
        .Cells(6, 1).Value = Format(DateAdd("d", 4, Date), "m月")
        .Cells(6, 2).Value = Format(DateAdd("d", 4, Date), "d日")
        .Cells(6, 3).Value = Format(DateAdd("d", 4, Date), "aaaa")
        .Cells(7, 1).Value = Format(DateAdd("d", 5, Date), "m月")
        .Cells(7, 2).Value = Format(DateAdd("d", 5, Date), "d日")
        .Cells(7, 3).Value = Format(DateAdd("d", 5, Date), "aaaa")
        .Cells(8, 1).Value = Format(DateAdd("d", 6, Date), "m月")
        .Cells(8, 2).Value = Format(DateAdd("d", 6, Date), "d日")
        .Cells(8, 3).Value = Format(DateAdd("d", 6, Date), "aaaa")
        .Cells(9, 1).Value = Format(DateAdd("d", 7, Date), "m月")
        .Cells(9, 2).Value = Format(DateAdd("d", 7, Date), "d日")
        .Cells(9, 3).Value = Format(DateAdd("d", 7, Date), "aaaa")
        .Cells(10, 1).Value = Format(DateAdd("d", 8, Date), "m月")
        .Cells(10, 2).Value = Format(DateAdd("d", 8, Date), "d日")
        .Cells(10, 3).Value = Format(DateAdd("d", 8, Date), "aaaa")
        .Cells(11, 1).Value = Format(DateAdd("d", 9, Date), "m月")
        .Cells(11, 2).Value = Format(DateAdd("d", 9, Date), "d日")
        .Cells(11, 3).Value = Format(DateAdd("d", 9, Date), "aaaa")
        .Cells(12, 1).Value = Format(DateAdd("d", 10, Date), "m月")
        .Cells(12, 2).Value = Format(DateAdd("d", 10, Date), "d日")
        .Cells(12, 3).Value = Format(DateAdd("d", 10, Date), "aaaa")
        .Cells(13, 1).Value = Format(DateAdd("d", 11, Date), "m月")
        .Cells(13, 2).Value = Format(DateAdd("d", 11, Date), "d日")
        .Cells(13, 3).Value = Format(DateAdd("d", 11, Date), "aaaa")
        .Cells(14, 1).Value = Format(DateAdd("d", 12, Date), "m月")
        .Cells(14, 2).Value = Format(DateAdd("d", 12, Date), "d日")
        .Cells(14, 3).Value = Format(DateAdd("d", 12, Date), "aaaa")
        .Cells(15, 1).Value = Format(DateAdd("d", 13, Date), "m月")
        .Cells(15, 2).Value = Format(DateAdd("d", 13, Date), "d日")
        .Cells(15, 3).Value = Format(DateAdd("d", 13, Date), "aaaa")
        .Cells(16, 1).Value = Format(DateAdd("d", 14, Date), "m月")
        .Cells(16, 2).Value = Format(DateAdd("d", 14, Date), "d日")
        .Cells(16, 3).Value = Format(DateAdd("d", 14, Date), "aaaa")
        .Cells(17, 1).Value = Format(DateAdd("d", 15, Date), "m月")
        .Cells(17, 2).Value = Format(DateAdd("d", 15, Date), "d日")
        .Cells(17, 3).Value = Format(DateAdd("d", 15, Date), "aaaa")
        .Cells(18, 1).Value = Format(DateAdd("d", 16, Date), "m月")
        .Cells(18, 2).Value = Format(DateAdd("d", 16, Date), "d日")
        .Cells(18, 3).Value = Format(DateAdd("d", 16, Date), "aaaa")
        .Cells(19, 1).Value = Format(DateAdd("d", 17, Date), "m月")
        .Cells(19, 2).Value = Format(DateAdd("d", 17, Date), "d日")
        .Cells(19, 3).Value = Format(DateAdd("d", 17, Date), "aaaa")
        .Cells(20, 1).Value = Format(DateAdd("d", 18, Date), "m月")
        .Cells(20, 2).Value = Format(DateAdd("d", 18, Date), "d日")
        .Cells(20, 3).Value = Format(DateAdd("d", 18, Date), "aaaa")
        .Cells(21, 1).Value = Format(DateAdd("d", 19, Date), "m月")
        .Cells(21, 2).Value = Format(DateAdd("d", 19, Date), "d日")
        .Cells(21, 3).Value = Format(DateAdd("d", 19, Date), "aaaa")
        .Cells(22, 1).Value = Format(DateAdd("d", 20, Date), "m月")
        .Cells(22, 2).Value = Format(DateAdd("d", 20, Date), "d日")
        .Cells(22, 3).Value = Format(DateAdd("d", 20, Date), "aaaa")
        .Cells(23, 1).Value = Format(DateAdd("d", 21, Date), "m月")
        .Cells(23, 2).Value = Format(DateAdd("d", 21, Date), "d日")
        .Cells(23, 3).Value = Format(DateAdd("d", 21, Date), "aaaa")
        .Cells(24, 1).Value = Format(DateAdd("d", 22, Date), "m月")
        .Cells(24, 2).Value = Format(DateAdd("d", 22, Date), "d日")
        .Cells(24, 3).Value = Format(DateAdd("d", 22, Date), "aaaa")
        .Cells(25, 1).Value = Format(DateAdd("d", 23, Date), "m月")
        .Cells(25, 2).Value = Format(DateAdd("d", 23, Date), "d日")
        .Cells(25, 3).Value = Format(DateAdd("d", 23, Date), "aaaa")
        .Cells(26, 1).Value = Format(DateAdd("d", 24, Date), "m月")
        .Cells(26, 2).Value = Format(DateAdd("d", 24, Date), "d日")
        .Cells(26, 3).Value = Format(DateAdd("d", 24, Date), "aaaa")
        .Cells(27, 1).Value = Format(DateAdd("d", 25, Date), "m月")
        .Cells(27, 2).Value = Format(DateAdd("d", 25, Date), "d日")
        .Cells(27, 3).Value = Format(DateAdd("d", 25, Date), "aaaa")
        .Cells(28, 1).Value = Format(DateAdd("d", 26, Date), "m月")
        .Cells(28, 2).Value = Format(DateAdd("d", 26, Date), "d日")
        .Cells(28, 3).Value = Format(DateAdd("d", 26, Date), "aaaa")
        .Cells(29, 1).Value = Format(DateAdd("d", 27, Date), "m月")
        .Cells(29, 2).Value = Format(DateAdd("d", 27, Date), "d日")
        .Cells(29, 3).Value = Format(DateAdd("d", 27, Date), "aaaa")
        .Cells(30, 1).Value = Format(DateAdd("d", 28, Date), "m月")
        .Cells(30, 2).Value = Format(DateAdd("d", 28, Date), "d日")
        .Cells(30, 3).Value = Format(DateAdd("d", 28, Date), "aaaa")
        .Cells(31, 1).Value = Format(DateAdd("d", 29, Date), "m月")
        .Cells(31, 2).Value = Format(DateAdd("d", 29, Date), "d日")
        .Cells(31, 3).Value = Format(DateAdd("d", 29, Date), "aaaa")
        .Cells(32, 1).Value = Format(DateAdd("d", 30, Date), "m月")
        .Cells(32, 2).Value = Format(DateAdd("d", 30, Date), "d日")
        .Cells(32, 3).Value = Format(DateAdd("d", 30, Date), "aaaa")
        .Cells(33, 1).Value = Format(DateAdd("d", 31, Date), "m月")
        .Cells(33, 2).Value = Format(DateAdd("d", 31, Date), "d日")
        .Cells(33, 3).Value = Format(DateAdd("d", 31, Date), "aaaa")
        .Cells(34, 1).Value = Format(DateAdd("d", 32, Date), "m月")
        .Cells(34, 2).Value = Format(DateAdd("d", 32, Date), "d日")
        .Cells(34, 3).Value = Format(DateAdd("d", 32, Date), "aaaa")
        .Cells(35, 1).Value = Format(DateAdd("d", 33, Date), "m月")
        .Cells(35, 2).Value = Format(DateAdd("d", 33, Date), "d日")
        .Cells(35, 3).Value = Format(DateAdd("d", 33, Date), "aaaa")
        .Cells(36, 1).Value = Format(DateAdd("d", 34, Date), "m月")
        .Cells(36, 2).Value = Format(DateAdd("d", 34, Date), "d日")
        .Cells(36, 3).Value = Format(DateAdd("d", 34, Date), "aaaa")
        .Cells(37, 1).Value = Format(DateAdd("d", 35, Date), "m月")
        .Cells(37, 2).Value = Format(DateAdd("d", 35, Date), "d日")
        .Cells(37, 3).Value = Format(DateAdd("d", 35, Date), "aaaa")
        .Cells(38, 1).Value = Format(DateAdd("d", 36, Date), "m月")
        .Cells(38, 2).Value = Format(DateAdd("d", 36, Date), "d日")
        .Cells(38, 3).Value = Format(DateAdd("d", 36, Date), "aaaa")
        .Cells(39, 1).Value = Format(DateAdd("d", 37, Date), "m月")
        .Cells(39, 2).Value = Format(DateAdd("d", 37, Date), "d日")
        .Cells(39, 3).Value = Format(DateAdd("d", 37, Date), "aaaa")
        .Cells(40, 1).Value = Format(DateAdd("d", 38, Date), "m月")
        .Cells(40, 2).Value = Format(DateAdd("d", 38, Date), "d日")
        .Cells(40, 3).Value = Format(DateAdd("d", 38, Date), "aaaa")
        .Cells(41, 1).Value = Format(DateAdd("d", 39, Date), "m月")
        .Cells(41, 2).Value = Format(DateAdd("d", 39, Date), "d日")
        .Cells(41, 3).Value = Format(DateAdd("d", 39, Date), "aaaa")
        .Cells(42, 1).Value = Format(DateAdd("d", 40, Date), "m月")
        .Cells(42, 2).Value = Format(DateAdd("d", 40, Date), "d日")
        .Cells(42, 3).Value = Format(DateAdd("d", 40, Date), "aaaa")
        .Cells(43, 1).Value = Format(DateAdd("d", 41, Date), "m月")
        .Cells(43, 2).Value = Format(DateAdd("d", 41, Date), "d日")
        .Cells(43, 3).Value = Format(DateAdd("d", 41, Date), "aaaa")
        .Cells(44, 1).Value = Format(DateAdd("d", 42, Date), "m月")
        .Cells(44, 2).Value = Format(DateAdd("d", 42, Date), "d日")
        .Cells(44, 3).Value = Format(DateAdd("d", 42, Date), "aaaa")
        .Cells(45, 1).Value = Format(DateAdd("d", 43, Date), "m月")
        .Cells(45, 2).Value = Format(DateAdd("d", 43, Date), "d日")
        .Cells(45, 3).Value = Format(DateAdd("d", 43, Date), "aaaa")
        .Cells(46, 1).Value = Format(DateAdd("d", 44, Date), "m月")
        .Cells(46, 2).Value = Format(DateAdd("d", 44, Date), "d日")
        .Cells(46, 3).Value = Format(DateAdd("d", 44, Date), "aaaa")
        .Cells(47, 1).Value = Format(DateAdd("d", 45, Date), "m月")
        .Cells(47, 2).Value = Format(DateAdd("d", 45, Date), "d日")
        .Cells(47, 3).Value = Format(DateAdd("d", 45, Date), "aaaa")
        .Cells(48, 1).Value = Format(DateAdd("d", 46, Date), "m月")
        .Cells(48, 2).Value = Format(DateAdd("d", 46, Date), "d日")
        .Cells(48, 3).Value = Format(DateAdd("d", 46, Date), "aaaa")
        .Cells(49, 1).Value = Format(DateAdd("d", 47, Date), "m月")
        .Cells(49, 2).Value = Format(DateAdd("d", 47, Date), "d日")
        .Cells(49, 3).Value = Format(DateAdd("d", 47, Date), "aaaa")
        .Cells(50, 1).Value = Format(DateAdd("d", 48, Date), "m月")
        .Cells(50, 2).Value = Format(DateAdd("d", 48, Date), "d日")
        .Cells(50, 3).Value = Format(DateAdd("d", 48, Date), "aaaa")
        .Cells(51, 1).Value = Format(DateAdd("d", 49, Date), "m月")
        .Cells(51, 2).Value = Format(DateAdd("d", 49, Date), "d日")
        .Cells(51, 3).Value = Format(DateAdd("d", 49, Date), "aaaa")
        .Cells(52, 1).Value = Format(DateAdd("d", 50, Date), "m月")
        .Cells(52, 2).Value = Format(DateAdd("d", 50, Date), "d日")
        .Cells(52, 3).Value = Format(DateAdd("d", 50, Date), "aaaa")
        .Cells(53, 1).Value = Format(DateAdd("d", 51, Date), "m月")
        .Cells(53, 2).Value = Format(DateAdd("d", 51, Date), "d日")
        .Cells(53, 3).Value = Format(DateAdd("d", 51, Date), "aaaa")
        .Cells(54, 1).Value = Format(DateAdd("d", 52, Date), "m月")
        .Cells(54, 2).Value = Format(DateAdd("d", 52, Date), "d日")
        .Cells(54, 3).Value = Format(DateAdd("d", 52, Date), "aaaa")
        .Cells(55, 1).Value = Format(DateAdd("d", 53, Date), "m月")
        .Cells(55, 2).Value = Format(DateAdd("d", 53, Date), "d日")
        .Cells(55, 3).Value = Format(DateAdd("d", 53, Date), "aaaa")
        .Cells(56, 1).Value = Format(DateAdd("d", 54, Date), "m月")
        .Cells(56, 2).Value = Format(DateAdd("d", 54, Date), "d日")
        .Cells(56, 3).Value = Format(DateAdd("d", 54, Date), "aaaa")
        .Cells(57, 1).Value = Format(DateAdd("d", 55, Date), "m月")
        .Cells(57, 2).Value = Format(DateAdd("d", 55, Date), "d日")
        .Cells(57, 3).Value = Format(DateAdd("d", 55, Date), "aaaa")
        .Cells(58, 1).Value = Format(DateAdd("d", 56, Date), "m月")
        .Cells(58, 2).Value = Format(DateAdd("d", 56, Date), "d日")
        .Cells(58, 3).Value = Format(DateAdd("d", 56, Date), "aaaa")

    End With

    Dim i As Long
    Const mylen As Long = 22
    Dim InContactCount As Long
    Dim wd() As String
    InContactCount = 2

    For Each day In days

        ReDim wd(mylen)

        For i = 1 To mylen
            wd(i) = Mid(day, i, 1)
            Cells(InContactCount, i + 3) = wd(i)
        Next i
        InContactCount = InContactCount + 1

    Next day

    Dim lRow As Long
    Dim j As Long

    lRow = Cells(Rows.Count, 1).End(xlUp).Row

    For j = lRow To 2 Step -1
        Select Case Cells(j, 3).Value
        Case "日曜日"
            Cells(j, 3).EntireRow.Delete
        Case "土曜日"
            Cells(j, 3).EntireRow.Delete
        End Select
    Next j
    Application.ScreenUpdating = True

    Exit Sub

ErrorHandler:

 MsgBox "Cannot access the information. "

End Sub

Daysのところや、月、日、曜日のところなども、もっとすっきりさせたいのですが力及ばず…。
土日はカットしたいのですが、祝日は込みで構いません。
欲を言えばマクロで計算して結果だけ書き出せれば最高ですが、現在の01を書き出したシートを使って結果を別シートに書き込むのでも大丈夫です。
スクリーンリーダーで読ませてわかりやすい形にしたいので、視覚的な解決法は使えません。

うまく説明できているかわかりませんが、皆様のお知恵を貸していただけましたら大変ありがたく存じます。どうぞよろしくお願いいたします。

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


 一から考えるのはしんどいので、

 >    myFBInfo = myRecipient.FreeBusy(Date, 30, False)
 >    myFBInfo2 = myRecipient.FreeBusy(DateAdd("d", 29, Date), 30, False)
     ↑
    そこで取得できた2つの文字列のサンプルを掲示して貰えませんか?
    (当方は、そこからどうすればいいか考えますが・・)

(半平太) 2022/06/27(月) 16:53


目指す形式がわかりやすいかどうか議論があるところでしょう。

しかし、どうしてもそうしたテキストにしたいというのであれば、変換するよりないですね。
・1を消去したうえで、
・一行ごとに、SpecialCellsで定数が入っているセル範囲を取得し、
・その各Areaごとに、開始時刻、終了時刻(Areaの最後のセルの時刻+30分後)を取り出す
ことでできると思います。

(γ) 2022/06/27(月) 17:01


雑なやつを置いていきます。
FreeBusyStringに0と1の羅列を入れると、「時刻end時刻」の文字列に変えます。

 Function Sample(FreebusyString As String) As String
    Const T_BEGIN As Date = "8:00"
    Const T_UNIT  As Date = "0:30"
    Dim str1 As String
    Dim str2 As String
    Dim i As Long

    For i = 1 To Len(FreebusyString)
        If Mid(FreebusyString, i, 1) = 0 Then
            If str1 = "" Then
                str1 = Format(T_BEGIN + T_UNIT * (i - 1), "h:mm") & "end"
            End If
        Else
            If str1 <> "" Then
                str2 = str2 & str1 & Format(T_BEGIN + T_UNIT * (i - 1), "h:mm") & " "
                str1 = ""
            End If
        End If
    Next i
    If str1 <> "" Then
        str2 = str2 & str1 & Format(T_BEGIN + T_UNIT * (i - 1), "h:mm")
    End If
    Sample = str2
 End Function
(作業員) 2022/06/27(月) 18:52

 問い合わせに対する回答がないのですが、とりあえず回答しておきます。
 よくチェックしていないので、ミスがあるかもしれません。
 バックアップを取って確認してみて下さい。

 追加したのは、
      Call 空き時間帯の抽出         '  ■追加部分
 のプロシージャです。
 その他の部分も、ループを使って手を入れてみました。

 なお、空き情報だけが必要なので、
 1の時は書き込まないように変更していますので、注意してください。

 ===========  ここから

 Dim wsSheet As Worksheet

 Public Sub GetFreeBusyInfo()
     Const mylen As Long = 22

     Dim olApp As Outlook.Application
     Dim myNameSpace As Outlook.Namespace
     Dim myRecipient As Outlook.Recipient
     Dim myFBInfo As String
     Dim myFBInfo2 As String
     Dim day As Variant
     Dim k As Long
     Dim d As Date
     Dim d1 As Long
     Dim d2 As Long
     Dim i As Long
     Dim r As Long
     Dim s As String

     Set wsSheet = ThisWorkbook.Worksheets("freebusy") 

     Set olApp = New Outlook.Application
     Set myNameSpace = olApp.GetNamespace("MAPI")
     Set myRecipient = myNameSpace.CreateRecipient("sample@example.com")
     On Error GoTo ErrorHandler

     myFBInfo = myRecipient.FreeBusy(Date, 30, False)
     myFBInfo2 = myRecipient.FreeBusy(DateAdd("d", 29, Date), 30, False)

     d1 = Len(myFBInfo) / 48
     d2 = Len(myFBInfo2) / 48

     ReDim days(1 To d1+d2) As Variant

     'それぞれの日の空き情報文字列(11時間分)    
     For k = 1 To d1
         days(k) = Mid(myFBInfo, 48 * (k - 1) + 17, 22)
     Next
     For k = d1 + 1 To d1 + d2
         days(k) = Mid(myFBInfo, 48 * (k - d1 - 1) + 17, 22)
     Next

     Application.ScreenUpdating = False

     With wsSheet
         .Range("A2").CurrentRegion.Clear

         '時刻見出しの作成
         For k = 1 To 23
             .Cells(1, k + 3).Value = Format(TimeSerial(8, 0, 0) + (k - 1) * TimeSerial(0, 30, 0), "h:mm")
         Next

         '日付見出しの作成
         For k = 1 To d1 + d2
             d = DateAdd("d", (k - 1), Date)
             .Cells(k + 1, 1).Value = Format(d, "m月")
             .Cells(k + 1, 2).Value = Format(d, "d日")
             .Cells(k + 1, 3).Value = Format(d, "aaaa")
         Next

         '空き:0の時だけ、各セルに書き込む
         r = 2
         For Each day In days
             For i = 1 To mylen
                 s = Mid(day, i, 1)
                 If s = "0" Then
                     .Cells(r, i + 3) = s
                 End If
             Next i
             r = r + 1
         Next

         '土日のデータを削除
         Dim lRow As Long
         Dim j As Long
         lRow = .Cells(Rows.Count, 1).End(xlUp).Row
         For j = lRow To 2 Step -1
             Select Case .Cells(j, 3).Value
                 Case "日曜日", "土曜日"
                     .Cells(j, 3).EntireRow.Delete
             End Select
         Next

     End With

     Call 空き時間帯の抽出         '  ■追加部分

     Application.ScreenUpdating = True
     Exit Sub
 ErrorHandler:
     MsgBox "Cannot access the information. "
 End Sub

 Function 空き時間帯の抽出()
     Dim lastRow As Long, lastCol As Long
     Dim rng As Range
     Dim r   As Range
     Dim ar  As Range
     Dim pos As Long
     Dim k   As Long

     With wsSheet
         lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
         lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column

         '書き込み先の書式を設定
         .Cells(2, 27).Resize(50, 10 * 2).NumberFormatLocal = "h:mm"

         '空き時間帯の見出し(最大10個とした。要調整)
         For k = 1 To 10
             .Cells(1, 27).Offset(, 2 * (k - 1)) = "空き" & k
         Next

         '空き時間の開始時刻と終了時刻を書き込み
         Set rng = .Range("D2", .Cells(lastRow, lastCol - 1))
         For Each r In rng.Rows
             pos = 27
             For Each ar In r.SpecialCells(xlCellTypeConstants).Areas
                 .Cells(r.Row, pos) = .Cells(1, ar(1).Column).Value
                 .Cells(r.Row, pos + 1) = .Cells(1, ar(ar.Count).Column + 1).Value
                 pos = pos + 2
             Next
         Next
     End With
 End Function

 ===========  ここまで

(γ) 2022/06/27(月) 21:16


皆様いろいろと考えていただき、ありがとうございます。
それぞれ試させていただいてから、またお返事させていただきます。

〉半平太様
1日分(8:00-19:00)を切り出したものの2日分です。
MyFBInfoとMyFBInfo2は対象の日付が違うだけ(当日から28日分と29日後から28日分)なので、これでよろしいでしょうか?

0010011111011111110000
0011111111000111000000

よろしくお願いいたします。
(estariol) 2022/06/28(火) 08:31


昨日のサンプルの続きをつくってみました。
いろいろテキトーなところはゆるしてください。

 Sub Sample2()
    Dim myWb As Workbook
    Dim myWs As Worksheet

    Dim myFreeBusy() As String
    Dim myVar1() As String
    Dim myVar2() As Variant

    Dim myDate As Date
    Dim myDaysCount As Long
    Dim iDate As Date
    Dim i As Long, j As Long, k As Long

    Set myWb = ThisWorkbook
    Set myWs = myWb.Worksheets("freebusy")

    myDate = Date
    myDaysCount = 57
    On Error GoTo ErrorHandler
    myFreeBusy = GetFreebusy01("sample@example.com", "8:00", "19:00", myDaysCount)

    ReDim myVar1(1 To 3, 1 To myDaysCount)
    ReDim myVar2(1 To myDaysCount)

    For i = LBound(myVar1, 2) To UBound(myVar1, 2)
        iDate = DateAdd("d", i - LBound(myVar1, 2), myDate)
        If Weekday(iDate, vbSaturday) > 2 Then
            j = j + 1
            myVar1(1, j) = Format(iDate, "m月")
            myVar1(2, j) = Format(iDate, "d日")
            myVar1(3, j) = Format(iDate, "aaaa")
            myVar2(j) = Split(Sample(myFreeBusy(i)))
        End If
    Next

    ReDim Preserve myVar1(1 To 3, 1 To j)
    ReDim Preserve myVar2(1 To j)

    With myWs
        .Activate
        With .Cells(1, 1)
            Application.ScreenUpdating = False
            .CurrentRegion.ClearContents
            .Resize(UBound(myVar1, 2), UBound(myVar1, 1)).Value = Application.Transpose(myVar1)
            For k = LBound(myVar2) To UBound(myVar2)
                .Resize(, UBound(myVar2(k)) + 1).Offset(k - 1, UBound(myVar1, 1)).Value = myVar2(k)
            Next
            Application.ScreenUpdating = True
        End With
    End With
    Exit Sub
 ErrorHandler:
    MsgBox "Cannot access the information. "
 End Sub

 Function GetFreebusy01(MailAddress As String, BeginTime As String, EndTime As String, DaysCount As Long) As String()

    Dim olApp As Outlook.Application
    Dim myNameSpace As Outlook.Namespace
    Dim myRecipient As Outlook.Recipient

    Dim myFBInfo As String
    Dim myVar() As String
    Dim Bt As Long
    Dim Et As Long
    Dim i As Long

    Set olApp = New Outlook.Application
    Set myNameSpace = olApp.GetNamespace("MAPI")
    Set myRecipient = myNameSpace.CreateRecipient(MailAddress)
    ReDim myVar(1 To DaysCount)

    Bt = TimeValue(BeginTime) * 48 + 1
    Et = (TimeValue(EndTime) - TimeValue(BeginTime)) * 48

    For i = LBound(myVar) To UBound(myVar)
        myFBInfo = myRecipient.FreeBusy(DateAdd("d", i - LBound(myVar), Date), 1, False)
        myVar(i) = Mid(myFBInfo, Bt, Et)
    Next

    GetFreebusy01 = myVar
 End Function

(作業員) 2022/06/28(火) 11:15


Υ様 作業員様

お二人のご提案をそれぞれ試させていただいたところ、どちらもうまく行きました!
比較することで自分の間違いも見つけることができ、大変勉強になりました。
初めて使う機能も多いので、よく理解して使わせていただきたいと思います。
本当にありがとうございました。

半平太様もお気にかけていただき、ありがとうございます!
(estariol) 2022/06/28(火) 13:42


すみません、終日の予定が入っている時に"BUSY"と入れるには、Function SampleのFor文にElse Ifで追加すればよいでしょうか?
(estariol) 2022/06/28(火) 14:16

 Function Sample(FreebusyString As String, BeginTime As String, UnitTime As String) As String()
    Dim T_Begin As Date
    Dim T_Unit  As Date
    Dim var() As String
    Dim i As Long, bt As Long, et As Long

    ReDim var(0): var(0) = "BUSY"
    T_Begin = TimeValue(BeginTime)
    T_Unit = TimeValue(UnitTime)

    Do
        bt = InStr(et + 1, FreebusyString, "0")
        If bt = 0 Then Exit Do
        et = InStr(bt + 1, FreebusyString, "1")
        If et = 0 Then et = Len(FreebusyString) + 1
        ReDim Preserve var(i)
        var(i) = Format(T_Begin + (bt - 1) * T_Unit, "h:mm") & "end" & _
                 Format(T_Begin + (et - 1) * T_Unit, "h:mm")
        i = i + 1
    Loop

    Sample = var

 End Function

Sampleを根本的に見直しました。

Sample2のここはこう直してください。

 myVar2(j) = Sample(myFreeBusy(i),"8:00","0:30")

(作業員) 2022/06/28(火) 14:30


作業員様

できました!追加の質問にまで答えてくださり、本当に助かりました。
ありがとうございます。

(estariol) 2022/06/28(火) 15:45


すみません、もう一つ知りたいことができてしまいました。
myRecipientをメールアドレスで指定するのではなく、そのPCでMicrosoft365にログインしているCurrentUserにすることはできますか?
(estariol) 2022/06/28(火) 20:23

コメント返信:

[ 一覧(最新更新順) ]


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