查找并替换不正常的结果

时间:2013-08-29 01:15:30

标签: excel-vba replace vba excel

我想创建一个简单的(或者我认为)宏来重命名工作簿中的单元格。该工作簿包含大约十几张。首先,我从2个输入框开始,要求用户输入旧名称和新名称。然后我使用宏录制器来确定要在工作簿中替换的正确代码而不是单个工作表。我操纵代码以使用输入框中的字符串来确定“查找内容:”和“替换为:”值。以下是代码。

Option Explicit

'PROCEDURES-----------------------------------------------------------------------------------
Sub Rename_Project()

'---Procedure Description/Notes---------------------------------------------------------------
    'Macro Overview:
        'Simple macro that will rename all instances of a project in the workbook (all sheets).
        'The user will be prompted for the old project name then the new name.

'---Variable Declarations---------------------------------------------------------------------
Dim strPrjNew As String
Dim strPrjOld As String

'---Code--------------------------------------------------------------------------------------
    'Launch input box prompting for old PROJECT NAME
    strPrjOld = InputBox("Enter existing Project Name:", "Existing Project")
    If Len(strPrjOld) = 0 Then Exit Sub 'Pressed cancel

    'Launch input box prompting for new PROJECT NAME
    strPrjNew = InputBox("Enter NEW Project Name:", "New Project")
    If Len(strPrjNew) = 0 Then Exit Sub 'Pressed cancel
'
    Selection.Replace What:=strPrjOld, Replacement:= _
        strPrjNew, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False _
        , SearchFormat:=False, ReplaceFormat:=False

End Sub

正如您所看到的,这非常简单。我面临的问题是,只有当我手动转到replace命令然后将'Within:'选项更改为Workbook时,才会运行此问题。我可以在那之后整天运行宏而没有任何问题。有没有办法在宏中将选项设置为Workbook而不是Sheet?我在录制宏时做到了这一点,但是由于某些原因它似乎没有记录那部分???

如果在其他地方有所涉及,我会提前道歉。我搜索了很多次并且无法找到解决方案......这可能是由于我对要查找的内容缺乏了解。

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议使用Application.Selection,而不是使用将返回依赖于上下文的范围的Worksheet属性(根据您提供的描述,这似乎不是您的目的)对象作为替换的参考。

如果要替换工作簿的所有工作表,我建议迭代工作表:

Dim ws As Worksheet
For Each ws In Worksheets
    With ws
        .Cells.Replace What:=strPrjOld, Replacement:= _
            strPrjNew, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False _
            , SearchFormat:=False, ReplaceFormat:=False
    End With
Next ws

否则,如果您只想在一个工作表上替换:

Workseets("sheet1").Cells.Replace What:=strPrjOld, Replacement:= _
    strPrjNew, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False _
    , SearchFormat:=False, ReplaceFormat:=False