Excel VBA Range.Replace可对整个工作簿进行操作 您所在的位置:网站首页 怎样搜索整个工作簿 Excel VBA Range.Replace可对整个工作簿进行操作

Excel VBA Range.Replace可对整个工作簿进行操作

2024-07-01 21:04| 来源: 网络整理| 查看: 265

我在Range.Replace上遇到问题。众所周知,当在Excel工作表界面中时,我们可以将Match Case设置为True或False来查找和替换,当再次查找或替换时,Excel会记住我们的Match Case设置。如果我们使用VBA中的"查找并替换"以及其他设置(例如LookIn,LookAt),则情况也是如此。

请注意,使用Excel工作表界面查找和替换还记得"内"选项(设置为"工作表"或"工作簿")。我的问题是,如果我从工作表界面中使用"查找和替换",并且将"内部"选项设置为"工作簿"(而不是默认的"工作表"),则Excel VBA也会记住该选项并执行工作簿级别的替换,即使我正在调用Range.Replace(即,我只希望替换发生在特定范围内)。

我可以复制如下:

用三个空白表创建新的工作簿。 在工作表1中,在$ A $ 1中输入" this";在工作表2中,在$ A $ 1中输入" that"。 查找"垃圾邮件",将"内部"设置为"工作簿",并取消选中所有其他选项,并保留默认设置。这什么也找不到。关闭对话。 在工作表3中,选择一个范围,例如$ A $ 1:$ K $ 10并使此工作表保持活动状态。 打开VB编辑器,然后输入:Selection.Replace"th","help"。

您会发现(很好,我确实),即使我们使用的是Range.Replace无效表1和2上的" th"实例也已更改-看来" Within"选择已被记住,并且" Range.Replace"的" Range"部分被忽略。

有什么办法可以覆盖吗?还是强迫Excel忘记"内部"设置?

我正在Windows 10上使用Office Professional Plus 2016。

请帮忙!

相关讨论 似乎答案是先在相关工作表上先Find,然后是Replace....。快速的Google搜索:vbaexpress.com/forum/和ozgrid.com/forum/forum/help-forums / excel-general / 指定所有可选参数,您将覆盖上一个Range.Find调用中的"记住的"值。 我怀疑问题的一部分是通过Selection调用Range.Replace的。 @MathieuGuindon-不,我可以不使用Selection而复制问题。我不确定是否将其称为bug,但是由于"查找/替换"对话框中的Within不是可选参数,因此我认为要强制替换为工作表的VBA解决方案是先执行Sheet.Range.Find,然后执行。 在任何情况下,@ BigBen在不指定可选参数的情况下调用Range.Find或Range.Replace都在请求出错:愚蠢的是,这些方法的字面意义是为"记住"这些可选参数的值而设计的,并且可以在未指定时重用它们(无论是否存在"内部"问题)。尝试使用Sheet1.Cells.Find似乎有效地将"内部"从"工作簿""重置"为" Sheet",因此我对Selection表示怀疑,我几乎从未使用过。 @MathieuGuindon我同意您的可选参数。我什至在指定Sheet时也重复了这个问题-即在工作表1和2上执行Sheet3.Cells.Replace替换的值...似乎很愚蠢,必须先Find,但这似乎是唯一的解决方法。 很好的替代方法是将范围转储到数组中,迭代并更新该数组,然后将修改后的数组转储回工作表中。 是的,这是一个不错的选择。 感谢所有这些-我将@BigBen的答案标记为已接受。我同意人们所说的一切-我总是在VBA中为"查找和替换"指定所有可选参数,并且我从不使用"选择"(我仅将其用于示例,因为它更容易在即时窗口中键入内容)。实际上,我几乎总是听从Matthieu Guidons的建议,读入内存,处理数据,然后再次写出;但是在这种情况下,使用Range.Replace似乎更容易。然后我发现在不同的工作表中发生了变化!再次感谢

如您所述,"查找和替换"还记住"内部"选项,在Range.Find或Range.Replace中没有(可选)参数。

如果要绝对保证仅在有问题的Sheet上进行替换,那么从"工作簿"中将"内部"选项重置为"工作表"的诀窍是先尝试执行Range.Find,然后再尝试执行。

继续您的示例,下面的代码将仅替换Sheet1上的th。 但是,如果注释掉第二行,则通过复制上面的第三步,将"内部"选项设置为"工作簿",然后重新运行此代码,它将替换Sheet1和Sheet2上的th。

12345Sub SheetOnlyReplace()     Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")     Dim rng As Range: Set rng = ThisWorkbook.Sheets("Sheet1").Cells.Find("Th")     ws.Cells.Replace"th","help", xlPart, xlByRows, False, False, False, False End Sub

而且,因为正如显示的那样,查找/替换可能是不可预测的,所以您可以按照@Mathieu Guindon的建议,将范围中的值读入数组,遍历数组进行更改,然后将修改后的值写回到工作表中。

相关讨论 谢谢。 很烦人(至少可以说),我每次使用Range之前都要使用Range.Find。以防万一我的用户刚刚执行了Workbook查找; 但是现在我知道了,我可以选择我的方法了(我通常按照您的建议读入内存,进行处理,然后编写)。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有