如何修剪Excel VBA中的文本?

时间:2017-12-22 07:29:43

标签: excel excel-vba vba

我想修剪一个具有类似结构的文本;

base_text = Surname, Name (ID)

desired_text = Name

你能帮我解决一下这个问题吗?

此致

5 个答案:

答案 0 :(得分:1)

  1. 文字功能就好 左,右,中
  2. 拆分功能,其中“”(空格)或“,”是分隔符

答案 1 :(得分:0)

这样的事情:

Option Explicit
Sub MyAnswer()
    Dim oCell As Range
    For Each oCell In Range("A1:A100")
        If oCell <> "" Then
            If InStr(1, oCell, ", ") <> 0 Then
                If InStr(1, oCell, " (") <> 0 Then
                    oCell = Right(oCell, Len(oCell) - InStr(1, oCell, ",") - 1)
                    oCell = Left(oCell, InStr(1, oCell, " (") - 1)
                End If
            End If
        End If
    Next
End Sub

这里我们遍历A1:A100范围内的每个单元格 LeftRight会返回字符串中给定的符号数 InStr返回当前字符串中符号的位置 Len返回给定字符串中的符号数。

答案 2 :(得分:0)

作为公式,您可以使用此公式,假设Base_text位于A1

=LEFT(RIGHT(A1,LEN(A1)-FIND(",",A1)),FIND("(",RIGHT(A1,LEN(A1)-FIND(",",A1)))-1)

答案 3 :(得分:0)

这可以使用正则表达式轻松解决。这将在原始数据旁边的单元格中输出“名称”。它也可以很容易地被操作以获得字符串的所有文本部分。该范围需要更新以匹配您的

Sub test()
    Dim rng As Range
    Dim c

    ' Update this line with your Range
    Set rng = Sheet2.Cells(1, 1)

    With CreateObject("VBScript.RegExp")
        .Global = True
        .ignorecase = True
        .Pattern = "[a-z]+"

        For Each c In rng
            If .test(c.Value2) Then
                c.Offset(0, 1).Value2 = .Execute(c.Value2)(1)
            End If
        Next c
    End With
End Sub

答案 4 :(得分:0)

使用拆分功能

(参见:https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/split-function

使用Split函数,您可以根据给定的分隔符将字符串拆分为子字符串。结果是基于零的1-dim子串数组,其项可以通过索引号引用。

i)所以你将使用索引1得到第二个子串:

sName = split(base_text, ",")(1)

ii)由于您只想提取名称而不是括号中的id,您必须对此结果执行另一个拆分,现在索引第一个子串(索引0)并通过Trim函数删除空格:

  sName = Trim(Split(sName, "(")(0))

<强>代码

Option Explicit
Sub GetNameToken()
  Dim base_text As String
  Dim sName     As String
' base_text = Application.UserName      ' << actual code
  base_text = "Surname, Name (ID)"      ' << pattern example

' i) get substring right of the colon delimiter (index 1)
  sName = Split(base_text & ",", ",")(1)
' ii) get substring left of the bracket delimiter (index 0)
  sName = Trim(Split(sName & " ", "(")(0))

  MsgBox "UserName = """ & base_text & """" & vbNewLine & _
         "=> """ & sName & """"
End Sub

备注

i)为了避免在基本文本与其他分隔符的情况下可能的索引乱序错误,我使用了一个技巧:我将虚构的冒号分隔符连接到要拆分的文本(这将导致空第二个子字符串,如果原始文本中没有冒号分隔符):

sName = Split(base_text & ",", ",")(1)

ii)在第二次拆分中,只有在sName =“”的情况下才需要额外的字符串连接,否则你会尝试拆分一个空字符串。

其他提示

您可以通过UBound函数获取生成的拆分数组项的上部索引,例如n = UBound(Split("one two three"," ")),在此示例中为2(=三个项目索引为0,1,2)。