Сохранить макрос листа, чтобы связать ячейки с изменением имени листа

У меня есть две ячейки с именами 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 ответа

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

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

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

а также

Worksheets(1).Range("INPUT_A_1") = Target.Value

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

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

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

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

Следуя вышеприведенному предложению 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 соответствует:

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

Другие вопросы по тегам