我设法在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,将发回一封电子邮件。我很感激为什么这不仅仅适用于某些电子邮件。谢谢!
**更新**
代码失败的一些示例:
有些人过去了:
**更新2 ** 一些仅包含关键字的主题也会被送回。当我写一个具有相同主题的新邮件时,它会通过并正确保存。
答案 0 :(得分:0)
我尝试将您的代码段连接在一起但无法让它们工作。我在下面列出了一些错误,但这更像是我将如何开发这样的例程。
虽然Outlook宏需要此例程,但此例程可以在Excel或Access或任何其他Office产品中使用。在我看来,Excel-VBA站点比Outlook-VBA站点使用得更多。当然,有比Excel问题更多的Excel问题,并且比良好的Outlook问题更快地回答好的Excel问题。即使没有Stack Overflow的这种看法,我也会在Excel中开发这个宏。
我创建了一个工作簿“Develop isReklNr.xlsm”,我复制了你的代码并尝试将其转换为一组工作例程,但未成功。我已经创建了一个测试工具和一个虚拟检查功能来取代你的,所以我可以展示我的方法。
我创建了一个名为TestData的工作表,其中包含:
在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。