搜索单元格以查找文本并将文本复制到VBA中的另一个单元格?

时间:2016-05-06 14:12:03

标签: excel vba excel-vba

我有一个包含其中包含参数的行的列。例如

W2 = [PROD] [FO] [2.0] [客户]

W3 = [PROD] [GD] [1.0] [P3]

W4 =客户生产中的问题

我有一个将其他列复制到另一个工作表的函数,但对于此列,我需要执行以下操作

  • 搜索单元格并查找[P *]
  • 星号表示1到5之间的数字
  • 如果找到[P *],则将P *复制到工作表"计算"在第4栏
  • 基本上,删除单元格中的所有内容,除非有方括号,后跟P,数字和方括号

有谁知道我怎么做到这一点?或者,可能更容易复制列,然后删除不符合上述条件的所有内容。

2 个答案:

答案 0 :(得分:1)

第二次编辑:

我在这里编辑使用正则表达式而不是循环。这可能是实现目标的最有效方法。请参阅下文,如果适合您,请告知我们:

Function MatchWithRegex(sInput As String) As String
    Dim oReg As Object
    Dim sOutput As String

    Set oReg = CreateObject("VBScript.RegExp")

    With oReg
        .Pattern = "[[](P[1-5])[]]"
    End With

    If oReg.test(sInput) Then
        sOutput = oReg.Execute(sInput)(0).Submatches(0)
    Else
        sOutput = ""
    End If

    MatchWithRegex = sOutput
End Function

Sub test2()
    Dim a As String

    a = MatchWithRegex(Range("A1").Value)


    If a = vbNullString Then
        MsgBox "None"
    Else
        MsgBox MatchWithRegex(Range("A1").Value)
    End If
End Sub

第一次编辑:

我的解决方案如下。我写了一个函数,首先测试字符串中是否存在Pattern,然后如果它存在,我会根据括号拆分它,并选择与模式匹配的括号。如果这对您有用,请告诉我。

Function ExtractPNumber(sInput As String) As String
    Dim aValues
    Dim sOutput As String

    sOutput = ""
    If sInput Like "*[[]P[1-5][]]*" Then
        aValues = Split(sInput, "[")
        For Each aVal In aValues
            If aVal Like "P[1-5][]]*" Then
                sOutput = aVal
            End If
        Next aVal
    End If

    ExtractPNumber = Left(sOutput, 2)
End Function


Sub TestFunction()
    Dim sPValue As String

    sPValue = ExtractPNumber(Range("A2").Value)

    If sPValue = vbNullString Then
        'Do nothing or input whatever business logic you want
    Else
        Sheet2.Range("A1").Value = sPValue
    End If
End Sub

旧帖子:

在VBA中,您可以使用带图案的Like运算符表示打开括号,字母P,1-5中的任意数字,然后使用以下语法使用封闭式括号:

Range("A1").Value LIke "*[[]P[1-5][]]*"

答案 1 :(得分:-1)

编辑:修复了错误的解决方案

如果您对空白没问题并且不在乎*> 5,我会这样做并复制第4列:

=IF(ISNUMBER(SEARCH("[P?]",FirstSheet!$W2)), FirstSheet!$W2, "")

需要注意的重要事项:

  • ?是单个字符的通配符;如果您在该位置可以使用多个字符,则可以使用*
  • 如果找到,
  • 将显示单元格的原始值,否则留空

然后,您可以突出显示该列并根据需要删除空白。或者,您可以使用占位符字符串替换空白。

如果*必须为1-5,请分别使用两列E和D:

=MID(FirstSheet!$W2,SEARCH("[P",FirstSheet!$W2)+2,1)
=IF(AND(ISNUMBER($E2),$E2>0,$E2<=5,MID($W2,SEARCH("[P",FirstSheet!$W2)+3,1))), FirstSheet!$W2, "")

其中FirstSheet是初始工作表的名称。