在这种情况下,我想提取单元格中的开头文本并保留其余部分。 例如一系列单元格包含:
2nd Unit. Miami
3rd Production Staff. Toronto
1st Ad. San Francisco
我想在不使用Text to columns的情况下解决这个问题,因为之前的行格式不同,而最后几行是我想要处理的异常值。
我认为正则表达可能会这样做,但这看起来有点复杂。
我的算法思路是: 1.抓住想要的文本(什么函数或自定义子会这样做?) 2.将文字翻到新的位置 3.从单元格中剪切文本,留下剩余的文本。
看起来很简单,但我仍在通过VBA森林进行修复,按照我要的速度,它最终会更快地手动完成。但这似乎是学习一些VBA技巧的好机会。
TIA
更新: 我想把文本带到“。\”并将其移到另一列,将剩余部分保留在原来的位置。
答案 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