2016-09-15 124 views
1

我有幾列文本。此外,我有一個專欄,名爲Replacement text。此列包含其中有標記的字符串,如[1], [2], etc.用列文本替換文本標記

我想用標記行中的文本替換標記。

enter image description here

例如,Here you can find [5]變得Here you can find b,因爲[5]是標記列和字符串b的行中是用於標記物的價值。

我正在考慮創建一個大的if-else結構和substitute文本,這是非常容易出錯的。

但是,我懇請問您是否有更簡單的解決方案?

我感謝您的意見!

+2

是的,VBA很容易處理這個問題。你確實需要提供你到目前爲止所嘗試過的。請記住,SO不是一個代碼編寫服務,而是一個在編碼問題上得到尖銳問題的論壇。作爲開始的一點,您可以創建一個循環遍歷K列中的範圍,爲每個單元格提取標記並替換適當的字符串。一旦你有了你的代碼,如果你仍然有問題,你可以在SO上分享代碼來獲得有關你的問題的幫助。問候, – nbayly

回答

2

ReplaceBrackets1:使用RegEx提取列號。處理100K記錄需要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時間。處理100K記錄需要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 

轉換ReplaceBrackets1UDFgetReplacedText)後,我驚訝地發現,只用了2.53秒填寫爲100K記錄的配方。我不知道這樣做會比原來快。但擁有這麼多公式確實會減慢電子表格的速度。

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()'的起點。正則表達式會更好或分裂。 – 2016-09-15 21:48:38

+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 

(非常感謝托馬斯努力在兩種不同的方法上進行速度測試。)

+0

我跑了速度測試,它需要原來的78秒來處理100K記錄,但只有18秒,當你使用Instr來避免額外的替換。顯然,Excel會寫入單元格,不管是否有任何更改。 – 2016-09-16 06:17:54

+0

謝謝@ThomasInzina - 我會相應地更新答案。 – YowE3K