Несколько вещей:
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 раз.Это действительно то, что вы хотите?