2012-03-30 5 views
1

셀에서 단어를 가져오고 싶습니다. 예를 들어 A2 셀의 값은 "My name is jayson"입니다. 나는 단어를 얻고 싶다 : "이름"& "jayson". 3 자 미만의 단어는 제외하고 싶습니다. 수식/함수를 사용하여 Excel에서 어떻게 수행합니까?셀의 단어를 Excel에서 얻는 방법

감사합니다.

+1

결과를 어떻게 보이게할까요? 예를 들어, 하나의 셀에 "name jayson"을 원하십니까? –

+0

각 셀에 하나씩, 예를 들어 결과는 두 번째 시트에있을 수 있습니다 : A1 : 이름, A2 : jayson. 나중에이 값을 사용하겠습니다. :) –

답변

3

이 코드는 접합 할 데이터가 들어있는 시트에서 실행해야합니다. 난 당신이 열에서 작업하는 것으로 가정 한

코드

  1. 3 자
  2. 에 작거나 같은 모든 숫자 문자열을 제거하는 정규 표현식을 사용하여 새로 만든에 문자열의 개정 세트를 덤프 시트는
  3. 는 변형 배열이 효율적인 과정

    012을 만드는 데 사용되는

"텍스트 나누기"엑셀의를 사용하여 이러한 문자열을 분할 3,516,

{업데이트 : 추가 없음 루프 버전}

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 
,536,
+1

+1 하하! 정규 표현식 사용! 단순히 그것을 사랑해 !!!! –

+0

코드의'.TextToColumns'는 나에게 아이디어를주었습니다. '.TextToColumns'를 먼저 사용하고 autofilter를 사용하여 4 자 미만의 단어를 제거하는 방법은 어떨까요? 루프를 반복하지 않아도되므로 시간을 절약 할 수 있습니까? 이것에 대한 당신의 생각은 무엇입니까? –

+0

@SiddharthRout autofilter를 사용하고 사용 된 모든 열을 지워야하기 때문에 테스트 문자열의 길이에 따라 상당한 수 있습니다. 나는 변종 배열이 더 빠를 것이라고 생각한다. 아마도 가능성있는 레코드 크기를 가진 머리카락을 나누어 주겠지 만 – brettdj

2

당신은
은 다음과 대략 수행이 함수에 셀 - 투 - 분할의 범위를 통과 ... 당신이 그렇게 처음부터 코딩 시도했다 표시되지 않습니다 :

  1. 만들기 collection에 len> 2 인 문자열을 입력합니다.
  2. 은 셀 내용을 배열로 나눕니다. (variants can contain arrays)
  3. 는 각 세그먼트의 길이를 평가하고/길이 w 컬렉션을 문자열에 추가> 함수의 반환 값은 자격을 갖춘 문자열/w 모음입니다 2

항상 실행하기 전에 작업을 저장하십시오 모든 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)' –

+0

아, 이것은 사용자 정의 함수 (UDF)이다. "사용자 정의 기능에 액세스하기"(http://www.fontstuff.com/vba/vbatut01.htm)를 참조하십시오. 제 사과를 받아 들여야합니다. 실행해야하지만, 내일 언젠가 다시 체크인 할 것입니다.귀하의 프로젝트와 함께 행운을 빈다. – bernie

관련 문제