【问题标题】:separates the string and display just first value分隔字符串并仅显示第一个值
【发布时间】:2021-09-11 17:52:30
【问题描述】:

开发一个分隔字符串的函数,我想显示 = 之后的第一个值,即 16 而不是整个分隔字符串。

希望能得到一些帮助,谢谢。

Sub Split()

    Dim arr() As String
    
    arr = Split("KeyNo = ,16,17,18", ",")

    Dim name As Variant
    For Each name In arr
        Debug.Print name
    Next

End Sub

还有这个

Sub Split2()

    Dim arr() As String
    
    arr = Split("KeyNo = 16,17,18", ",")

    Dim name As Variant
    For Each name In arr
        Debug.Print name
    Next

End Sub

【问题讨论】:

  • Split("KeyNo = 16,17,18", ",")(0) 会给你 "KeyNo = 16" 和 Split("KeyNo = 16,17,18", ",")(1) 会给你 17 等等......它用逗号分隔值并返回基于零的索引
  • 它在这条线上给出Type Mismatch error arr = Split("BookNo = ,16,17,18", ",")(1) @Naresh
  • '而不是 Dim arr() As String 使用 Dim arr As String 然后 arr 将是那些值。试试这个...Debug.Print Split("KeyNo = 16,17,18", ",")(0)Debug.Print Split("KeyNo = 16,17,18", ",")(1)然后你就会明白了
  • 然后出现新的错误Compile Error For each may only iterate over a collection object or an array
  • 您不需要循环来提取所需的值。使用上面提到的索引,您可以提取任何位置的值(基于 0)。如果您需要一个一个所有值,那么您需要数组。 ...在您的第一个代码中 Debug.Print Split("KeyNo = ,16,17,18", ",")(1) 会给您 16

标签: excel vba split


【解决方案1】:

处理此问题的一种方法是使用正则表达式:

Option Explicit

Private Sub Test()
   MsgBox ExtractFirstNumber("KeyNo = ,16,17,18")
   MsgBox ExtractFirstNumber("KeyNo = 16,17,18")
End Sub

Private Function ExtractFirstNumber(ByVal Value As String) As String
   Dim regex As regExp
   Dim matches As MatchCollection

   Set regex = New regExp
   regex.Pattern = "\d+"
   regex.Global = True

   If regex.Test(Value) Then
      Set matches = regex.Execute(Value)
      ExtractFirstNumber = matches(0)
   End If
End Function

【讨论】:

    【解决方案2】:

    下面SplitAndDisplay()代码的思路如下:

    • 按分隔符分割并将结果写入myArr;
    • lbound(myArr) 循环到ubound(myArr) - 1,以确保始终有下一项;
    • 如果找到splitAfter(),则显示下一项;
    • 如果没有,返回-1

    Sub Split16()
    
        Dim textInput As String
        textInput = "KeyNo = ,16,17,18"
        
        Dim result As String
        result = SplitAndDisplay(textInput, ",", "=")
        Debug.Print result
            
    End Sub
    
    Public Function SplitAndDisplay(textInput As String, mySeparator As String, splitAfter As String)
        
        Dim myArr As Variant
        myArr = Split(textInput, mySeparator)
        
        Dim i As Long
        
        For i = LBound(myArr) To UBound(myArr) - 1
            If InStr(myArr(i), "=") Then
                SplitAndDisplay = myArr(i + 1)
                Exit Function
            End If
        Next i
        
        SplitAndDisplay = -1
        
    End Function
    

    【讨论】:

    • 谢谢。如果字符串像 "KeyNo = 16,17,18" 而不是 "KeyNo = ,16,17,18" 那么如何获得 16。
    • @IntoLearn - 从这一行开始 - 分隔字符串,我想在之后显示第一个值 我假设在这种情况下你不应该取 16,而只是简单地下一项。否则,分流器是什么概念?
    • 我明白你的意思我错了谢谢。另一件事是如何使用此代码创建循环。我在Col"B" 中有多个该格式的ID,我使用它们来匹配来自其他工作表的数据,方法是手动将16 之类的第一个值放入该循环For r = 2 To LastRow 然后KeyID = ws.Cells(r, "B").Value @Vityata
    【解决方案3】:

    无论"=" 后面是否有逗号,您似乎都想要16。如果没有逗号,直接把它放进去,然后用Split()

    Sub splittt()
        s = "KeyNo = ,16,17,18"
        If InStr(s, "= ,") = 0 Then
            s = Replace(s, "= ", "= ,")
        End If
        
        arr = Split(s, ",")
        MsgBox arr(1)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2016-09-15
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多