Ссылка на лист и ячейку для использования в формуле - PullRequest
0 голосов
/ 28 мая 2018

У меня есть рабочая книга, в которой я хочу сослаться на диапазон в первом листе (B1) для ввода формулы в ячейку во втором листе (B3).Моя проблема в том, что имя первого листа всегда будет меняться, поэтому я решил обойти это и создать переменную на основе ссылки на ячейку, которую могла бы использовать формула.Это то, что я имею до сих пор:

Sub GetCellAddress()

Dim Cell As Range
Dim CellAddress As String
Set Cell = ActiveWorkbook.Worksheets(1).Cells(1, 2)
CellAddress = Cell.Parent.Name & "!" & Cell.Address(External:=False)

With ActiveSheet
    Range("B3").Select
    ActiveCell.Formula = _
    "=CONCATENATE(""Balance Sheet"","" - "",MID(CellAddress,FIND("" "",CellAddress,FIND("","",CellAddress)+2)+1,256))"
End With

'MsgBox CellAddress

End Sub

Хотя MsgBox подтвердит, что у меня CellAddress - Sheet1! $ B1 $ 1 Я не могу передать эту ссылку в формуле, просто используя CellAddress, так как я получаю#НАЗВАНИЕ?ошибка, когда я использую это.Если я использую Sheet1! R [-2] C в качестве синтаксиса ActiveCell.FormulaR1C1, он работает нормально, но, как я уже объяснил, я хочу, чтобы код разрешил имя листа.Либо у меня неправильный синтаксис, либо, возможно, мой метод - неправильный способ ссылки на диапазон на другом листе.Может кто-нибудь показать мне, где я иду не так.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Использование индексных номеров листа вместо имен:

Насколько я понимаю, по крайней мере часть вашей проблемы заключается в том, что вам нужно иметь возможность ссылаться на лист, даже если имя листа будет менятьсявремя от времени.

Вы можете ссылаться на индекс листа вместо его имени.

В этом временном подпункте будут перечислены имена и номера индексов ваших существующих листов вНемедленное окно: Ctrl + G

Sub CheckIdx()
   Dim ws as Worksheet
   For Each ws In Sheets
     Debug.Print ".Index=" & ws.Index,".Name=" & ws.Name,".CodeName=" & ws.CodeName
   Next ws
End Sub

Индексные номера не изменятся при изменении имени.

Если у вас есть листс именем «data» с индексом 3, вы можете ссылаться на него по имени:

Sheets("data")

... или по номеру:

Sheets(3)

Редактировать:

Как указывал @Chris, рабочий лист Index чисел do изменяется, например, если изменяется порядок вкладок рабочего листа.

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

  • Просмотр Защита рабочей книги (только "Структура""необходимо проверить) OK

  • Пароль не обязателен, но не обязателен. Защита рабочей книги Структура не позволяет пользователям добавлять, перемещать, удалять или скрывать / отображать рабочие листы, и не совпадает с защитой рабочий лист , поэтому ящики можно редактировать и т. д.

    image


Другой методбыло бы использовать лист CodeName свойство вместо Index.Технически это может также быть изменено, но менее вероятно.

Я обновил функцию CheckIdx (см. Выше), чтобы включить CodeName, так что если вы хотите пойти по этому пути.

0 голосов
/ 28 мая 2018

После опробования вышеуказанных решений я использовал следующий синтаксис:

 Sheets(2).Range("B3").Formula = "=CONCATENATE(""Balance Sheet"","" - "",
 MID(" & Sheets(1).Name & "!B1,FIND("" "", " & Sheets(1).Name & "!B1,
 FIND("","", " & Sheets(1).Name & "!B1)+2)+1,256))"

, который, казалось, решал проблему, с которой я столкнулся при ссылке на лист.Таким образом, при использовании метода индекса @asleedawg нужно было просто поставить кавычки в нужном месте.

Необходимо соблюдать осторожность, если в имени листа есть пробелы.Если это так, добавьте одинарную кавычку вокруг двойной кавычки, ссылающейся на имя листа.

0 голосов
/ 28 мая 2018

Я подозреваю, что проблема может быть связана с синтаксисом адреса ячейки.Если вы ссылаетесь на ячейку A1 из «Пространство листа» в «Лист1», вы должны получить:

='sheet space'!A1

Обратите внимание, что имя листа переносится в «», когда имя листа имеетпустое пространство в нем.Когда имя листа состоит из одного слова, "" "автоматически форматируется, но все еще является действительным указателем (т. Е. ='Sheet1'!A1 допустимо)

Попробуйте:

CellAddress = "'" & Cell.Parent.Name & "'!" & Cell.Address(External:=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...