Привет, форумчане!
Я пытаюсь реализовать что-то похожее на то, что описано в этой статье: .
Кроме того, хочу добавить функционал: чтобы при изменении любого значения в ячейках C1, C2, C3 или C4 на листе Device_LIST_GENERATION остальные значения автоматически обновлялись сверху вниз. Для трёх значений (C2,C3,C4) всё работает нормально, но когда добавляю четвёртое (C1) — перестаёт функционировать. Плюс, не пойму, почему при вставке имени диапазона по формуле OFFSET (имя Building) в ячейку, например, C2, вылетает ошибка.
На листе есть код. Буду очень признателен, если кто-то подскажет, в чём может быть проблема и как это пофиксить! Заранее спасибо за помощь.
Я пытаюсь реализовать что-то похожее на то, что описано в этой статье: .
Кроме того, хочу добавить функционал: чтобы при изменении любого значения в ячейках C1, C2, C3 или C4 на листе Device_LIST_GENERATION остальные значения автоматически обновлялись сверху вниз. Для трёх значений (C2,C3,C4) всё работает нормально, но когда добавляю четвёртое (C1) — перестаёт функционировать. Плюс, не пойму, почему при вставке имени диапазона по формуле OFFSET (имя Building) в ячейку, например, C2, вылетает ошибка.
На листе есть код. Буду очень признателен, если кто-то подскажет, в чём может быть проблема и как это пофиксить! Заранее спасибо за помощь.
| Код |
|---|
Private Sub Worksheet_Change(ByVal Target As RANGE)
If Not Intersect(Target, Me.RANGE("C1:C4")) Is Nothing Then
Application.EnableEvents = False ' Избежать рекурсии
Call UpdateLinkedCells(Target)
Application.EnableEvents = True
End If
End Sub
Sub UpdateLinkedCells(Target As RANGE)
Dim wsGEN As Worksheet
Dim wsDB As Worksheet
Dim lastRowDB As Long
Dim r As Long
Dim found As Boolean
Dim currentC2 As String
Set wsGEN = ThisWorkbook.Sheets("Device_LIST_GENERATION")
Set wsDB = ThisWorkbook.Sheets("DB_C0")
lastRowDB = wsDB.Cells(wsDB.Rows.Count, "A").End(xlUp).row
found = False
' Сохраняем текущее значение C2 перед изменением
currentC2 = UCase(Trim(wsGEN.RANGE("C2").Value))
If Target.Address = "$C$2" Then ' TAG_RELEVANT_EQUIPMENT changed
Dim selRelevant As String
selRelevant = UCase(Trim(wsGEN.RANGE("C2").Value))
For r = 2 To lastRowDB
If UCase(Trim(wsDB.Cells(r, 3).Value)) = selRelevant Then ' Column C in DB_C0
wsGEN.RANGE("C3").Value = wsDB.Cells(r, 5).Value ' Discipline to C3
wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value ' TAG_ITEM_NUMBER_CCMS to C4
found = True
Exit For
End If
Next r
ElseIf Target.Address = "$C$3" Then ' Discipline changed
Dim selDisc As String
selDisc = UCase(Trim(wsGEN.RANGE("C3").Value))
' Сначала ищем запись с текущим C2 и новым значением Discipline
For r = 2 To lastRowDB
If UCase(Trim(wsDB.Cells(r, 3).Value)) = currentC2 And _
UCase(Trim(wsDB.Cells(r, 5).Value)) = selDisc Then
wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value ' Обновляем только C4
found = True
Exit For
End If
Next r
' Если не нашли комбинацию C2 + новая дисциплина, тогда меняем C2
If Not found Then
For r = 2 To lastRowDB
If UCase(Trim(wsDB.Cells(r, 5).Value)) = selDisc Then ' Column E
wsGEN.RANGE("C2").Value = wsDB.Cells(r, 3).Value ' TAG_RELEVANT to C2
wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value ' TAG_ITEM to C4
found = True
Exit For
End If
Next r
End If
ElseIf Target.Address = "$C$4" Then ' TAG_ITEM_NUMBER_CCMS changed
Dim selTag As String
selTag = UCase(Trim(wsGEN.RANGE("C4").Value))
For r = 2 To lastRowDB
If UCase(Trim(wsDB.Cells(r, 2).Value)) = selTag Then ' Column B
wsGEN.RANGE("C2").Value = wsDB.Cells(r, 3).Value ' TAG_RELEVANT to C2
wsGEN.RANGE("C3").Value = wsDB.Cells(r, 5).Value ' Discipline to C3
found = True
Exit For
End If
Next r
End If
' Если не найдено, можно добавить логику очистки, например:
' If Not found Then wsGen.Range("C2:C4").ClearContents
End Sub
|