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