String 在字符串中的破折号两侧返回数值?

String 在字符串中的破折号两侧返回数值?,string,vba,character,String,Vba,Character,有人知道如何仅返回字符串中短划线两侧的数值吗 例如,假设我们有以下字符串“Text,2-78,88-100101”。我正在寻找一种方法来识别破折号,然后返回其中一个数字(左或右) 最后,我想检查一个给定的数字,比如说75,是否在字符串中标注的任何范围内。理想情况下,它会看到75在“2-78”范围内 任何帮助都将不胜感激 使用VBA可以用许多不同的方法来实现这一点。使用Split()函数转换为数组,首先使用逗号作为分隔符,然后使用破折号可能是一种方法 这就是说,如果您想用excel(您可以从中录制

有人知道如何仅返回字符串中短划线两侧的数值吗

例如,假设我们有以下字符串“Text,2-78,88-100101”。我正在寻找一种方法来识别破折号,然后返回其中一个数字(左或右)

最后,我想检查一个给定的数字,比如说75,是否在字符串中标注的任何范围内。理想情况下,它会看到75在“2-78”范围内


任何帮助都将不胜感激

使用VBA可以用许多不同的方法来实现这一点。使用Split()函数转换为数组,首先使用逗号作为分隔符,然后使用破折号可能是一种方法

这就是说,如果您想用excel(您可以从中录制宏)快速而肮脏地执行此操作,您可以这样做

将目标字符串粘贴到单元格中。 使用逗号作为删除符,运行文本到其中的列。 复制您现在拥有的行,并将转置粘贴到新工作表上。 在转置的列上再次运行文本到列,这次使用破折号作为清除器。 现在,您有了并列的数字列,您可以根据需要将其与目标值进行比较


您可能需要在其中的某个位置使用Trim()函数来删除空白,但希望“文本到”列将留给您数字而不是文本数字。

转到“工具->引用”并选中“Microsoft VBScript正则表达式5.5”。然后您可以执行类似操作。(我知道这不是一个好代码,但这是一个想法……)此外,这会找到所有的#-#模式,并打印所有模式的左或右数字(基于布尔值“left”是真还是假)


最终,我认为有很多方法可以解决这类问题。这看起来是一个尝试使用RegExp的好方法。RegExp不是我的专长,但我确实喜欢尝试用它来回答一些问题。此代码已经针对您的示例数据进行了测试,并且工作正常

类似这样,假设您的文本位于单元格
A1
,并且您正在测试一个值,如
75
,这也会捕获匹配集合中字符串中的单个数字:

Sub TestRegExp
Dim m As Match
Dim testValue As Long
Dim rangeArray As Variant

testValue = 75  'or whatever value you're trying to find

pattern = "[\d]+[-][\d]+\b|[\d]+"
Set re = New RegExp

re.pattern = pattern
re.Global = True
re.IgnoreCase = True 'doesn't really matter since you're looking for numbers

Set allMatches = re.Execute([A1])

For Each m In allMatches

    rangeArray = Split(m, "-")
    Select Case UBound(rangeArray)
        Case 0
            If testValue = rangeArray(0) Then
                msg = testValue & " = " & m
            Else:
                msg = testValue & " NOT " & m
            End If
        Case 1
            If testValue >= CLng(rangeArray(0)) And testValue <= CLng(rangeArray(1)) Then
                msg = testValue & " is within range: " & m
            Else:
                msg = testValue & " is not within range: " & m
            End If
        Case Else
    End Select

    MsgBox msg, vbInformation


Next


End Sub
子TestRegExp
把我当作对手
将测试值变长
作为变体的Dim Range阵列
testValue=75'或您试图找到的任何值
pattern=“[\d]+[-][\d]+\b |[\d]+”
Set re=New RegExp
模式
re.Global=True
re.IgnoreCase=True'并不重要,因为您正在寻找数字
Set allMatches=re.Execute([A1])
对于所有匹配中的每个m
rangeArray=Split(m,“-”)
选择案例UBound(rangeArray)
案例0
如果testValue=rangeArray(0),则
msg=testValue&“=”&m
其他:
msg=testValue&“NOT”&m
如果结束
案例1
如果testValue>=CLng(rangeArray(0))和testValue。
Sub TestRegExp
Dim m As Match
Dim testValue As Long
Dim rangeArray As Variant

testValue = 75  'or whatever value you're trying to find

pattern = "[\d]+[-][\d]+\b|[\d]+"
Set re = New RegExp

re.pattern = pattern
re.Global = True
re.IgnoreCase = True 'doesn't really matter since you're looking for numbers

Set allMatches = re.Execute([A1])

For Each m In allMatches

    rangeArray = Split(m, "-")
    Select Case UBound(rangeArray)
        Case 0
            If testValue = rangeArray(0) Then
                msg = testValue & " = " & m
            Else:
                msg = testValue & " NOT " & m
            End If
        Case 1
            If testValue >= CLng(rangeArray(0)) And testValue <= CLng(rangeArray(1)) Then
                msg = testValue & " is within range: " & m
            Else:
                msg = testValue & " is not within range: " & m
            End If
        Case Else
    End Select

    MsgBox msg, vbInformation


Next


End Sub