【问题标题】:Searching a string for numbers including decimals in VBA在 VBA 中搜索包含小数的数字的字符串
【发布时间】:2013-07-03 18:29:18
【问题描述】:

所以我正在从事一个项目,该项目的输入来自一个相当笨重的数据库,我对它提供给我的数据类型的控制为零。它基本上给了我一个包含数字的字符串,包括小数。

服用 0.5 Tab,每天 2 次。”

每当它显示制表符时,我想获取制表符之前的数字并将其转换为双格式。一旦我有了字符串“0.5”,我就知道如何使用 cdbl 来转换它,但是我如何得到那个字符串有点困难,因为 InStr 只从左到右搜索。我的想法是使用 InStr 查找单词“tab”之前的数字之前的空格,但我无法弄清楚如何对其进行编码。有什么建议吗?

【问题讨论】:

  • 我的另一个想法是使用“”作为分隔符进行拆分,但我仍然不知道如何找到“制表符”或“制表符”之前的值。
  • 值是否包含多个“.”?您可以使用“”并获取前一个数组元素。我将更新我的答案。
  • 可能有多个“.”在字符串中。我从数据库中获取的字符串的长度和格式变化很大
  • 会不会是数字不在tab前面?例如taking 2.0 or more Tab" is recommended。你想验证标签前面的块是某个number-type 所以2.0(浮点数)而不是2(整数)?
  • 这里列出的方法,包括下面的答案,都可以在数据库中实现。我建议在那里做而不是把它带到 Excel 中。

标签: string excel vba converter


【解决方案1】:

InStrRev 从右到左搜索。或者,您可以使用StrReverse 并使用输出,但我会使用VBScript.Regexp

Dim text As String
text = "take 0.5 Tab by mouth 2 times daily"

Dim regex As Object
Set regex = CreateObject("VBScript.Regexp")

regex.Global = True
regex.Pattern = "[\d\.]+(?=\sTab)"

Dim test As Object
Set test = regex.Execute(text)
MsgBox (test(0).Value)

【讨论】:

  • +1 做得很好值得在execute 之前添加一个正则表达式test
【解决方案2】:

使用 Tab 作为相关指标更新

假设Tab 是相关指标,您可以执行以下操作:

Sub ExtractElement()
    ' column 4 and row 6 contains the text "take 0.5 Tab by mouth 2 times daily"
    s = Cells(6, 4).Value
    ' split text into array for each space
    sAr = Split(s, " ")
    ' iterate over each element of array  
    For i = 0 To UBound(sAr) - 1
        ' if the array element "Tab" is reached 
        If  sAr(i) = "Tab" Then 
            ' write the previous array element into the next column
            Cells(6, 5).Value = sAr(i-1)
        End If        
    Next    
End Sub

请注意,每个单词实际上是用“”分隔的。我复制了你的文字,发现“Tab by”没有分开。

Sub ExtractCharCode()

    s = Cells(7, 4).Value
    For i = 1 To Len(s)
        Cells(i, 8).Value = Mid(s, i, 1)
        Cells(i, 9).Value = Asc(Mid(s, i, 1))
    Next
End Sub

使用the answer from user matzone 的变体进行更新

我不会将范围从 matzone 传递给函数,而是只传递值并为其添加修剪

Public Function TakeBeforeTab2(s As String) As String
    s = Mid(s, 1, InStr(UCase(s), "TAB") - 1)
    TakeBeforeTab2 = Trim(Mid(s, InStr(s, " ") + 1))
End Function

【讨论】:

    【解决方案3】:

    "take 0.5 Tab by mouth 2 times daily."获取"0.5"

    Public Function TakeBeforeTab(r As Range) As String
    Dim s As String
    
    s = r.Value
    s = Mid(s, 1, InStr(UCase(s), "TAB") - 2)
    TakeBeforeTab = Mid(s, InStr(s, " ") + 1)
    
    End Function
    

    【讨论】:

    • 你可以添加一个 trim() 否则它返回“0.5”
    • @threeFourOneSixOneThree .. trim() 在哪一行? .. 最后一个 mid() 应该去掉“take”这个词..
    • 在我的测试中最后仍然是一个空格 - 如果将其更改为 TakeBeforeTab = "_"+Mid(s, InStr(s, " ") + 1)+"_" 会发生什么情况,它是否包含以下空格?为优雅的解决方案投票。
    • 我把修剪放在你函数的最后一行 - 请参阅我对答案的更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2021-09-27
    • 2021-06-12
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多