首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Outlook日历导出到Excel以将该工作表用作数据以填充另一个

将Outlook日历导出到Excel以将该工作表用作数据以填充另一个
EN

Stack Overflow用户
提问于 2017-01-04 20:43:22
回答 1查看 2.3K关注 0票数 1

背景:我们有一个每周一次的会议,我们都坐在那里,摆出我们的时间表,然后手工地把它们输入到excel主表中。这是不方便、费时和低效的。我们想要使这一过程自动化。

我们需要的: Outlook日历(总计7) ->主Excel表->成员日程表

Outlook需求:

  1. 我们需要所有的7个展望日历进入一个单一的excel表格。我们希望在周五每周发生一次。
  2. excel工作表需要为所有者、类别、主题、开始日期、结束日期、与会者设置变量(这已经在下面的代码中了)
  3. 下面的代码需要编辑到自动而不是手动的地方。目前,我们必须手动选择代码从日历上提取的日期。我们希望这是一个每周五晚上进行的自动化进程。
  4. 此外,我们有一个分类系统,可以说文件是否是机密的。这导致代码在试图保存时出现问题,因为它无法告诉程序该做什么。这是一个很小的问题,我们可能会解决,但如果能让它自动化也会很好。

主excel表需要:

  1. 这7个日历需要导入到这张表中。
  2. 上面提到的变量应该是列。
  3. 下面的代码做得很好,但是正如前面提到的,我们需要它被自动化。

成员计划表格:

  1. 此excel工作表有按日期和月份列出的成员列表。示例:

  1. 我们需要根据母版excel工作表的标准填写此excel工作表。 a.例如:如果Person1计划在2017年10月04/10到10/10/2017休假,我们需要在excel表格中为该人填写相应的“V”号。
  2. 表格所需满足的标准是: a.两张表上的事件匹配日期 日历所有者与人匹配(这必须由关键字…搜索。)示例:第一,成员计划中的最后一个Excel工作表将在主excel工作表上显示为“first.last@email.com\calendar”。) 寻找特定的关键词(例如。“假期”、“桃花源”等…我们将在主表主题框列中设置这些),以确定所添加的特定日期和人员是否为休假日、个人日、半天假期等。此命令应使用适当的符号填写该工作表,以指示它是哪种类型的日期。 d.如果一个事件包含2个或2个以上的人员,则该列应为黄色,“重大事件/会议”中填充事件的名称
  3. 标准需要返回与正确的人、日期和事件对应的正确代码。
  4. 如果一个事件超过一天,主excel将只有开始日期和结束日期,我们将需要所有的日子之间用正确的符号突出显示。

到目前为止,我制定的代码是:

代码语言:javascript
复制
=IF(AND(ISNUMBER(SEARCH("dakota.mccarty",[Macros.xlsx]Sheet1!$A:$A)),(K$3=[Macros.xlsx]Sheet1!$D:$D),(COUNTIF( [Macros.xlsx]Sheet1!$C:$C, "**vacation**"))), $B$15, "0")

这将搜索主题中的休假并返回“V”

如你所见,它只做了一件事.

这是将Outlook中的日历导入Excel的代码:它可以工作,但不是自动化的。

代码语言:javascript
复制
  Sub ExportAppointmentsToExcel()
    'On the next line, the list of calendars you want to export.  Each entry is the path to a calendar.  Entries are separated by a comma.
    Const CAL_LIST = "user1\Calendar, user2\Calendar, user3\Calendar , etc"
    'On the next line, edit the path to and name of the Excel spreadsheet to export to
    Const EXCEL_FILE = "c:\users\415085\desktop\Macros\Macros.xlsx"
    Const SCRIPT_NAME = "Export Appointments to Excel (Rev 2)"
    Const xlAscending = 1
    Const xlYes = 1
    Dim olkFld As Object, _
        olkLst As Object, _
        olkRes As Object, _
        olkApt As Object, _
        olkRec As Object, _
        excApp As Object, _
        excWkb As Object, _
        excWks As Object, _
        lngRow As Long, _
        lngCnt As Long, _
        strFil As String, _
        strLst As String, _
        strDat As String, _
        datBeg As Date, _
        datEnd As Date, _
        arrTmp As Variant, _
        arrCal As Variant, _
        varCal As Variant
    strDat = InputBox("Enter the date range of the appointments to export in the form ""mm/dd/yyyy to mm/dd/yyyy""", SCRIPT_NAME, Date & " to " & Date)
    arrTmp = Split(strDat, "to")
    datBeg = IIf(IsDate(arrTmp(0)), arrTmp(0), Date) & " 12:00am"
    datEnd = IIf(IsDate(arrTmp(1)), arrTmp(1), Date) & " 11:59pm"
    Set excApp = CreateObject("Excel.Application")
    Set excWkb = excApp.Workbooks.Add()
    Set excWks = excWkb.Worksheets(1)
    'Write Excel Column Headers
    With excWks
        .Cells(1, 1) = "Calendar"
        .Cells(1, 2) = "Category"
        .Cells(1, 3) = "Subject"
        .Cells(1, 4) = "Starting Date"
        .Cells(1, 5) = "Ending Date”
        .Cells(1, 6) = "Attendees"
    End With
    lngRow = 2
    arrCal = Split(CAL_LIST, ",")
    For Each varCal In arrCal
        Set olkFld = OpenOutlookFolder(CStr(varCal))
        If TypeName(olkFld) <> "Nothing" Then
            If olkFld.DefaultItemType = olAppointmentItem Then
                Set olkLst = olkFld.Items
                olkLst.Sort "[Start]"
                olkLst.IncludeRecurrences = True
                Set olkRes = olkLst.Restrict("[Start] >= '" & Format(datBeg, "ddddd h:nn AMPM") & "' AND [Start] <= '" & Format(datEnd, "ddddd h:nn AMPM") & "'")
                'Write appointments to spreadsheet
                For Each olkApt In olkRes
                    'Only export appointments
                    If olkApt.Class = olAppointment Then
                        strLst = ""
                        For Each olkRec In olkApt.Recipients
                            strLst = strLst & olkRec.Name & ", "
                        Next
                        If strLst <> "" Then strLst = Left(strLst, Len(strLst) - 2)
                        'Add a row for each field in the message you want to export
                        excWks.Cells(lngRow, 1) = olkFld.FolderPath
                        excWks.Cells(lngRow, 2) = olkApt.Categories
                        excWks.Cells(lngRow, 3) = olkApt.Subject
                        excWks.Cells(lngRow, 4) = Format(olkApt.Start, "mm/dd/yyyy")
                        excWks.Cells(lngRow, 5) = Format(olkApt.End, "mm/dd/yyyy")
                        excWks.Cells(lngRow, 6) = strLst
                        lngRow = lngRow + 1
                        lngCnt = lngCnt + 1
                    End If
                Next
            Else
                MsgBox "Operation cancelled.  The selected folder is not a calendar.  You must select a calendar for this macro to work.", vbCritical + vbOKOnly, SCRIPT_NAME
            End If
        Else
            MsgBox "I could not find a folder named " & varCal & ".  Folder skipped.  I will continue processing the remaining folders.", vbExclamation + vbOKOnly, SCRIPT_NAME
        End If
    Next
    excWks.Columns("A:I").AutoFit
    excWks.Range("A1:I" & lngRow - 1).Sort Key1:="Category", Order1:=xlAscending, Header:=xlYes
    excWks.Cells(lngRow, 8) = "=sum(H2:H" & lngRow - 1 & ")"
    excWkb.SaveAs EXCEL_FILE
    excWkb.Close
    MsgBox "Process complete.  I exported a total of " & lngCnt & " appointments were exported.", vbInformation + vbOKOnly, SCRIPT_NAME
    Set excWks = Nothing
    Set excWkb = Nothing
    Set excApp = Nothing
    Set olkApt = Nothing
    Set olkLst = Nothing
    Set olkFld = Nothing
End Sub
Private Function OpenOutlookFolder(strFolderPath As String) As Outlook.MAPIFolder
    Dim arrFolders As Variant, _
        varFolder As Variant, _
        bolBeyondRoot As Boolean
    On Error Resume Next
    If strFolderPath = "" Then
        Set OpenOutlookFolder = Nothing
    Else
        Do While Left(strFolderPath, 1) = "\"
            strFolderPath = Right(strFolderPath, Len(strFolderPath) - 1)
        Loop
        arrFolders = Split(strFolderPath, "\")
        For Each varFolder In arrFolders
            Select Case bolBeyondRoot
                Case False
                    Set OpenOutlookFolder = Outlook.Session.Folders(varFolder)
                    bolBeyondRoot = True
                Case True
                    Set OpenOutlookFolder = OpenOutlookFolder.Folders(varFolder)
            End Select
            If Err.Number <> 0 Then
                Set OpenOutlookFolder = Nothing
                Exit For
            End If
        Next
    End If
    On Error GoTo 0
End Function

让我知道,如果你有任何其他问题或混淆,我是非常努力地与这个问题。

到目前为止我有这样的想法:

代码语言:javascript
复制
=IF(AND(ISNUMBER(SEARCH("dakota.mccarty",[Macros.xlsx]Sheet1!$A:$A)),(COUNTIF([Macros.xlsx]Sheet1!$D:$D,C3)),(COUNTIF([Macros.xlsx]Sheet1!$C:$C,"Personal"))),$B$15, "0")

我需要“个人”返回一个真正的匹配,只有当它匹配在下划线的COUNTIF中的日期(C3,是与宏表中的D列相匹配的日期)。我只是不知道怎么写。我尝试过一些事情,但一直失败。

我真的需要满足第一和第二逻辑,然后允许满足第三逻辑,以确定它是否正确。因此,第一逻辑和第二逻辑就像一个大过滤器,然后第三个逻辑(以及后面的其他逻辑)将是构成工作表的最终过滤器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 16:13:34

我想通了。

我所使用的过程是为了防止有类似问题的人:

我有一张excel单张,用的是:

代码语言:javascript
复制
=INDEX([CalendarExport.xlsx]Sheet1!$C:$C,MATCH("*first.last*"&C$3,[CalendarExport.xlsx]Sheet1!$A:$A&[nate.xlsx]Sheet1!$D:$D,0))

这会将Outlook导出的数据编入索引,以便只输入日历中有关同一人和日期的任何内容。CalendarExport.xlsx中的C:C列是所需的数据(个人、假期等)。

我只是为每个人制定了一个单独的公式。(别忘了cntl+shift+enter)

虽然这给了我所需要的数据,但它也给了我更多。例如,如果有人剪了头发,它就会在细胞里“剪”,与那个人和理发日期相对应。

为了弥补这个问题,我又做了一张滤纸。第二张用的是:

代码语言:javascript
复制
 =IF(COUNTIF(C5,"**vacation**"),"V",IF(COUNTIF(C5,"**personal**"),"P",IF(COUNTIF(C5,"**half day**"),"Hd","")))

这只是在将outlook导出编入索引的单元格中查找关键字,如果为true,则放置相应的代码。

这让我有了一张V,P,Hd的单张,没有其他信息。所以,我得到了我所需要的一切。

为了使数据自动转到日历表,我只是做了一个宏来复制它。我不希望主表上有一个公式来连接到这个较小的工作表,因为数据每周五都会更新和刷新,所以如果我使用公式查找单元格所需的文本,那么前一周的数据将被删除。

为了从过滤的日历表中复制数据并将其粘贴为文本(而不是公式)到主日历表中,我使用了以下内容:

代码语言:javascript
复制
   Sub UpdateCalendar()
'
'Update Calendar
'
'Jan to March
    Sheets("Calendar(Mechanics)").Activate
    ActiveSheet.Range("C16:BO23").Select
    Selection.Copy
    Sheets("2017").Select
    Range("B7").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

'April to June
    Sheets("Calendar(Mechanics)").Activate
    ActiveSheet.Range("BP16:EB23").Select
    Selection.Copy
    Sheets("2017").Select
    Range("B19").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

'July to September
    Sheets("Calendar(Mechanics)").Activate
    ActiveSheet.Range("EC16:GO23").Select
    Selection.Copy
    Sheets("2017").Select
    Range("B31").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

'October to December
    Sheets("Calendar(Mechanics)").Activate
    ActiveSheet.Range("GP16:JB23").Select
    Selection.Copy
    Sheets("2017").Select
    Range("B43").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False


End Sub

由于我的主日历的设置方式,我不得不复制和粘贴在四个单独的块。但是,对我来说没问题。

在主表上,我在顶部的角落放置了一个按钮,允许该页面运行宏,以便随时更新。

我仍然需要自动化的outlook导出,但不应该是非常困难的一些编码和谷歌。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41472889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档