Макрос для поиска и замены имен полей

avatar
mycowan
8 апреля 2018 в 03:02
229
2
0

Мне нужно найти и заменить сотни неправильно названных имен полей (имен ячеек) в большой финансовой модели 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

"=Лист1!(" & activeCell.row & ";" & activeCell.Column & ")"

"Введенная вами формула содержит ошибку." и так далее.

Я не знаком с синтаксисом VBA, поэтому вторая пара опытных глаз была бы полезна.

РЕШЕНО: правильный синтаксис должен быть

.RefersToR1C1 = "=Sheet1!R" & activeCell.row & "C" & activeCell.Column & ""
Источник
LJ01
8 апреля 2018 в 03:29
0

Есть ли ошибка, вызванная наличием двух одинаковых операторов в этой строке? RefersToR1C1 = "лист1"... = "". Мне кажется немного забавным

shrivallabha.redij
8 апреля 2018 в 07:51
0

Используйте "," вместо ";" и проверьте. В VBA вам не нужно использовать точку с запятой.

QHarr
9 апреля 2018 в 06:26
0

Вы пробовали мое решение ниже? Не уверен, почему вы касаетесь RefersTo, если это имена, которые нужно изменить.

mycowan
9 апреля 2018 в 06:31
0

@QHarr Спасибо за ваше предложение. Но моя ошибка заключалась в том, как я строил String. См. комментарий «Решено».

QHarr
9 апреля 2018 в 06:32
0

Я видел это, но разве вы не меняете имена? Относится к остается прежним, не так ли? Клетки не двигаются?

mycowan
9 апреля 2018 в 07:41
0

@QHarr извините, я не понимаю, о чем вы говорите. Возможно, я неправильно использую RefersToR1C1. Но я обнаружил, что этот метод работает для изменения fieldName для ячеек.

QHarr
9 апреля 2018 в 07:42
0

Вы только хотите изменить имена правильно? Итак, Can в Канаду и т. Д...... ячейка остается прежней ... поэтому, если Can был A1, то Канада - это A1? Это правильно? Меняется только название?

mycowan
9 апреля 2018 в 07:52
0

@QHarr да. Ячейка не двигается и не изменяется. Меняется только fieldName. Аааа - кажется, я вижу, что делает ваш код. Это выглядит менее неуклюже. Я попробую.

QHarr
9 апреля 2018 в 07:54
0

Он должен быть более эффективным и хорошо сочетаться с возможностью отображения того, что было, на то, что есть.

Ответы (2)

avatar
QHarr
8 апреля 2018 в 06:55
3

Простите, если не так, но вы не подходите к этому боком? Вы хотите изменить существующие имена, а не места; То есть используйте сопоставление для переименования существующего.

Например, для переименования используйте словарь (вы можете использовать и другие структуры); Я хотел использовать .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

avatar
ashleedawg
8 апреля 2018 в 03:24
1

Для устранения неполадок, подобных этой, когда вы создаете строку для использования в другом месте, устраняйте неполадки, просматривая проблемную строку непосредственно перед возникновением ошибки.

В этом случае вы можете добавить строку непосредственно перед строкой, в которой возникает ошибка:

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

...затем, когда вы запустите свой код и получите сообщение об ошибке, перейдите в окно Immediate (Ctrl+G) и посмотрите, что <759961888010>Ex9961888010> > ты имеешь в виду.

Теперь вы видите свою ошибку?


При этом вы, должно быть, разместили свой код неправильно, так как я вообще не могу заставить его работать (чтобы получить ошибку 1004), так как эта строка шаткая:

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

Если я заменю строку и столбец числа, которые вы пытаетесь вставить, на 1234, тогда получится:

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

Я не могу дать абсолютное решение, не зная больше о том, что вы пытаетесь сделать, но очевидно, что это недопустимая команда (и, вероятно, не то, что вы хотели).


Обратите внимание, что ActiveCell.Row и ActiveCell.Column оба возвращают числа, и что Sheet1!(1,1) не относится к ячейке в Excel.

mycowan
9 апреля 2018 в 06:21
0

.RefersToR1C1 = "=Sheet1!R" & activeCell.row & "C" & activeCell.Column & "" нужны.