我编写了一个简单的宏来解析包含HTML表的电子邮件。该表包括第一列中的品牌,第二列中的国家/地区以及以下6列中的一组指标。基于该电子邮件中特定品牌或国家名称的出现,宏执行各种任务。
这一切都适用于简单的情况,例如,
If InStr(strMsg, "Country1") > 0 Then <do xyz>
该脚本很容易在表中找到“Country1”的提及,并根据需要执行其余的代码。
现在我正在尝试实现这样一种情况,即该表的一行在第一列中包含“Brand1”,在第二列中包含“Country1”。
If InStr(strMsg, "Country1") > 0 And InStr(strMsg, "Brand1") > 0 Then
If (InStr(strMsg, "Country1") - InStr(strMsg, "Brand1") < 600) Then <do xyz>
这个想法是(1)检查两个字符串的存在,然后(2)使用它们之间的字符距离来确认它们在表的同一行。这可以利用这两个字符串在同一行的相邻列中的距离远小于它们在不同行中的距离这一事实。
出于某种原因,脚本总是在找到两个字符串时执行,无论它们在哪一行上。
我的距离(600)可能太高,但当字符串出现在表格的不同行中时,有超过600个字符(包括HTML标记)。
提前致谢。
答案 0 :(得分:0)
PeterT提到的解决方案更加干净和高效,但这样做可以解决问题:
If InStr(1,strMsg, "Country1") > 0 And InStr(1,strMsg, "Brand1") > 0 Then
If (InStr(InStr(1, strMsg, "Country1"), strMsg, "</tr>") - InStr(InStr(1, strMsg, "Country1"),strMsg, "Brand1") > 0) Then '<do xyz>
这个想法是“”是HTML表格中行尾的标记,所以你首先找到你的国家,你从那里开始寻找行和品牌,如果它是积极的,品牌就在同一行!
尝试这种更精细的方法:
Sub RunAllCombo()
Dim TR()
'you can create a loop here to change parameters
TR = InHtmlTable(strMsg, "France", "PCM")
For j = LBound(TR, 2) To UBound(TR, 2)
If TR(0, j) <> True Then
'nothing to do here, the combo isn't on the same row
Else
'Put your instruction here
End If
Next j
End Sub
Public Function InHtmlTable(ByVal strMsg As String, ByVal Country As String, ByVal Brand As String)
Dim Tc()
ReDim Tc(5, 0)
Dim StartS As Double
StartS = 1
While InStr(StartS, srtMsg, Country) > 0
Tc(0, UBound(Tc)) = False
Tc(1, UBound(Tc)) = InStr(StartS, srtMsg, Country)
StartS = Tc(1, UBound(Tc)) + 1
Tc(2, UBound(Tc)) = InStr(StartS, srtMsg, Brand)
Tc(3, UBound(Tc)) = InStr(StartS, srtMsg, "</tr>")
Tc(4, UBound(Tc)) = Tc(3, UBound(Tc)) - Tc(2, UBound(Tc))
If Tc(4, UBound(Tc)) > 0 Then Tc(2, UBound(Tc)) = True
ReDim Preserve Tc(5, UBound(Tc, 2) + 1)
Wend
ReDim Preserve Tc(5, UBound(Tc, 2) - 1)
InHtmlTable = Tc
End Function