【问题标题】:excel vba- extract text between 2 charactersexcel vba-提取2个字符之间的文本
【发布时间】:2011-11-09 17:50:59
【问题描述】:

如果我有这个专栏:

ColA
-----
NUMBER(8,3)
NUMBER(20)

我需要一个可以运行的 VBA 函数(注意这些开始和结束字符串只会在单元格中出现一次):

extract_val(cell,start_str,end_str)

即。 extract_val(A1,"(",")") 并给出结果:

8,3
20

我只需要在其他 vba 代码中使用此函数,而不是将其作为公式放在工作表上。

更新(感谢答案,我决定了:)

---------------------------
Public Function extract_value(str As String) As String
Dim openPos As Integer
Dim closePos As Integer
Dim midBit As String
 On Error Resume Next
openPos = InStr(str, "(")
 On Error Resume Next
closePos = InStr(str, ")")
 On Error Resume Next
midBit = mid(str, openPos + 1, closePos - openPos - 1)
If openPos <> 0 And Len(midBit) > 0 Then
extract_value = midBit
Else
extract_value = "F"
End If
End Function

Public Sub test_value()
MsgBox extract_value("NUMBER(9)")
End Sub

【问题讨论】:

标签: vba excel scripting


【解决方案1】:

您可以使用instr 在字符串中定位一个字符(例如返回'(' 的位置)。然后,您可以使用mid 提取子替换,使用'('')' 的位置。

类似(根据记忆):

dim str as string
dim openPos as integer
dim closePos as integer
dim midBit as string

str = "NUMBER(8,3)"
openPos = instr (str, "(")
closePos = instr (str, ")")
midBit = mid (str, openPos+1, closePos - openPos - 1)

您可能需要添加错误检查,以防这些字符未出现在字符串中。

【讨论】:

    【解决方案2】:

    如果字符串是“A的值为[1.0234],B的值为[3.2345]”

    如果你想提取 B 的值,即 3.2345,那么

    firstDelPos = InStrRev(textline, “[“) ‘ position of start delimiter
    secondDelPos = InStrRev(textline, “]”) ‘ position of end delimiter
    
    stringBwDels = Mid(textline, firstDelPos + 1, secondDelPos – firstDelPos – 1) ‘ extract the string between two delimiters
    
    MsgBox (stringBwDels) ‘ message shows string between two delimiters
    

    【讨论】:

      【解决方案3】:

      如果我有一个黄瓜表作为单元格中的测试数据,并且需要访问第 4 和第 5 个管道之间的“标题 1”下的值,以下是我的操作方法。我在单元格 D7 中的表格示例如下:

      *单元格 D7:

      访问 'abcd' 的代码是在第 4 次出现 '|' 之后找到的并且在第 5 次出现“|”之前

      Dim sheet5 As Worksheet
      Dim i As Integer
      Dim k As Integer
      Dim openPos As Long
      Dim clsPos As Long
      Dim textBetween as String
      
      'Using for loop to find 4th occurrence of pipe '|' for openPos
      For i = 1 To 4
      openPos = InStr(openPos + 1, sheet5.Range("D7"), "|", vbTextCompare)
      Next i
      
      'Using for loop to find 5th occurrence of pipe '|' for clsPos
      For k = 1 To 5
      clsPos = InStr(clsPos + 1, sheet5.Range("D7"), "|", vbTextCompare)
      Next k
      
      'Displaying the value between openPos and clsPos
      txtBetween = Mid(sheet5.Range("D7").Value, openPos + 1, clsPos - openPos - 1)
      MsgBox ("Current Header 1 value: " & txtBetween)
      

      【讨论】:

      • 不知道为什么我的回答被否决了,请发表评论让我知道为什么会这样。我知道前两个答案已经帮助了其他人(尤其是我),并且我正在通过循环帮助查找字符,以防字符在字符串中更远。谢谢
      【解决方案4】:

      我知道这个问题已被标记为已回答,但我想我会根据更新后的问题的功能添加我的代码。我做了一个函数,可以让它解析出多个。

      Sub testextract()
       s = extract_values("This is [what i want to keep][And this]")
       Debug.Print (s)
        End Sub
       Function extract_values(str As String, Optional openStr = "[", Optional closeStr = "]") As String
       Dim openPos As Integer
       Dim closePos As Integer
       Dim midBit As String
       prevOpen = 1
       prevClose = 1
       Dim keep As String
       While prevOpen <> 0
          On Error Resume Next
          openPos = InStr(prevOpen, str, openStr)
          On Error Resume Next
         closePos = InStr(prevClose, str, closeStr)
          On Error Resume Next
          midBit = Mid(str, openPos + 1, closePos - openPos - 1)
          If openPos <> 0 And Len(midBit) > 0 Then
          keep = keep & openStr & midBit & closeStr
         End If
         If openPos = 0 Or prevClose = 0 Then
             i = 0
         Else
            i = 1
        End If
        prevOpen = openPos + i
         prevClose = closePos + i
       Wend
       extract_values = keep
       End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-10
        • 2023-02-13
        • 2016-05-07
        • 2018-11-02
        • 2019-01-15
        • 2019-07-02
        • 1970-01-01
        • 2021-03-12
        相关资源
        最近更新 更多