【问题标题】:VBA: Search, save and replace by rows according to conditionsVBA:根据条件按行搜索、保存和替换
【发布时间】:2017-03-24 10:47:40
【问题描述】:

我有这样的输入:

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 保存为 i,将第二个“KP”之后的 6 个 chars/int 保存为 k。然后搜索整个数据集(A 列中的数百行)是否包含字符串 i,如果是,则将其替换为字符串 k。并循环这个。所以它会对以“kap”开头的另一行做同样的事情。该代码给了我错误消息:第二次涉及“列(“A”)...”时下标超出范围。你能帮帮我吗?

提前致谢

【问题讨论】:

  • 是的,我们可以帮助您,但这是your post of yesterday 的扩展,所以请将您的修改移到那里。谢谢。
  • @PierreChevallier 嗨!这样做的常见方法是什么?只需用这个编辑我昨天的问题吗?或作为新评论或如何?谢谢
  • 评论您之前的帖子,说明您遇到的错误是什么,如果用户的回答提供了它,请在用户的评论部分回复,以便她/他可以帮助您。
  • @PierreChevallier 好的,它就在那里。我会在 5 分钟内删除这个问题。谢谢
  • 这个问题在另一个用户的建议下在这里重新打开。谢谢。

标签: vba replace error-handling


【解决方案1】:

编辑以使所有搜索到的字符串都相同(“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

【讨论】:

  • 嗨!这不正是我想要的。原因:如果我运行您的代码,它将立即替换所有内容。我需要做的是找到KP1,KP2然后到处替换。然后在下一步中搜索另一个 KP1、KP2(我们称之为 KP3、KP4)并在任何地方替换它。因此,它也可以在第一轮已经替换的“KAP”中替换。所以我的KP2可以在第二轮代码中用KP4代替。这就是为什么我需要它是“循环中的循环”。我不知道我解释得够不够:/
  • 我不明白你。我的代码不会一次完成所有替换,但它会遍历每一对并一个接一个地进行相应的替换。您是否尝试过运行代码并将其结果与“手动”替换进行比较?
  • @EduardDindoffer,你成功了吗?
  • 您好,很抱歉,我需要解决另一个问题。明天我会来这里并再次检查您的代码。感谢您的帮助
  • 嗨!所以我试过了。我收到一个错误:运行时错误“91”:对象变量或未设置块变量。
猜你喜欢
  • 2014-01-24
  • 2015-02-15
  • 2018-05-15
  • 2012-06-12
  • 1970-01-01
  • 2022-11-15
  • 2020-08-17
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多