【问题标题】:VBA macro called in Outlook not sorting in Excel在 Outlook 中调用的 VBA 宏未在 Excel 中排序
【发布时间】:2012-08-23 18:17:33
【问题描述】:

所以基本上我有一个名为 xlobj 的 excel 对象,如果我指的是 xlobj,我会在这段代码之前的代码中说

xlobj.Range(blahh blahh blahh).Value = "something"

现在我的目标是在 Excel 中将我使用脚本的其余部分获取的所有值从最新到最旧排序。我使用 excel 中的记录宏功能来获取宏代码,然后将其粘贴到我的 Outlook VBA 中,并将 xlobj._ 附加到所有必要的代码行前面。

它不起作用,除了物理排序(选择发生并且代码正在编译)之外,它什么都做

xlobj.Range("A2:E900").Select
xlobj.Sort.SortFields.Clear
xlobj.Sort.SortFields.Add Key:=xlobj.Range("A1"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With xlobj.Sort
  .SetRange xlobj.Range("A2:E900")
  .Header = xlNo
  .MatchCase = False
  .Orientation = xlTopToBottom
  .SortMethod = xlPinYin
  .Apply
End With

有人发现代码有问题吗?

编辑

Private Sub Extract(ByVal oFolder As Outlook.Folder)

On Error Resume Next
Set myOlApp = Outlook.Application
Set mynamespace = myOlApp.GetNamespace("mapi")
Set MyFolder = oFolder

Set xlobj = CreateObject("excel.application.14")
Set xlobjWbk = xlobj.Workbooks.Open("c:\Users\(username)\Desktop\(filename).xlsx")
xlobj.Visible = True
xlobj.Application.DisplayAlerts = False

'Set Heading
xlobj.Range("a" & 1).Value = "Recieved Time"
xlobj.Range("b" & 1).Value = "Sender Email"
xlobj.Range("c" & 1).Value = "Subject"
xlobj.Range("d" & 1).Value = "Sender Name"
xlobj.Range("e" & 1).Value = "Body"
 xlobj.Columns("A").ColumnWidth = 17
 xlobj.Columns("B").ColumnWidth = 32
 xlobj.Columns("C").ColumnWidth = 36
 xlobj.Columns("D").ColumnWidth = 19
 xlobj.Columns("E").ColumnWidth = 56

For i = MyFolder.Items.Count To MyFolder.Items.Count + 100
 xlobj.Range("a" & i + 1).Value = ""
 xlobj.Range("b" & i + 1).Value = ""
 xlobj.Range("C" & i + 1).Value = ""
 xlobj.Range("d" & i + 1).Value = ""
 xlobj.Range("e" & i + 1).Value = ""
Next

For i = 1 To MyFolder.Items.Count
 Set myItem = MyFolder.Items(i)
 msgtext = myItem.body

 xlobj.Range("a" & i + 1).Value = myItem.ReceivedTime
 xlobj.Range("b" & i + 1).Value = myItem.SenderEmailAddress
 xlobj.Range("C" & i + 1).Value = myItem.Subject
 xlobj.Range("d" & i + 1).Value = myItem.SenderName
 xlobj.Range("e" & i + 1).Value = msgtext
 xlobj.Columns("A:E").VerticalAlignment = xlVAlignTop
Next

xlobj.Range("A2:E900").Select
xlobj.Sort.SortFields.Clear
xlobj.Sort.SortFields.Add Key:=xlobj.Range("A1"), SortOn:=xlSortOnValues,     Order:=xlDescending, DataOption:=xlSortNormal
With xlobj.Sort
    .SetRange xlobj.Range("A1:E900")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

这个脚本到通过参数传入的文件夹,然后将收件箱转储到excel表格中

【问题讨论】:

  • 我可以问一下你有什么代码之前这个块?我想知道 xlobj 是否设置为 Excel 的正确实例/其中的正确工作表。我可能是错的(为什么我想看更多代码),但看起来你应该有更像xlobj.Sheets(1).Range(blahh blahh blahh)

标签: excel vba outlook tablesorter


【解决方案1】:
With xlobj.Sort
    .SetRange xlobj.Range("A1:E900") '<---
    .Header = xlYes                  '<---
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

【讨论】:

  • 这并没有改变任何东西。 .SetRange 应该是 A2,因为 A1 的行是标题。我不想对标题进行排序,我想对每个标题下方列中的数据(日期)进行排序
  • 将 .Header 设置为 xlYes 告诉 Excel 你有一个标题行,所以它不会对其进行排序。
【解决方案2】:

更改为 xlobj.Sort.SortFields.Add Key:=xlobj.Range("A2"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多