EXCEL 2010:使用VBA将单元拆分为多个单元格
我在寻找一些帮助将我的公式转换为VBA代码。EXCEL 2010:使用VBA将单元拆分为多个单元格
目前我的数据是在列($ T10)
我现在有类似的数据行:
李四([email protected]___.com)
李四,SR(noemail-8858 )
第一第二DE姓surname2([email protected]_______.com)
第一中学姓([email protected]_____.net)
的公式来获取 '正常' 的名字:
[First Surname] =IF($C2678=1,(LEFT(B2684,SEARCH("(",B2684)-1)),"")
[first name] =IF($C4068=1,(LEFT(TRIM(B4074),FIND(" ",TRIM(B4074))-1)),"")
[middle name] =IF($C3888=1,(IF(LEN(TRIM(B3894))-LEN(SUBSTITUTE(B3894," ",""))<>3,"",LEFT(MID(TRIM(B3894),FIND(" ",TRIM(B3894))+1,99),FIND(" ",MID(TRIM(B3894),FIND(" ",TRIM(B3894))+1,99))-1))),"")
[surname] =IF($C4068=1,(TRIM(RIGHT(SUBSTITUTE(TRIM(LEFT(B4074,FIND("(",B4074)-1))," ",REPT(" ",99)),99))),"")
[email] =IF($C4068=1,(MID(TRIM(B4074),FIND("(",TRIM(B4074))+1,FIND(")",TRIM(B4074))-FIND("(",TRIM(B4074))-1)),"")
结果(编辑):
| jane Doe | jane | middle | Doe | [email protected]____.com |
| first surname | first | middle | Surname | noemail-8858 |
我已经看了两个TRIM
和SPLIT
功能,但我一直没能找到一种方法,在一个小区要分割给变量(, ()
) 。
我用:
http://www.homeandlearn.org/left_and_right_functions.html
http://www.exceltrick.com/formulas_macros/vba-split-function/
他们是不是真的拼凑我需要什么。我可以获得一些基础知识,但不是将更复杂的公式转换为VBA。
非常感谢提前。
这是我先前在2014年的询问的延伸,我能够获得公式。
Excel 2010 search for text in IF function - separate cell data
简短分析目前的公式是做什么的(我假设你满意他们的工作吧?),那么我看不出为什么你不能直接将它们转换呢?
起点:
=IF($C3888=1,(IF(LEN(TRIM(B3894))-LEN(SUBSTITUTE(B3894," ",""))<>3,"",LEFT(MID(TRIM(B3894),FIND(" ",TRIM(B3894))+1,99),FIND(" ",MID(TRIM(B3894),FIND(" ",TRIM(B3894))+1,99))-1))),"")
格式化更多:
=IF($C3888=1,
(IF(LEN(TRIM(B3894))-LEN(SUBSTITUTE(B3894," ","")) <>3,
"",
LEFT(
MID(
TRIM(B3894),
FIND(
" ",
TRIM(B3894)
) +1,
99
),
FIND(
" ",
MID(
TRIM(B3894),
FIND(
" ",
TRIM(B3894)
)+1,
99
)
)-1
)
)
)
,"")
我想你已经有了数太多MID和左派比你的需要。这就是我解释的“在修剪后的值的第一个和第二个空间之间得到这个词”......是吗?
VBA-afied:
Function GetMiddleName(rgName As Range) As String
Dim intTrimmed As Integer
Dim intNoSpace As Integer
Dim stTrimmed As String
Dim intFirstSpace As Integer
Dim intSecondSpace As Integer
If rgName.Offset(-6, 1).Value = 1 Then ' This gives the "C3888" from the "B3894"
stTrimmed = Trim(rgName.Value)
intTrimmed = Len(stTrimmed)
intNoSpace = Len(Replace(rgName.Value, " ", ""))
If intTrimmed - intNoSpace <> 3 Then
GetMiddleName = ""
Exit Function
Else
intFirstSpace = InStr(1, stTrimmed, " ")
intSecondSpace = InStr(intFirstSpace + 1, stTrimmed, " ")
GetMiddleName = Mid(stTrimmed, intFirstSpace + 1, intSecondSpace - (intFirstSpace + 1))
Exit Function
End If
Else
GetMiddleName = ""
End If
End Function
希望,让你开始与一些想法的其他公式... PS在VBA中“REPT”公式=“字符串”(我不知道有一个公式!好的!)
这给了我这些结果:
"Jane Doe ([email protected]___.com)" = "" (fails the "len - nospaces <> 3" check)
"JOHN DOE, SR (noemail-8858)" = "DOE," (might wanna add a Replace(","...))
"first second DE surname surname2 ([email protected]_______.com)" = "" (fails the "<>3" check)
"first middle surname ([email protected]_____.net)" = "middle" Works Swimingly?
您需要回答之前,任何人都可以开始编写代码的问题:如何在Excel中应该知道,如果在NAME2'名1名2 name3'是一个中间名或第二个姓氏?就像希拉里罗德汉姆克林顿和简芭芭拉米勒一样。 – teylyn 2015-02-12 02:52:11
使用VBA而不是公式的原因是由于VBA提供了更多的灵活性。所以你需要做的第一件事是设计你想要使用的规则来分隔名字段。一旦你完成了这项任务,编码应该是微不足道的。但是为解析名称设计明确而明确的规则并不是。 – 2015-02-12 03:16:35
基本上,你不能知道,数据中没有规定哪个单词是姓氏。公式旨在提取我需要的内容。任何标记在“中间”名称中的数据都将在下一步中检查数据,以查看它是否是合法的中间名,或是任性的姓氏1。 – MrsAdmin 2015-02-12 03:16:51