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

在单元格中搜索文本并将文本复制到VBA中的另一个单元格?,vba,excel,Vba,Excel,我有一个列,其中包含包含参数的行。比如说 W2=[PROD][FO][2.0][Customer] W3=[PROD][GD][1.0][P3] W4=客户生产中的问题 我有一个将其他列复制到另一个工作表的函数,但是对于这个列,我需要执行以下操作 搜索单元格并查找[P*] 星号表示1到5之间的数字 如果找到[P*],则将P*复制到第4列的“计算”表中 基本上,移除单元格中的所有内容,除了有一个方括号,后面是P、数字和方括号的地方 有人知道我怎么做吗?或者,可以更轻松地跨列复制,然后删除所有不

我有一个列,其中包含包含参数的行。比如说

W2=[PROD][FO][2.0][Customer]

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

W4=客户生产中的问题

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

  • 搜索单元格并查找[P*]
  • 星号表示1到5之间的数字
  • 如果找到[P*],则将P*复制到第4列的“计算”表中
  • 基本上,移除单元格中的所有内容,除了有一个方括号,后面是P、数字和方括号的地方

有人知道我怎么做吗?或者,可以更轻松地跨列复制,然后删除所有不符合上述条件的内容。

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

如果你对空格没意见,也不在乎*>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, "")
=MID(FirstSheet!$W2,搜索(“[P],FirstSheet!$W2)+2,1)
=如果(和)(ISNUMBER($E2),$E2>0,$E2秒编辑:
我在这里编辑是为了使用正则表达式而不是循环。这可能是实现您的目标最有效的方法。请参见下文,并告知我们它是否适用于您:

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
第一次编辑: 我的解决方案如下。我会编写一个函数,首先测试字符串中是否存在模式,如果存在,我会根据括号将其拆分,然后选择与模式匹配的括号。让我知道这是否适用于您

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][]]*"

到目前为止,你有什么代码?你可以使用
Worksheetfunction.Search()
,或者搜索精确的字符串。到目前为止,我所掌握的只是将一列复制到另一张工作表的代码,这对这些工作表是有效的。我刚刚补充说,复制该列可能更容易,然后删除所有不适用的文本[P*]但我不知道从哪里开始我该如何将其输入VBA,使其删除除此之外的所有内容though@K20GH查看我的编辑,让我知道这是否对您有效。非常好。这很有效。现在我只需要找出如何循环遍历每一行/单元格,然后将结果放入另一行/单元格cell@K20GH那应该一点也不难,如果你如果你觉得有困难,就写一篇新的帖子,其中的细节会阻碍你,我相信你会得到立即的帮助:)我有一些问题,但我认为这可能与正则表达式有关。如果[P*]之前或之后有空格,它似乎找不到模式