【问题标题】:Excel: Find All Instances of Text Strings in Range and Return Each InstanceExcel:查找范围内文本字符串的所有实例并返回每个实例
【发布时间】:2016-04-26 11:25:06
【问题描述】:

我需要找到可能出现在一列中的特定标识符的所有实例,并将它们连接成一个字符串。

标识符将以"ECP" 开头,用破折号或空格分隔,分隔符后有多个字符。例如。 "ECP 05-00012A1, "ECP-123456."

我使用了下面的公式,但没有想到多个“ECP 编号”。

=INDEX('Raw WAM Data'!$A$1:$A$10000,MATCH(VLOOKUP("*"&"ECP"&"*",'Raw WAM Data'!$A$1:$A$10000,1,FALSE),'Raw WAM Data'!$A$1:$A$10000,0))

然后我使用=LEFT($C$62,FIND(" ", $C$62, FIND(" ", $C$62)+1)) 解析相邻单元格中的数据 然后将该字符串加载到用户窗体文本框中。

然后我需要将所有返回的值连接成一个用逗号分隔的字符串,以便它可以加载到用户窗体文本框。

我认为 VBA 非常适合此问题,但我愿意接受任何建议。

【问题讨论】:

  • 您可以使用数组并加入 VBA。您对数据的提取是否满意,不清楚您想要什么,数据的提取或如何有效地连接?

标签: string excel vba find formula


【解决方案1】:

如果我对你想要达到的目标有正确的理解,那么你可以使用这样的东西:

Sub TEST()
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim cl As Range, x&
    With Sheets("Sheet1") 'replace sheet1 by name of your sheet
        x = .Cells(Rows.Count, "A").End(xlUp).Row
        For Each cl In .Range(.[A1], .Cells(x, "A"))
            If UCase(cl.Value2) Like "ECP*" And Not dic.exists(cl.Value2) Then
                dic.Add cl.Value2, Nothing
            End If
        Next cl
    End With
    Debug.Print Join(dic.keys, Chr(10))
End Sub

测试


更新

相对于在其中找到结果的单元格,将结果放在 E 列中的最佳方法是什么?另外,如果我想搜索多个列,我应该如何调整代码?

你可以这样使用:

Sub TEST2()
    Dim cl As Range, x&
    With Sheets("Sheet1") 'replace sheet1 by name of your sheet
        x = .[A:C].Find("*", , , , xlByRows, xlPrevious).Row 'get the last used row in range
        For Each cl In .Range(.[A1], .Cells(x, "C"))
            If UCase(cl.Value2) Like "*ECP*" Then
                If .Cells(cl.Row, "E").Value2 = "" Then
                    .Cells(cl.Row, "E").Value2 = cl.Value2
                Else
                    .Cells(cl.Row, "E").Value2 = .Cells(cl.Row, "E").Value2 & "; " & cl.Value2
                End If
            End If
        Next cl
    End With
End Sub

输出

【讨论】:

  • 我运行了这段代码,但什么也没发生。我也没有收到任何错误。
  • 此代码将结果打印到immediate window,使用Ctrl + G 激活此窗口。请参阅屏幕截图中的数据样本marked by red,同时输出结果marked by red。发布的代码工作正常,输出到immediate window,因为您没有指定输出结果应该去哪里(例如到新工作表,或现有工作表的某些列等等)。
  • 仍然没有,我知道范围内有“ECP”值。
  • 正如我已经提到的,代码运行良好,您可以在屏幕截图中看到数据样本和输出结果。代码背后的逻辑很简单,1)如果单元格值从"ECP" 开始 - 将单元格值添加到字典中,2)打印所有已添加到字典中的项目。我想您不仅需要搜索从"ECP" 开始的值,还需要搜索包含"ECP" 的值,为此,您需要在比较标准中添加额外的前置星号来比较@ 987654335@(例如 If UCase(cl.Value2) Like "*ECP*")。我希望这会有所帮助)
  • 宾果游戏,成功了。相对于在其中找到它的单元格,将结果放在 E 列中的最佳方法是什么?另外,如果我想搜索多个列,我应该如何调整代码?
【解决方案2】:

如果您的值在工作表的 A 列中,此例程将收集您的 ECP 编号并将它们加载到数组中。然后,您可以将数组加载到您的 TextBox 中。

Sub GatherECPs()

Dim ECParr

'Loop down each row starting at row 2 (assuming you have headers)
For x = 2 To SourceSheet.Range("A2").End(xlDown).Row
    'Check if the start of the string is ECP
    If Left(SourceSheet.Cells(x, 1).Value, 3) = "ECP" Then
        'Add a row to the array
        If IsEmpty(ECParr) Then
            ReDim ECParr(0)
        Else
            ReDim Preserve ECParr(UBound(ECParr) + 1)
        End If
        'Add the value to the array
        ECParr(UBound(ECParr)) = Right(SourceSheet.Cells(x, 1).Value, Len(SourceSheet.Cells(x, 1).Value) - 4)
    End If
Next

End Sub

将 SourceSheet 替换为您的值所在的工作表。

【讨论】:

  • 如果我Debug.Print ECParr 我没有看到任何结果
【解决方案3】:

要以一种也适用于一个单元格中的多个“ECP”的快速方式执行此操作,只需使用此功能:

Public Function getStr(rng As Range, ident As String) As String
  Dim i As Long, x As Variant, y As Variant
  For Each x In Intersect(rng, rng.Parent.UsedRange).Value
    y = Split(x, ident)
    If UBound(y) > 0 Then
      For i = 1 To UBound(y)
        getStr = getStr & ", " & ident & Split(y(i), ",")(0)
      Next
    End If
  Next
  getStr = Mid(getStr, 3)
End Function

它将返回一个逗号分隔的字符串。像这样使用它:getStr(Range("A:A"), "ECP")

如果你还有任何问题,尽管问;)

【讨论】:

  • 将结果传递到找到该值的同一行的某个列(E 列)的最佳方法是什么?
  • 作为 UDF 你可以输入 E1 =getStr(A1,"ECP") 然后复制下来。应该按照你的意愿去做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多