2015-02-12 209 views
1

我在尋找一些幫助將我的公式轉換爲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

回答

2

簡短分析目前的公式是做什麼的(我假設你滿意他們的工作吧?),那麼我看不出爲什麼你不能直接將它們轉換呢?

起點:

=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

相關問題