2011-11-07 23 views
0

我寫代碼來處理傳入電子郵件的陣列。大多數方面工作正常;然而,處理日期給了我一些麻煩。我在Module1中定義的EvaluateDate函數無法正常工作。我運行它時沒有錯誤,只是沒有輸出。 Tabl是一個子串的數組。傳入的電子郵件按行分割爲子字符串。所以,基本上數組的每個索引都是來自電子郵件的一行。我正在尋找一個特定的月份,然後爲1月分配「01 /」等等。傳入的電子郵件是這樣的「2011年10月20日星期四」,並希望被處理爲「10/20/11」。一切都是字符串類型。任何幫助將不勝感激。讓我知道是否需要更多的其他代碼來確定問題的根源。謝謝。搜索串用於特定字符串(VBA)

在表1級的代碼,

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 

在模塊1,

'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變量聲明爲Variant,這實際上是正確的,但你認爲它是一個字符串。

Dim Tabl, str As String 

這實際上意味着:

Dim Tabl As Variant, str As String 

您可以共享Dim語句,但不是一個聲明。

另外請注意,你還沒有宣佈按鈕代碼「mybody」或「M」。

3)當你的代碼輸入相應的if語句,發現在該月的名稱匹配,你應該退出循環。我想重寫for循環EvaluateDate這樣的:

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)您有這行代碼:

Dim olApp As New Outlook.Application 

這將導致自動實例化(見http://www.cpearson.com/excel/classes.aspx爲什麼這是不好的) 。只需聲明變量,因爲您已在代碼中稍後創建它。

5)在您的按鈕代碼,你遍歷郵件的每一行,但你再次通過整個郵件到EvaluateDate功能和環通每行。所以如果我的數學是正確的,當你只需要循環n次時,通過電子郵件循環n * n次。那真的是你想要的嗎?

+0

1)當我從我的表中的代碼中調用它以使EvaluateDate = m時,您是否在說我? 2)Tabl被聲明爲字符串。 VBA是否允許您通過其索引以及數組訪問字符串?我有可變的decs,但沒有包含它們。我應該使用變體嗎? 3)我認爲第一個索引是0.它現在改變了,但還沒有解決問題。 4)它不應該。將m分配給相應的編號月份後,是否有辦法突破If語句? 我對VBA沒有經驗,因爲你可以看到,但需要爲我的工作學習。提前致謝。 – SCar88

+0

請發佈一個如何填充Tabl變量的示例,包括示例輸入和電子郵件的來源(Outlook?) – JimmyPena

+0

我已使用更新的代碼編輯了我的問題。好消息是我現在正在獲得輸出。壞消息是這是不正確的。是的,我正在使用Outlook。我無法向您發送我正在與之合作的電子郵件,但我可以創建一個滿足此目的的電子郵件。你的電子郵箱是什麼? – SCar88