根据关键字

时间:2016-06-23 10:32:27

标签: vba email outlook outlook-vba

我设法在Outlook VBA中编写了一个脚本,它执行以下操作: - 扫描特定收件箱文件夹中的每个传入电子邮件 - 检测某个关键字(一个基于“R”的ID,年份的名称,“/”,“ - ”或其他一些和递增的数字,p.e.R16 / 000001) - 如果有关键字:将电子邮件和附件保存到某个文件夹 - 如果不是:发回邮件,要求提供关键字

现在,这完全没问题,只是收到的一些邮件会被发回,即使关键字在那里并且完全正确。 关键字可以是主题中的任何位置,主题可以是任何内容。所以我尝试从发回的特定电子邮件中更改主题,但它不起作用。这是我的代码,但我不太确定这是编码问题。

找到关键字 UPDATED 的位置:

Dim i As Integer
reklPos = 0
For i = 10 To 20
    If InStr(UCase(txt), "R" & i) Then
        reklPos = InStr(UCase(txt), "R" & i)
    End If
Next i

检查关键字是否正确:

If reklPos = 0 Then
    isReklNr = 0
ElseIf Not isNaN(Mid(txt, reklPos + 3, 1)) Then
    isReklNr = 9
Else
    isReklNr = 10
End If

isNaN功能:

Dim i As Integer
For i = 1 To Len(txt)
    If Mid(txt, i, 1) Like "[0-9]" Then
        isNaN = False
    Else
        isNaN = True
        Exit For
    End If
Next i

基于此,如果isReklNr返回0,将发回一封电子邮件。我很感激为什么这不仅仅适用于某些电子邮件。谢谢!

**更新**

代码失败的一些示例:

  • “VIV 14198 OPPERVLAKTEFOUTEN R16 / 005367”,
  • “VIV13966 R16 / 004062”,
  • “VIV13702 R16 / 002182 - 1,4 t”

有些人过去了:

  • “R16 / 005370_200189671_SCB”,
  • “AW:R16 / 005301_Todoaceros”,
  • “WG:Per E-Mail senden:VR 003108.pdf - Rekl.Wälzholz/ Wickede - R16 / 005328”,
  • “WG:AktuelleQualitätsbeanstandung - IB 200006250 - R16 / 005332”

**更新2 ** 一些仅包含关键字的主题也会被送回。当我写一个具有相同主题的新邮件时,它会通过并正确保存。

1 个答案:

答案 0 :(得分:0)

我尝试将您的代码段连接在一起但无法让它们工作。我在下面列出了一些错误,但这更像是我将如何开发这样的例程。

虽然Outlook宏需要此例程,但此例程可以在Excel或Access或任何其他Office产品中使用。在我看来,Excel-VBA站点比Outlook-VBA站点使用得更多。当然,有比Excel问题更多的Excel问题,并且比良好的Outlook问题更快地回答好的Excel问题。即使没有Stack Overflow的这种看法,我也会在Excel中开发这个宏。

我创建了一个工作簿“Develop isReklNr.xlsm”,我复制了你的代码并尝试将其转换为一组工作例程,但未成功。我已经创建了一个测试工具和一个虚拟检查功能来取代你的,所以我可以展示我的方法。

我创建了一个名为TestData的工作表,其中包含:

enter image description here

在A栏中,我已经放置了您的样本值。我会添加错误的值 - 一些完全错误的巧妙错误 - 所以我可以彻底运行检查例程。在C列中,我已针对正确的样本值输入“A”,并将针对错误值输入“R”。我的测试工具为A列中的每个值调用检查例程,并将结果写入B列。在D列中,我输入了公式,将检查函数的结果与我的预期值进行比较。 D列中的“不同”值告诉我检查例程中存在错误。

开发了检查例程后,我将其复制到Outlook并存档工作簿。如果稍后发现错误或参考号的格式发生变化,我将检索工作簿。我会向工作表TestData添加新值,并根据需要更正/更新检查例程。 D列会告诉我,我的更正/更新是否没有错误。它还将确认我没有引入一个错误,意味着其他值不再被正确接受或拒绝。如果我遇到问题,我会在Excel-VBA网站上发布我的完整代码(不是代码片段),并期望得到快速回复。

我希望我已经很好地解释了我的方法,让你了解它的优点。

我的测试工具是:

Option Explicit
  Const ColTestStr As Long = 1
  Const ColAccRej As Long = 2
Sub Test()

  Dim RowCrnt As Long
  Dim RowLast As Long

  With Worksheets("TestData")
    RowLast = .Cells(Rows.Count, ColTestStr).End(xlUp).Row

    For RowCrnt = 3 To RowLast
      If Check(.Cells(RowCrnt, ColTestStr).Value) Then
        .Cells(RowCrnt, ColAccRej).Value = "A"
      Else
        .Cells(RowCrnt, ColAccRej).Value = "R"
      End If
    Next

  End With

End Sub
Function Check(ByVal Txt As String) As Boolean

  Check = True

End Function

Check是我的假检查程序。正如我所说,我无法让你的工作。

我对您的代码的评估

我假设前两个代码块形成布尔函数isReklNr。假设的问题是isReklNr设置为0,9或10.这些值对我没有意义。

Dim i As Integer,请将Integer替换为Long。对于VBA,Integer声明一个16位整数值。这需要在32位或64位计算机上进行特殊处理。 Long声明一个更合适的32位值。

在For-Loop中,你应该在If语句中有Exit For,以便在找到一个好的值时退出。

在你的文字中,你说参考编号是“Rnn”,其中“nn”是一年。您正在检查“R0”,“R1”,“R2”或“R3”。我会检查“R”后面的两个字符是数字,如果是数字,它们都在适当的范围内。

您的isNaN函数会检查多字符字符串是否为十进制数字。但是,它仅在“RnnX”中使用一个字符X来调用。但“X”是“/”或“ - ”,所以isNaN总是返回False。