用于查找和替换字段名称的宏

时间:2018-04-08 03:02:22

标签: excel vba

我需要在大型Excel财务模型中查找并替换数百个错误名称的字段名称(单元名称)。我正在尝试构建此宏子例程以查找给定的字段名称并将其替换为正确的字段名称。

Sub FindReplaceFieldName()

Dim orgFieldName As String
Dim replFieldName As String

orgFieldName = "CAN"
replFieldName = "Canada"

Application.Goto Reference:=orgFieldName

With ActiveWorkbook.names(orgFieldName)
    .Name = replFieldName
    .RefersToR1C1 = "=Sheet1!(" & activeCell.row & ";" & activeCell.Column &")".Comment = ""
End With
ActiveWorkbook.Save

End Sub

找到并替换字段名称,但此处抛出运行时错误1004

  

" = Sheet1!("& activeCell.row&&#34 ;;"& activeCell.Column&    ")"

"您输入的公式包含错误。"等等。

我不熟悉VBA语法,所以第二对经验丰富的眼睛会有所帮助。

已解决:正确的语法应为

.RefersToR1C1 = "=Sheet1!R" & activeCell.row & "C" & activeCell.Column & ""

2 个答案:

答案 0 :(得分:2)

如果错了,请原谅我,但是你不接近这个吗?您想要更改现有名称而不是修改位置; Ergo ,使用映射重命名现有的。

例如,使用字典重命名(您可以使用其他结构);我想利用字典的.Exists,所以只尝试有效的替换。你甚至可以在工作表中循环一个范围来填充你的字典。或者直接将范围读入数组并将数组作为键/值转储到字典中。

<强>代码:

Option Explicit

Public Sub RenameNamedRanges()

    Dim currName As Name
    Dim replaceDict As Object
    Set replaceDict = CreateObject("Scripting.Dictionary")

    replaceDict.Add "CAN", "Canada"
    replaceDict.Add "FR", "France"
    replaceDict.Add "DE", "Deutschland"

    For Each currName In ThisWorkbook.Names

        If replaceDict.Exists(currName.Name) Then

            currName.Name = replaceDict(currName.Name)

        End If

    Next currName

End Sub

<强>之前:

Before

<强>后:

After

答案 1 :(得分:1)

要解决此类问题,您要在其他地方构建要在其他地方使用的字符串,请在错误发生之前查看问题字符串进行故障排除。

在这种情况下,您可以在收到错误的行之前添加一行:

Debug.Print "=Sheet1!(" & activeCell.row & ";" & activeCell.Column & ")"

...然后,当您运行代码并获得错误时,请转到立即窗口( Ctrl + G )并查看 Excel认为的内容你的意思。

您现在能看到错误吗?

话虽如此,你必须错误地发布你的代码,因为我无法让它运行(获得错误1004),因为这条线路很不稳定:

.RefersToR1C1 = "=Sheet1!(" & activeCell.row & ";" & activeCell.Column &")".Comment = ""

如果我更换行数字,您尝试使用1234插入,则会显示:

.RefersToR1C1 = "=Sheet1!(1234;1234)".Comment = ""

我无法在不了解您尝试做什么的情况下提供绝对解决方案,但显然这是一个无效的命令(可能不是您的意图)。

请注意ActiveCell.RowActiveCell.Column都返回数字Sheet1!(1,1)不是我们在Excel中引用单元格的方式。