0

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

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

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

尝试了以下 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
4

1 回答 1

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

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

于 2013-03-26T06:18:58.187 回答