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  | 

我已经看了两个TRIMSPLIT功能,但我一直没能找到一种方法,在一个小区要分割给变量(, ()) 。

我用:
http://www.homeandlearn.org/left_and_right_functions.html

http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=269:excel-vba-string-functions-left-right-mid-len-replace-instr-instrrev&catid=79&Itemid=475

http://www.exceltrick.com/formulas_macros/vba-split-function/

他们是不是真的拼凑我需要什么。我可以获得一些基础知识,但不是将更复杂的公式转换为VBA。

非常感谢提前。

这是我先前在2014年的询问的延伸,我能够获得公式。
Excel 2010 search for text in IF function - separate cell data

+0

您需要回答之前,任何人都可以开始编写代码的问题:如何在Excel中应该知道,如果在NAME2'名1名2 name3'是一个中间名或第二个姓氏?就像希拉里罗德汉姆克林顿和简芭芭拉米勒一样。 – teylyn 2015-02-12 02:52:11

+0

使用VBA而不是公式的原因是由于VBA提供了更多的灵活性。所以你需要做的第一件事是设计你想要使用的规则来分隔名字段。一旦你完成了这项任务,编码应该是微不足道的。但是为解析名称设计明确而明确的规则并不是。 – 2015-02-12 03:16:35

+0

基本上,你不能知道,数据中没有规定哪个单词是姓氏。公式旨在提取我需要的内容。任何标记在“中间”名称中的数据都将在下一步中检查数据,以查看它是否是合法的中间名,或是任性的姓氏1。 – MrsAdmin 2015-02-12 03:16:51

简短分析目前的公式是做什么的(我假设你满意他们的工作吧?),那么我看不出为什么你不能直接将它们转换呢?

起点:

=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? 
+0

感谢您的回答,我接受了它的工作原理,结果我也找到了答案,我能够将我现有的公式转换到他们的VBA对象中,这有点麻烦,但它确实有效。谢谢你的时间。 – MrsAdmin 2015-02-17 04:12:10

+1

是的好处是未来版本的可读性等,但听起来像一种“一次性”的运动:) – Simon 2015-02-17 04:52:08