【问题标题】:Find/Replace cells in selected range having zero values (Formula cells) using VBA使用 VBA 查找/替换具有零值的选定范围内的单元格(公式单元格)
【发布时间】:2020-07-14 15:47:53
【问题描述】:

如何在 VBA 中使用“查找/替换”(或除循环之外的任何其他替代方法)将选定范围内的单元格替换为“0”到“1”。

注意:所选范围内的所有单元格均基于公式,其结果值为“0”。

谢谢, Prasanna M

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    发表您的评论:没有循环

    使用 Evaluate over the Range。 根据 Here

    对于未包装的值:

      Sub Test2()
    
      Dim rngData     As Range
        
      Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("B1:G650000")
      rngData = Evaluate("Substitute(" & rngData.Address & "," & "0" & ", " & "1" & ")")
       End Sub
    

    对于包装的值:

    Sub Test3()
    
    Dim rngData     As Range
    
    
    Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("B1:G650000")
    rngData = Evaluate("Substitute(" & rngData.Address & "," & "Char(34)&" & "0" & "& Char(34)" & ", " & "Char(34) &" & "1" & "& Char(34)" & ")")
    End Sub
    

    我似乎工作得很好。我第一次在不到 3 秒的时间内运行了 650000 行,从 B 到 G,第二次在 10 秒内(我还有其他事情也在运行)。第 3 次、第 4 次和第 5 次整个范围是 =CHAR(34)&RANDBETWEEN(0,1)&CHAR(34),第 4 次和第 4 次使用公式在范围内生成随机 0,1,第 5 次是选择 randbetwen 函数和查找,第 6 次是针对另一张表中的表进行查找。它总是在 15 秒内完成查找替换。我认为您在工作表中的公式与宏无关。它只看价值观,并改变价值观。范围的深度和长度对它更重要。

    我也注意到了;按照您之前的问题,您可以在其中建立您的条件:仅当/当范围 A 中的值是“Def”而不是“abc”时,才能将 0 更改为 1,因此它全部从 vba 子运行(但是你会丢失你的公式除非你也构建了那些)。

    第三个提议的替代解决方案:

    按行为整个表分配唯一的序列号或 id,按 A 列过滤 DEF,将这些 Def 行复制/剥离到 Sheet 2,在那里查找-替换 0 到 1,剪切/删除原始 Defs 行,粘贴 sheet2表 1 中的定义。按 id 排序。任务完成。 1 分钟。好的,也许是 2 个。

    【讨论】:

    • 感谢 Spyros,上面的代码有效。有没有其他不使用循环的方法。我有大量的单元格与相关单元格相关联,并附有公式,因此遍历每个单元格确实需要大量时间。
    • 我总是发现在这种情况下,执行以下操作更快更稳定,=SUBSTITUTE('Sheet1 (2)'!D19,CHAR(34)&"0"&CHAR( 34),CHAR(34)&"1"&CHAR(34)) & 对不起,我没有注意你的“没有循环”位,
    • 有办法做到这一点 - 在这里描述同样的问题 - 使用评估,usefulgyaan.wordpress.com/2013/06/19/…
    • 好的,我刚刚在 B1 到 G 650000 行范围内运行了下面的测试子/代码。用时不超过 3 秒。
    • 感谢您的帮助,斯派罗斯。我看到评估比使用循环更快。我之前也禁用了自动计算(Application.Calculation = xlManual)并重新启用它。这使代码运行呈指数级增长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多