如何从单元格中提取特定文本?

时间:2012-09-23 00:23:19

标签: excel vba excel-vba

在这种情况下,我想提取单元格中的开头文本并保留其余部分。 例如一系列单元格包含:

2nd Unit. Miami
3rd Production Staff. Toronto
1st Ad. San Francisco

我想在不使用Text to columns的情况下解决这个问题,因为之前的行格式不同,而最后几行是我想要处理的异常值。

我认为正则表达可能会这样做,但这看起来有点复杂。

我的算法思路是: 1.抓住想要的文本(什么函数或自定义子会这样做?) 2.将文字翻到新的位置 3.从单元格中剪切文本,留下剩余的文本。

看起来很简单,但我仍在通过VBA森林进行修复,按照我要的速度,它最终会更快地手动完成。但这似乎是学习一些VBA技巧的好机会。

TIA

更新: 我想把文本带到“。\”并将其移到另一列,将剩余部分保留在原来的位置。

3 个答案:

答案 0 :(得分:3)

VBA是不必要的。要获取。\在单元格A1中的文本:=MID(A1,FIND(".\",A1,1)+2,LEN(A1))以获取之前的文本。\在A1:=LEFT(A1,FIND(".\",A1,1)-1)中。

作为附加信息,Find会在.\出现的字符串中返回展示位置。它相当于VBA中的InStr。如果.\不在单元格中,它将显示#VALUE,因为我没有费心添加错误检查。

答案 1 :(得分:2)

由于您似乎想要修改单元格文本,因此需要使用VBA。

在将cl设置为要处理的单元格的循环内:

str = cl.value
i = Instr(str, ".\")
cl = Trim(Mid$(str, i + 2))  ' assuming you want to exclude the ".\"
cl.Offset(0, 1) Trim(Left$(str, i - 1)) ' Places the original first part one cell to the right

答案 2 :(得分:0)

为了遇到同样问题的人,这里有经过充分测试的工作代码。

Function RE6(strData As String) As String
  Dim RE As Object, REMatches As Object

  Set RE = CreateObject("vbscript.regexp")
  With RE
      .MultiLine = False
      .Global = False
      .IgnoreCase = True
      .Pattern = "[0-9][0-9][0-9][0-9]B"
      RE6 = .test(strData)
  End With

  Set REMatches = RE.Execute(strData)
  If REMatches.Count > 0 Then
      RE6 = True
  Else
      RE6 = False
  End If
End Function

Sub territory()
Dim strTest As String, str As String, cl As Range
  strTest = ActiveCell.Value
  Set cl = ActiveCell
  If RE6(strTest) = True Then
      str = cl.Value
      i = InStr(str, ". ")
      cl = Trim(Mid$(str, i + 2))
      cl.Offset(0, 1) = Trim(Left(str, i - 1))
      cl.Offset(0, 2) = "Instance"
      MsgBox RE6(strTest)
  End If
End Sub