2016-11-10 40 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