2012-03-30 81 views
1

我想從單元格中獲取單詞。例如,單元格A2的值爲「我的名字是jayson」。我想要得到的話:「名字」&「傑森」。我想排除少於3個字符的單詞。我如何在Excel中使用公式/函數來做到這一點?如何從excel中的單元格中獲取單詞

謝謝。

+1

你想讓結果看起來像什麼,例如,你想在一個單元格中使用「name jayson」嗎? – 2012-03-30 02:01:12

+0

每個單元格中有一個,例如結果可以在第二個表格中:A1:name,A2:jayson。我將在稍後使用該值。 :) – 2012-03-30 02:23:07

回答

3

該代碼應該從包含要拼接的數據的工作表運行。我假設你在列工作一個

代碼

  1. 使用正則表達式來刪除所有的字母數字字符串小於或等於3個字符
  2. 轉儲修訂組字符串到新創建的片
  3. 使用Excel的「文本到列」

變體陣列用於使這一種有效的方法

012拆分這些字符串

{更新:增加了無環路版本}

enter image description here

Original Code

Sub Spliced() 
     Dim ws1 As Worksheet 
     Dim ws2 As Worksheet 
     Dim rng1 As Range 
     Dim objRegex 
     Dim X 
     Dim lngRow As Long 

     Set ws1 = Sheets(1) 
     Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp)) 
     Set ws2 = Sheets.Add 

     X = rng1.Value2 
     Set objRegex = CreateObject("vbscript.regexp") 
     With objRegex 
      .Pattern = "\b\w{1,3}\b" 
      .Global = True 
     End With 

     For lngRow = 1 To UBound(X) 
      X(lngRow, 1) = Application.Trim(objRegex.Replace(X(lngRow, 1), vbNullString)) 
     Next 

     ws2.Range(rng1.Address) = X 
     ws2.Columns("A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ 
             TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Space:=True 
    End Sub 

Updated:No loops

Sub Spliced_NoLoops() 
    Dim ws1 As Worksheet 
    Dim ws2 As Worksheet 
    Dim rng1 As Range 
    Dim objRegex 
    Dim strDelim As String 
    Dim strOut As String 

    strDelim = "||" 
    Set ws1 = Sheets(1) 
    Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp)) 
    strOut = Join(Application.Transpose(rng1), strDelim) 

    Set ws2 = Sheets.Add 
    Set objRegex = CreateObject("vbscript.regexp") 
    With objRegex 
     .Pattern = "\b\w{1,3}\b" 
     .Global = True 
    End With 

    ws2.Range(rng1.Address) = Application.Transpose(Split(Application.Trim(objRegex.Replace(strOut, vbNullString)), "||")) 
    ws2.Columns("A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ 
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Space:=True 
End Sub 
+1

+1哈哈!使用正則表達式!只是喜歡它! – 2012-03-30 08:10:15

+0

代碼中的'.TextToColumns'給了我一個想法。如何先使用'.TextToColumns',然後使用自動篩選去除少於4個字符的單詞?將節省時間,因爲我們將不必循環?你對此有何看法? – 2012-03-30 09:25:04

+0

@SiddharthRout,因爲您必須自動過濾,然後清除所有使用的列,根據測試字符串的長度,這可能相當可觀。我認爲變體陣列會更快 - 雖然可能會分裂毛髮給出可能的記錄大小 – brettdj 2012-03-30 09:32:37

2

你不告訴你已經嘗試過的東西,從地上爬起來,以便編碼...
傳遞細胞與分裂的範圍內,以這個函數做大致有以下幾種:

  1. 創建一個collection我們將放入任何字符串len> 2
  2. 將單元格內容拆分成一個數組。 (variants can contain arrays
  3. 評估各段的長度,並加入到收集字符串W /長度> 2
  4. 函數的返回值是一個集合W /預選賽串

請始終運行之前保存您的工作任何VBA。歡呼聲,快樂的編碼。

function splitter(byref rng as range) 
    dim return_value as collection 
    set return_value = new collection 

    dim split_result as variant 
    dim idx as integer 

    split_result = split(rng.value, " ") 

    for idx = lbound(split_result) to ubound(split_result) 
     if len(split_result(idx)) > 2 then 
      return_value.add(split_result(idx)) 
     end if 
    next 
    splitter = return_value 
end function 

我沒有Windows或Mac OS在手來測試,但語法應該是正確的,如果不是這樣的話。

+0

它給了我'#NAME?'。我用的功能是:'= splitter(C5:C6)' – 2012-03-30 02:20:57

+0

啊,這是一個用戶自定義函數(UDF)。請參閱「訪問您的自定義函數」(http://www.fontstuff.com/vba/vbatut01.htm)請接受我的道歉,我必須運行,但明天某個時候會再回來。祝您的項目好運。 – bernie 2012-03-30 02:26:53

相關問題