String Excel:拆分带分隔符的字符串并检索字符串中每个元素的数值

String Excel:拆分带分隔符的字符串并检索字符串中每个元素的数值,string,vba,excel,String,Vba,Excel,我有以下情况: 在一张表(下拉列表)中,我有两列,其中包含产品名称及其各自的ID。在另一张表(SelectProduct)中,我有一个产品名称的下拉列表,为此我编写了一些VBA代码,以允许多个选择 有什么方法可以对产品字符串执行类似拆分的操作并检索每个产品的ID,然后将每个ID作为字符串放在不同的单元格中 例如,单元格A2中的初始字符串为Product1;产品2;产品3,我想以ID1结束;ID2;ID3在另一个单元格中 编辑:以上只是一个例子来了解我需要什么。 我的专栏有606个产品,ID从1到

我有以下情况: 在一张表(下拉列表)中,我有两列,其中包含产品名称及其各自的ID。在另一张表(SelectProduct)中,我有一个产品名称的下拉列表,为此我编写了一些VBA代码,以允许多个选择

有什么方法可以对产品字符串执行类似拆分的操作并检索每个产品的ID,然后将每个ID作为字符串放在不同的单元格中

例如,单元格A2中的初始字符串为Product1;产品2;产品3,我想以ID1结束;ID2;ID3在另一个单元格中

编辑:以上只是一个例子来了解我需要什么。 我的专栏有606个产品,ID从1到606不等

另一个例子:单元格中的字符串-轮胎;保险杠头盔

这些特定产品的ID结果-156;35;310


ID不符合顺序,因为它取决于产品的选择顺序。

作为快速方法,我会这样做:

首先,我将使用分隔符(我理解为半列)进行拆分:

在这种情况下,
b
将是一个元素数组。因此,我将从右开始解析,直到再也找不到任何数字:

Set c = New Collection
For j = 0 To UBound(b)
    cnt1 = ""
    cnt2 = 1
    Do While IsNumeric(Left(Right(b(j), cnt2), 1))
        cnt1 = Left(Right(b(j), cnt2), 1) & cnt1
        cnt2 = cnt2 + 1
    Loop
    c.Add "ID" & cnt1
Next j
请注意,您的“ID+号码”将在集合
c
中。 这意味着您可以通过循环一次来构建它们:

newString = ""
For Each element In c
    newString = element & ";"
Next element
另外,我相信,尽管研究使用正则表达式(RegEx)的解决方案会更有效,但模式并不太复杂。

获取ID的最简单方法是循环遍历每个字符并去掉任何非字母数字

str2 = ""
str1 = ActiveSheet.Range("A1").Value
For i = 1 To Len(str1)
c = Mid(str1, i, 1)
If IsNumeric(c) Or c = ";" Then
str2 = str2 & c
End If
Next i
只需将A1设置为单元格所在的任何范围


str2将与所有数字相匹配;分隔符

,查找表位于C3:D10中,数据位于A1中,这个小UDF()

将产生:


id可以是数字的,也可以是非数字的

也许不是最好的解决方案,但可能是一个UDF,它使用
Split
方法将单元格A2加载到数组中,然后您可以查找每个id并将其写回单元格?id值在哪里?一种方法是将字符串作为变量读入,使用“;”作为分隔符将变量拆分到数组中,在数组中循环查找数组中项目的每个ID值,将结果匹配项连接到字符串中,并将该字符串吐出到工作表中。如果它总是说“产品”,则,那么为什么不直接用“ID”替换“产品”?MsgBox Replace(Application.Range(“A2”),“Product”,“ID”)@sous2817 ID值和产品名称一起出现在下拉列表中。@实际上它们不是“ProductX”,这只是一个快速解释的示例。正是我所想/建议的:)当我研究Scott的建议时,你发布了这个。它看起来很神奇,理论上应该是可行的,但它给了我一个“名字”?错误。我的身份证在另一张纸上。我调用函数as=GetIds(A2,下拉列表!B1:C606)。我遗漏了什么?我尝试将产品列表放在调用函数的同一张表中。仍然获取#NAME?@Hidoshi错误消息表示Excel无法“找到”UDF()。。。。。。。请确保UDF()位于标准模块中。@Gary的学生它工作正常,非常感谢您的帮助。谢谢斯科特提出同样的想法。
str2 = ""
str1 = ActiveSheet.Range("A1").Value
For i = 1 To Len(str1)
c = Mid(str1, i, 1)
If IsNumeric(c) Or c = ";" Then
str2 = str2 & c
End If
Next i
Public Function GetIds(r1 As Range, r2 As Range) As String
   Dim t As String
   ary = Split(r1.Text, ";")
   For Each a In ary
      For i = 1 To r2.Rows.Count
         If a = r2(i, 1).Value Then
            GetIds = GetIds & ";" & r2(i, 2)
         End If
      Next i
   Next a
   GetIds = Mid(GetIds, 2)
End Function