2011-11-07 50 views
0

受信メールを処理するコードを記述しています。ほとんどの側面は正しく動作しています。しかし、日付の処理は私にいくつかの問題を与えている。 Module1で定義したEvaluateDate関数が正しく動作していません。私はそれを実行するときにエラーはありません、ただ出力はありません。 Tablは部分文字列の配列です。着信電子メールは、行ごとに部分文字列に分割されます。したがって、基本的に配列の各インデックスは電子メールの行です。私は特定の月を検索し、1月などに "01 /"を割り当てようとしています。着信電子メールは「2011年10月20日木曜日」のようなもので、「10/20/11」に処理されたい。すべてがString型です。どんな助けでも大歓迎です。問題の原因を特定するために他のコードが必要な場合はお知らせください。ありがとう。シート1つのコードで特定の文字列(VBA)の部分文字列の検索

、Module1ので

Public Sub CommandButton1_Click() 

Dim olApp As New Outlook.Application 
Dim olExp As Outlook.Explorer 
Dim olSel As Outlook.Selection 
Dim myArray(8) As String 
Dim Line As Long, Addr1 As String 
Dim Tabl, str As String 
Dim index As Integer 
Dim I As Integer, x As Integer, N As Integer, j As Integer 

Sheets("EditData").Select 
Columns("D:D").NumberFormat = "@" 
'Selection.NumberFormat = "@" 

On Error Resume Next 
' Getting the messages selection 
Set olApp = Outlook.Application 
Set olExp = olApp.ActiveExplorer 
Set olSel = olExp.Selection 
' Checking if there is at least one message selected 
If olSel.Count < 1 Then 
    MsgBox "No message selected", vbExclamation, "Error" 
    Exit Sub 
End If 
With Sheets("EditData") 
    ' Retrieving the first avaible row to put message in 
    Line = .Range("D65000").End(xlUp).Row + 1 
    ' looping through message 
    For x = 1 To olSel.Count 
     DoEvents 
     Erase myArray 
     mybody = Replace(olSel.Item(x).body, Chr(13), "") 

     ' Splitting the message body into an array of substrings, 
     ' using the "line feed" characters as separators 
     mybody = Replace(mybody, Chr(10) & Chr(10), Chr(10)) 
     Tabl = Split(mybody, Chr(10)) 
     For Each Item In Tabl 
      Item = Replace(Item, Chr(10), "") 
      Item = Application.Clean(Item) 
     Next Item 

     ' Looping through these substrings 
     For I = 0 To UBound(Tabl) 

      ' Date Received Start 
      If LCase(Left(Tabl(I), 4)) = "sent" Then 
       m = Module1.EvaluateDate(Tabl) 
       .Cells(Line, 2) = m 
      End If 
     Next I 
    Next X 
    End With 
End Sub 

'Function to determine the month, day, and year in this format mm/dd/yy 
    Public Function EvaluateDate(Tabl As Variant) As Variant 
    For I = 0 To UBound(Tabl) 
     If InStr(1, Tabl(I), "January", 1) > 0 Then 
      m = "01/" 
     End If 
     If InStr(1, Tabl(I), "February", 1) > 0 Then 
      m = "02/" 
     End If 
     If InStr(1, Tabl(I), "March", 1) > 0 Then 
      m = "03/" 
     End If 
     If InStr(1, Tabl(I), "April", 1) > 0 Then 
      m = "04/" 
     End If 
     If InStr(1, Tabl(I), "May", 1) > 0 Then 
      m = "05/" 
     End If 
     If InStr(1, Tabl(I), "June", 1) > 0 Then 
      m = "06/" 
     End If 
     If InStr(1, Tabl(I), "July", 1) > 0 Then 
      m = "07/" 
     End If 
     If InStr(1, Tabl(I), "August", 1) > 0 Then 
      m = "08/" 
     End If 
     If InStr(1, Tabl(I), "September", 1) > 0 Then 
      m = "09/" 
     End If 
     If InStr(1, Tabl(I), "October", 1) > 0 Then 
      m = "10/" 
     End If 
     If InStr(1, Tabl(I), "November", 1) > 0 Then 
      m = "11/" 
     End If 
     If InStr(1, Tabl(I), "December", 1) > 0 Then 
      m = "12/" 
     End If 
    Next I 
    EvaluateDate = m 
End Function 
+1

コードを適切な書式で修正してください。 – Polynomial

+0

vb6、vba、vbscript、またはvb.net? –

答えて

0

いくつかのこと:

1)VBA機能では、あなたが使用して戻り値を割り当てる必要があります関数の名前。

EvaluateDate = m 

はまた、EvaluateDateの戻り値は文字列を指定できます:あなたのコードでは、このような何かが欠けている

Public Function EvaluateDate(Tabl As Variant) As String 

2)あなたのTABL変数が実際正しいバリアントとして宣言されていますが、あなたはそれが文字列だと思います。

Dim Tabl, str As String 

これは実際には意味:

Dim Tabl As Variant, str As String 

あなたは薄暗い文ではなく宣言を共有することができます。

ボタンコードに「mybody」または「m」を宣言していないことにも注意してください。

3)あなたのコードが適切なIf文を入力し、月名に一致するものが見つかると、ループを終了する必要があります。あなたのコード内でこの行を持っている)

For i = 0 To UBound(Tabl) 
    Select Case True 
    Case InStr(1, Tabl(i), "January", 1) > 0 
     m = "01/" 
    Case InStr(1, Tabl(i), "February", 1) > 0 
     m = "02/" 
    Case InStr(1, Tabl(i), "March", 1) > 0 
     m = "03/" 
    Case InStr(1, Tabl(i), "April", 1) > 0 
     m = "04/" 
    Case InStr(1, Tabl(i), "May", 1) > 0 
     m = "05/" 
    Case InStr(1, Tabl(i), "June", 1) > 0 
     m = "06/" 
    Case InStr(1, Tabl(i), "July", 1) > 0 
     m = "07/" 
    Case InStr(1, Tabl(i), "August", 1) > 0 
     m = "08/" 
    Case InStr(1, Tabl(i), "September", 1) > 0 
     m = "09/" 
    Case InStr(1, Tabl(i), "October", 1) > 0 
     m = "10/" 
    Case InStr(1, Tabl(i), "November", 1) > 0 
     m = "11/" 
    Case InStr(1, Tabl(i), "December", 1) > 0 
     m = "12/" 
    End Select 
    Next i 

4:私はこのようなEvaluateDateのループのために書き直します

Dim olApp As New Outlook.Application 

これは、自動インスタンス化の原因となります(これは悪いですなぜのためhttp://www.cpearson.com/excel/classes.aspxを参照してください) 。変数の宣言は、コードの後半ですでに作成しているためです。

5)ボタンコードでは、電子メールの各行をループしますが、電子メール全体をEvaluateDate関数に渡して、すべての行を再度ループします。だから私の数学が正しければ、あなたはn回だけループする必要があるときに電子メールでn * n回ループします。それは本当にあなたが望むものですか?

+0

1)私のシートのコードからEvaluateDate = mを呼び出すと、あなたは私のことを言っていますか? 2)TablはStringとして宣言されています。 VBAはインデックスだけでなく配列によってもStringにアクセスできますか?私は変数decsを持っていますが、それらを含んでいませんでした。私はバリアントを使用すべきですか? 3)最初のインデックスが0であると考えました。今変更されていますが、問題は解決していません。 4)そうではありません。対応する番号付き月にmを代入した後にIf文から抜け出す方法はありますか? 私はあなたが見ることができるようにVBAに慣れていませんが、私の仕事のために学ぶ必要があります。前もって感謝します。 – SCar88

+0

サンプル入力とメールの送信元(Outlook?)を含むTabl変数の設定例を投稿してください – JimmyPena

+0

質問を編集したコードを更新しました。良いニュースは、私は今すぐ出力を取得しています。悪いニュースはそれが間違っているということです。はい、私はOutlookを使用しています。私は私が働いている電子メールをあなたに送ることはできませんが、私はこの目的のために十分であるものを作ることができます。あなたのメールアドレスは? – SCar88

関連する問題