自动化平凡的任务

时间:2013-03-18 23:02:35

标签: vba outlook outlook-vba

我有一个简单的任务,我需要自动化。

我根据触发器从另一个应用程序收到一个非常特定格式的电子邮件。

我想要的是外观“读取”该电子邮件中的数据并比较两个单元格。如果一个单元格大于另一个单元格,那么我希望将电子邮件转发到指定的地址,否则删除该电子邮件。

尝试了下面的vba代码,但是给出了运行时错误。请指导

Sub GetLines()

Dim msg As Outlook.mailItem
Dim rows As Variant
Dim numberofColumns As Long
Dim numberofRows As Long
Dim headerValues As Variant
Dim headerRow() As String
Dim data() As String
Dim i As Long, j As Long

' get currently selected email
Set msg = ActiveExplorer.Selection.item(1)

' tokenize each line of the email
rows = Split(msg.Body, vbCrLf)

' calculate array size
numberofColumns = Len(rows(0)) - Len(Replace(rows(0), Chr(9), ""))
numberofRows = UBound(rows) + 1

' put header row into array
ReDim headerRow(1 To numberofColumns)
headerValues = Split(rows(0), Chr(9))

For i = 1 To numberofColumns
  headerRow(i) = Trim$(headerValues(i - 1))
Next i

' calculate data array size
numberofRows = numberofRows - 1

' put data into array
ReDim data(1 To numberofRows, 1 To numberofColumns)

  For i = 1 To numberofRows
    For j = 1 To numberofColumns
      data(i, j) = Trim$(Split(rows(i), Chr(9))(j - 1))
    Next j
  Next i

End Sub

1 个答案:

答案 0 :(得分:0)

您的代码对数据做了太多不必要的假设,并且在大多数情况下都会出错。首先,您需要使用F8逐步执行代码以隔离特定行中的错误。

我建议你改变

Dim data() As String

Dim data As Variant
data = Array()

我不是VBA如何管理记忆的专家,但我知道当我制作变种时,我的悲伤就会少得多。

您最有可能遇到问题:

  For i = 1 To numberofRows
    For j = 1 To numberofColumns
      data(i, j) = Trim$(Split(rows(i), Chr(9))(j - 1))
    Next j
  Next i

如果不是每一行都完美形成了怎么办?

相反,试试这个:

  For i = 1 To numberofRows
    For j = 1 To Ubound(Split(rows(i), Chr(9))) + 1
      data(i, j) = Trim$(Split(rows(i), Chr(9))(j - 1))
    Next j
  Next i

这允许您的代码“存活”空白行或数据中的其他错误。