2017-05-05 46 views
1

我们已经导入了几封电子邮件(真正为1000+),其中有各种数据。我正在寻找一种方法来从电子邮件中提取工资范围。电子邮件看起来是这样的:VBA数据解析 - 带用户定义功能的regEx循环

John Doe:您好,

下面是修改后的电子邮件反映在预算批准的薪水 的变化。

职位描述进行了审查,并已经从 国家人事制度基于在 学术或学术支持单位进行专业工作豁免。

全薪范围为$ XX,XXX至$ XXX,XXX。批准的预算 工资是$ XX,XXX。

此职位不符合加班补偿条件。

UPDATE UPDATE - @ A.S.H。精美地回答了我的原始问题,请参阅下面的答案。一旦我意识到自己的错误,我也修复了UDF功能。现在都在工作!

这里是我的代码:

用户定义的函数:

Function GetDollars(s As String, item As Long) 
    With CreateObject("vbscript.regexp") 
     .Global = True 
     .Pattern = "\$\d*[,\d]*\d*" 
     On Error Resume Next 
     If .test(s) Then Set GetDollars = .Execute(s)(item - 1) 
     If Err <> 0 Then GetDollars = vbNullString 
    End With 
End Function 

环子:

Sub salaryRanges() 
'Loops through the Email Body and pull out Salary Ranges 
Dim strText As String 

lastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row 

Set selCol = Range("C1:C" & lastRow) 

For Each oRng In selCol 
    strText = oRng.Value 
    oRng.Offset(0, 1).Value = GetDollars(strText, 1) 

Next 

Set oRng = Nothing 

End Sub 

列(0,0)不工作这让我失配误差或对象变量错误。

想法?

回答

0

RegExp试试:

Sub ExtractSalaryRange() 
    Dim r As Range, reg As Object 
    Set reg = CreateObject("VBScript.RegExp") 
    reg.MultiLine = True: reg.Global = True 
    reg.Pattern = "^(The full salary range is)(.*)$" 

    For Each r In wsData.Range("C1", wsData.Cells(Rows.Count, "C").End(xlUp)) 
    If reg.test(r.Text) Then 
     r.Offset(, 1).value = reg.Execute(r.Text).Item(0).SubMatches(1) 
    End If 
    Next 
End Sub 

enter image description here

+0

谢谢,这与出错误运行,但不会产生结果。当我在上面放置一个监视器时,在设置reg = CreateObject之后它为reg.test提供了“错误的参数数目”,然后在循环中跳过r.offset(,1).value ......因为我假设它并不是真的。思考? –

+0

@JasonLeach数据位于何处?它在C列吗?并且它是如何说reg.test *的“错误数量的参数”,因为你说它运行没有错误? –

+0

数据在列C是,它运行时没有错误,因为它进入“If reg.test(r.Text)Then”,然后跳到“End If”跳过“r.Offset ....”代码行“如果我正确理解”如果reg.test“似乎不是真的。那有意义吗?谢谢! –