Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 搜索特定字符串的子字符串数组(VBA)_Arrays_String_Vba_Date_Substring - Fatal编程技术网

Arrays 搜索特定字符串的子字符串数组(VBA)

Arrays 搜索特定字符串的子字符串数组(VBA),arrays,string,vba,date,substring,Arrays,String,Vba,Date,Substring,我正在编写代码来处理收到的电子邮件。大多数方面工作正常;然而,处理日期给我带来了一些麻烦。我在模块1中定义的EvaluateDate函数工作不正常。我运行它时没有错误,只是没有输出。Tabl是一个子字符串数组。传入的电子邮件按行拆分为子字符串。因此,基本上数组的每个索引都是电子邮件中的一行。我希望搜索特定月份,然后为一月分配“01/”,以此类推。收到的电子邮件为“2011年10月20日,星期四”,希望处理为“10/20/11”。一切都是字符串类型。任何帮助都将不胜感激。如果您需要更多其他代码来确

我正在编写代码来处理收到的电子邮件。大多数方面工作正常;然而,处理日期给我带来了一些麻烦。我在模块1中定义的EvaluateDate函数工作不正常。我运行它时没有错误,只是没有输出。Tabl是一个子字符串数组。传入的电子邮件按行拆分为子字符串。因此,基本上数组的每个索引都是电子邮件中的一行。我希望搜索特定月份,然后为一月分配“01/”,以此类推。收到的电子邮件为“2011年10月20日,星期四”,希望处理为“10/20/11”。一切都是字符串类型。任何帮助都将不胜感激。如果您需要更多其他代码来确定问题的根源,请告诉我。谢谢

在第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) 在VBA函数中,需要使用函数名指定返回值。您的代码缺少如下内容:

EvaluateDate = m
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
此外,EvaluateDate的返回值可以是字符串:

Public Function EvaluateDate(Tabl As Variant) As String
2) Tabl变量被声明为Variant,这实际上是正确的,但您认为它是一个字符串

Dim Tabl, str As String
这实际上意味着:

Dim Tabl As Variant, str As String
你可以分享一个模糊的声明,但不能分享一个声明

还要注意的是,您没有在按钮代码中声明“mybody”或“m”

3) 当您的代码输入适当的If语句并在月份名称上找到匹配项时,您应该退出循环。我会在EvaluateDate中重写For循环,如下所示:

EvaluateDate = m
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
这将导致自动实例化(请参见为什么这样做不好)。只需声明变量,因为您已经在稍后的代码中创建了它


5) 在按钮代码中,您循环浏览电子邮件的每一行,然后将整个电子邮件传递给EvaluateDate函数并再次循环浏览每一行。因此,如果我的数学是正确的,你在电子邮件中循环n*n次,而你只需要循环n次。这真的是您想要的吗?

请用适当的格式修复您的代码。vb6、vba、vbscript或vb.net?1)当我从工作表中的代码调用EvaluateDate=m时,您是在我的中说的吗?2) Tabl被声明为字符串。VBA是否允许您通过索引和数组访问字符串?我有变量DEC,但没有包括它们。我应该使用变体吗?3) 我以为第一个索引是0。现在改变了,但还没有解决问题。4) 不应该。在将m分配给相应的编号月份后,是否有办法中断If语句?正如你所看到的,我对VBA缺乏经验,但需要为我的工作学习。提前感谢。请发布一个示例,说明如何填充Tabl变量,包括示例输入和电子邮件的来源(Outlook?),我已经用更新的代码编辑了我的问题。好消息是我现在得到了输出。坏消息是它是不正确的。是的,我正在使用Outlook。我无法向您发送我正在使用的电子邮件,但我可以编写一封足以满足此目的的电子邮件。你的电子邮件是什么?谢谢!我会看看这个,并尽快发布一个答案,除非有人抢先告诉我!哇!只是花了太多的时间试图弄明白为什么每个月的产出都保持在“05/”的水平。可能是因为在每封电子邮件的结尾,都会用到“可能”这个词,意思是你可以称之为“已解决”!谢谢你的帮助。我以后一定会参考你的网站。下一步是将电子邮件处理到Excel后,将其移动到另一个文件夹。我已经看到你在上面贴了一些东西,所以我从这里开始。