[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
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
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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.