2016-09-15 4 views
1

텍스트가있는 여러 열이 있습니다. 또한 Replacement text이라는 열이 있습니다. 이 열에는 마커가 포함 된 문자열이 들어 있습니다. 예 : [1], [2], etc.텍스트 마커를 열 텍스트로 바꿉니다.

마커를 마커 행에있는 텍스트로 바꾸고 싶습니다. [5]는 컬럼 마커이고 b 스트링의 행의 마커 값이기 때문에 예를 들면

enter image description here

Here you can find [5]Here you can find b된다.

if-else 구조를 만들려고했는데 매우 오류가 발생하기 쉬운 substitute 텍스트를 생각했습니다.

그러나보다 쉬운 해결책이 있는지 궁금한 점이 있습니까?

입력 해 주셔서 감사합니다.

+2

예, VBA가이를 쉽게 처리 할 수 ​​있습니다. 지금까지 시도한 것을 제공해야합니다. SO는 코드 작성 서비스가 아니라 코딩 문제에 대한 중요한 질문을 얻는 포럼이라는 것을 기억하십시오. 먼저 K 열의 범위에서 실행되는 루프를 생성하고 각 셀의 마커를 가져 와서 해당 문자열을 대체 할 수 있습니다.코드를 작성한 후에도 여전히 문제가 발생하면 SO 코드를 공유하여 문제에 대한 지원을받을 수 있습니다. 감사합니다, – nbayly

답변

2

ReplaceBrackets1 : RegEx를 사용하여 열 번호를 추출합니다. 처리 된 100,000 개의 레코드에는 15.03 초가 소요됩니다.


Sub ReplaceBrackets1() 
    'http://analystcave.com/excel-regex-tutorial/ 
    Dim c As Range 
    Dim Match As Object, Matches As Object, regex As Object 
    Set regex = CreateObject("VBScript.RegExp") 

    With regex 
     .Global = True 
     .Pattern = "\[(.*?)\]" 
    End With 

    For Each c In Range("K3", Range("K" & Rows.Count).End(xlUp)) 
     If regex.Test(c.Text) Then 
      Set Matches = regex.Execute(c.Text) 
      For Each Match In Matches 
       c.Replace Match, c.EntireRow.Columns(CInt(Match.SubMatches(0))) 
      Next Match 

     End If 
    Next 
End Sub 

ReplaceBrackets2 : 배열로 loades 데이터는 열 번호를 추출 정규식을 사용하며 단지 워크에 1 회 기록한다. 100,000 레코드를 처리하는 데 1.27 초가 걸립니다.


Sub ReplaceBrackets2() 
'http://analystcave.com/excel-regex-tutorial/ 
    Dim x As Long, column As Long 
    Dim arData, values 
    Dim Match As Object, Matches As Object, regex As Object 
    Set regex = CreateObject("VBScript.RegExp") 

    With regex 
     .Global = True 
     .Pattern = "\[(.*?)\]" 
    End With 

    values = Range("K3", Range("K" & Rows.Count).End(xlUp)) 
    arData = Range("A3", "L" & UBound(values, 1) + 2) 

    For x = 1 To UBound(values, 1) 
     If regex.Test(values(x, 1)) Then 
      Set Matches = regex.Execute(values(x, 1)) 
      For Each Match In Matches 
       column = Match.SubMatches(0) 
       values(x, 1) = arData(x, column) 
      Next Match 
     End If 
    Next 

    Range("K3", Range("K" & Rows.Count).End(xlUp)) = values 

End Sub 
UDF ( getReplacedText)에 ReplaceBrackets1를 변환 한 후 나는 단지 100K 레코드에 대한 수식을 채우기 위해 2.53 초 걸렸 찾을 놀랐다. 이 방법이 원본보다 빠를 방법이 확실치 않습니다. 그러나 많은 수식을 사용하면 실제로 스프레드 시트가 느려집니다.

getReplacedText : 정적 RegEx를 사용하여 데이터를 구문 분석합니다.

Function getReplacedText(ReplacementText As String, Source As Range) 
'http://analystcave.com/excel-regex-tutorial/ 
    Dim Match As Object, Matches As Object 
    Static regex As Object 
    If regex Is Nothing Then 
     Set regex = CreateObject("VBScript.RegExp") 

     With regex 
      .Global = True 
      .Pattern = "\[(.*?)\]" 
     End With 
    End If 

    If regex.Test(ReplacementText) Then 
     Set Matches = regex.Execute(ReplacementText) 
     For Each Match In Matches 
      ReplacementText = Replace(ReplacementText, Match, Source.Columns(CInt(Match.SubMatches(0)))) 
     Next Match 

    End If 

    getReplacedText = ReplacementText 
End Function 
+0

'column = ... '을'For column = 1 to 10'으로 변경할 수 있으므로 셀당 여러 세트의 괄호가 처리됩니다. – YowE3K

+0

이렇게하면 각 Instr()의 시작점을 변경해야합니다. 정규 표현식이 더 좋거나 분열 될 수 있습니다. –

+0

Instr은'column'의 값을 계산하는 데에만 사용되며,'column'의 가능한 모든 값을 반복 할 경우에는 필요하지 않습니다. (당신의 솔루션의 용기는'Cells (x, "k")입니다. 행 번호와 값을 알아야하는 "["& column & "]", Cells (x, column)). – YowE3K

3

이 답변은 매우 그의 대답의 토마스 Inzina의 첫 번째 버전에서 표절되지만 교체를 수행하는 매우 간단한 방법은 다음과 같습니다

Sub ReplaceText() 
    Dim r As Long 
    Dim c As Long 
    With ActiveSheet 
     For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row 
      For c = 1 To 10 
       .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value 
      Next 
     Next 
    End With 
End Sub 

위의 코드를 사용하여 치환을하려고합니다 모두 열두 열.

토마스가 언급했듯이있는 교체를 빨리 크기 순서가 될 수 있으므로 필요하며, 경우, 다음 코드는 그래서 더 나은 솔루션 의심 할 여지없이, 대체 할 만합니다

Sub ReplaceText() 
    Dim r As Long 
    Dim c As Long 
    With ActiveSheet 
     For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row 
      For c = 1 To 10 
       If Instr(.Cells(r, "K").Value, "[" & c & "]") > 0 Then 
        .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value 
       End If 
      Next 
     Next 
    End With 
End Sub 

(많은 감사에가 Thomas는 두 가지 다른 방법으로 속도 테스트를 수행하기 위해 노력했습니다.)

+0

나는 스피드 테스트를했다. 원래의 78 초가 100K 레코드를 처리하지만, Instr을 사용하면 여분의 교체를 피할 때 18 초 밖에 걸리지 않는다. 명백하게 Excel은 변경 사항이 있는지 여부에 관계없이 셀에 기록합니다. –

+0

감사합니다. @ThomasInzina - 그에 따라 답변을 업데이트하겠습니다. – YowE3K

관련 문제