0

自動化する必要がある単純なタスクがあります。

トリガーに基づいて、別のアプリケーションから特定の形式の電子メールを受け取ります。

私が欲しいのは、out lookがそのメールのデータを「読み取り」、2つのセルを比較することです。1 つのセルが他のセルよりも大きい場合は、指定したアドレスにメールを転送する必要があります。それ以外の場合はメールを削除します。

次の 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 に答える