2016-11-10 30 views
0

我有一個這樣的輸入:VBA:搜索,保存和行會替換根據情況

gen,N,,,GONGD,,,N,,,KL,0007bd,,,,,,,,TAK, 
gen,N,,,RATEC,,,N,,,KP,0007bc,,,,,,,,TAZ, 
kap,N,,,EBFWE,N,,,,,,,,,KP,002bd4,,,KP,123000,,,,,N,,,,P 
kap,N,,,ST,WEIT,E3,EBFWEI,,,KP,002bd2,N,,,,,,KP,002bd3,,,,,,,Z,MG00,,,,,N,,,,P 

我有這樣的代碼:

Sub Find() 
Dim rFoundAddress As Range 
Dim sFirstAddress As String 
Dim x As Long 

With ThisWorkbook.Worksheets("Sheet1").Columns(1) 
    Set rFoundAddress = .Find("kap,*", LookIn:=xlValues, LookAt:=xlWhole) 
    If Not rFoundAddress Is Nothing Then 
     sFirstAddress = rFoundAddress.Address 
     Do 
      Dim WrdArray() As String 
      Dim text_string As String 
      Dim i As String 
      Dim k As String 
      Dim num As Long 
      text_string = rFoundAddress 
      WrdArray() = Split(text_string, "KP,") 
      i = Left(WrdArray(1), 6) 
      k = Left(WrdArray(2), 6) 

      Columns("A").Replace What:=i, _ 
         Replacement:=k, _ 
         LookAt:=xlPart, _ 
         SearchOrder:=xlByRows, _ 
         MatchCase:=False, _ 
         SearchFormat:=False, _ 
         ReplaceFormat:=False 

      Set rFoundAddress = .FindNext(rFoundAddress) 
     Loop While Not rFoundAddress Is Nothing And _ 
      rFoundAddress.Address <> sFirstAddress 
    End If 
End With 
End Sub 

我所試圖做的事: 找到所有以「kap」開頭的行,並在第一個「KP」後保存6個字符/ int,在第二個「KP」後保存爲6個chars/int。然後搜索整個數據集(列A中的數百行),如果它們包含字符串i,並且如果是,則將其替換爲字符串k。並循環這一點。所以它會用另一條以「kap」開頭的行來做同樣的事情。代碼給我錯誤消息:第二次涉及到「列(」A「)...」時,下標超出範圍。你能幫我嗎?

預先感謝您

+0

是的,我們可以幫你,但是這是[你昨天的職位(的延伸https://stackoverflow.com/questions/40508377/vba-search-for-value-in-a-column -after-specific-pattern),所以請在那裏移動你的修改。謝謝。 –

+0

@PierreChevallier嗨!通常的做法是什麼?只需從昨天編輯我的問題與這一個?或作爲新的評論或如何?謝謝 –

+0

對您以前的帖子發表評論,說明您收到的錯誤是什麼,如果它是由用戶的回答提供的,請在用戶的評論部分回覆,以便他/她可以幫助您。 –

回答

0

編輯讓所有查找的字符串出現相同的(「KAP,*」)

你不想修改(通過Replace())你的範圍通過

循環以便收集所有需要替換成陣列而通過陣列通過範圍循環,然後循環,使替換

喜歡如下:

Option Explicit 

Sub Find() 
    Dim rFound As Range 
    Dim sFirstAddress As String 
    Dim val As Variant 
    Dim nKap As Long 

    With ThisWorkbook.Worksheets("Sheet1").Columns(1) 
     nKap = Application.WorksheetFunction.CountIf(.Cells, "kap,*") '<--| count the occurrences of "kap,*" 
     If nKap > 0 Then 
      ReDim vals(1 To nKap) As Variant '<--| array that will collect all find/replace couples 
      nKap = 0 
      Set rFound = .Find("kap,*", LookIn:=xlValues, LookAt:=xlWhole) 
      sFirstAddress = rFound.Address 
      Do 
       nKap = nKap + 1 
       vals(nKap) = Split(Split(Split(rFound.text, "KP")(1), ",")(1) & "," & Split(Split(rFound.text, "KP")(2), ",")(1), ",") '<--| store the ith couple of find/replace values 
       Set rFound = .FindNext(rFound) 
      Loop While rFound.Address <> sFirstAddress 

      For Each val In vals '<--| loop through values to be replaced array 
       .Replace What:=val(0), _ 
         Replacement:=val(1), _ 
         LookAt:=xlPart, _ 
         SearchOrder:=xlByRows, _ 
         MatchCase:=False, _ 
         SearchFormat:=False, _ 
         ReplaceFormat:=False 
      Next val 
     End If 


    End With 
End Sub 

Function GetValues(txt As String) As Variant 
    If InStr(txt, "KP") > 0 Then GetValues = Split(Split(Split(txt, "KP")(1), ",")(1) & "," & Split(Split(txt, "KP")(2), ",")(1), ",") 
End Function 
+0

嗨!這將不完全是我想要的。爲什麼:如果我運行你的代碼,它會立即替換所有的東西。我需要做的是找到KP1,KP2,然後在任何地方替換它。然後在下一步搜索另一個KP1,KP2(讓我們稱之爲KP3,KP4),並將它替換到任何地方。因此它也可以在第一輪替換爲「KAP」時被替換。所以我的KP2可以在第二輪代碼中被KP4所取代。這就是爲什麼我需要它「循環循環」。我不知道我是否充分解釋:/ –

+0

我不明白你的意思。我的代碼並不是一次完成所有替換,而是循環遍歷每一對,並相應地進行替換。您是否嘗試過運行代碼並將其結果與「手動」替換進行比較? – user3598756

+0

@EduardDindoffer,你通過了嗎? – user3598756