Сохранить макрос листа, чтобы связать ячейки с изменением имени листа - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть две ячейки с именами INPUT_A_1 и INPUT_A_2 в листах с именами «Лист1» и «Лист2» ​​соответственно, которые я связываю (изменение одной ячейки вызывает такое же изменение в другой) со следующими листовыми макросами, которые работают очень хорошо:

В листе 1:

Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 If (Target.Address = Range("INPUT_A_1").Address) Then
  Sheets("Sheet2").Range("INPUT_A_2") = Target.Value
 End If
 Application.EnableEvents = True
End Sub

и в Листе 2:

Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 If (Target.Address = Range("INPUT_A_2").Address) Then
  Sheets("Sheet1").Range("INPUT_A_1") = Target.Value
 End If
 Application.EnableEvents = True
End Sub

Моя проблема в том, что из-за синтаксиса Sheets ( sheetname ). Range ( rangename ), если я решу переименовать одну или обе таблицы, то мне придется изменить макросы соответственно. Есть ли какой-то обходной путь, который не включает в себя вызов ячеек по имени соответствующего листа? Эта проблема становится все более очевидной, когда у меня есть 3 или более связанных ячеек в каждой отдельной таблице.

Спасибо

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Следуя вышеприведенному предложению Storax, вот исправление, которое я реализовал:

На первом листе (который можно переименовать по желанию):

Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 If (Target.Address = Range("INPUT_A_1").Address) Then
  SheetFromCodeName("Sheet2").Range("INPUT_A_2") = Target.Value
 End If
 Application.EnableEvents = True
End Sub

и на Втором листе(который также может быть переименован по желанию):

Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 If (Target.Address = Range("INPUT_A_2").Address) Then
  SheetFromCodeName("Sheet1").Range("INPUT_A_1") = Target.Value
 End If
 Application.EnableEvents = True
End Sub

И, наконец, в любом модуле:

Public Function SheetFromCodeName(CodeName$) As Worksheet
    Dim sh As Worksheet
    For Each sh In ThisWorkbook.Sheets
        If sh.CodeName = CodeName Then
           Set SheetFromCodeName = sh
           Exit For
        End If
    Next sh
End Function

Ассоциация SheetName и CodeName соответствует:

enter image description here

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

0 голосов
/ 24 апреля 2018

Фактически вместо этого можно использовать индекс листа, что устраняет необходимость в процедуре SheetFromCodeName в целом.

Синтаксис в этом случае на первом и втором листах будет

Worksheets(2).Range("INPUT_A_2") = Target.Value

и

Worksheets(1).Range("INPUT_A_1") = Target.Value
0 голосов
/ 24 апреля 2018

Обходной путь - использовать вместо кодовое имя рабочего листа

Использование кодового имени рабочего листа

Лучший способ доступа к рабочему листу - использовать кодовое имя.Каждый лист имеет имя листа и кодовое имя.Имя листа - это имя, которое отображается на вкладке листа в Excel.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...