Excel VBA从单元格中提取文本

时间:2017-11-20 16:48:19

标签: vba excel-vba excel

我已经尝试通过Stack Overflow查看以前的建议,但没有找到任何有用的。

以下是我的情况:我正在尝试查看一个简单的Excel工作表,其中显示了某人的姓名,职位,然后是他们的“角色”,这是我正在创建的自定义字段。现在,我正在寻找“工程师”,但也会扩展到“管理员助理”和“经理”之类的东西。 (真正的电子表格长约8100行。)

以下是一些测试数据的示例: enter image description here

我需要的只是扫描“标题”列,查看它是否与字符串匹配(在这种情况下,我的测试字符串是工程师),然后复制字符串和剩余的I或II或III或者有些情况下,IV之后。

我听说过使用正则表达式并且之前在SQL中使用过它们,但我正在努力想出我需要的东西。这是我尝试使用MID函数的当前代码:

Sub GetRole()
' Custom function written to take role out of official title

strRole = "Engineer" ' String to check for
Dim lrow As Integer ' Number of Rows
Dim Role As String ' Role to write into adjacent cell

lrow = Cells(Rows.Count, "B").End(xlUp).Row

For i = lrow To 2 Step -1
    If InStr(1, Cells(i, 2), "Engineer") > 0 Then
        Role = Mid(Cells(i,3)), 1, 5)
    Cells.(i, 3).Value = Role
    End If
Next i

End Sub

但这并没有奏效。任何帮助或建议将不胜感激。我愿意提供任何必要的额外信息。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式解决此问题。首先,您需要通过转到工具>启用您执行此操作的参考。引用...并启用Microsoft VBScript Regular Expressions 5.5

Reference

然后使用以下代码生成答案

Sub GetRole()
    ' Custom function written to take role out of official title

    ' Uncomment the below if using Early Binding i.e. you enable the reference
    ' Dim ReGex As New RegExp
    ' Comment below line if decide to use Late Binding (i.e. you enable the reference)
    Dim ReGex As Object
    Dim i As Long, lrow As Long ' Number of Rows

    ' Comment the below line if decide to use Late Binding (i.e. you enable the reference)
    Set ReGex = CreateObject("VBScript.RegExp")

    With ReGex
        .Global = True
        .IgnoreCase = True
        .Pattern = "(Engineer\sI*\b)"
    End With

    With ActiveSheet
        lrow = .Cells(.Rows.Count, "B").End(xlUp).Row
        For i = lrow To 2 Step -1
            If ReGex.test(.Cells(i, 2).Value2) Then .Cells(i, 3).Value2 = Trim(ReGex.Execute(Cells(i, 2).Value2)(0))
        Next i
    End With
End Sub

生成输出:

Output

答案 1 :(得分:1)

我认为与调试VBA和Regex相比,Excel公式更容易扩展:

=IF(ISNUMBER(  FIND("Engineer III", E4)), "Engineer III",
 IF(ISNUMBER(  FIND("Engineer II" , E4)), "Engineer II", 
 IF(ISNUMBER(SEARCH("Engineer *I" , E4)), "Engineer I", "")))