Нужна помощь, чтобы формула появилась в клетке, если она удовлетворяет определенным условиям - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть код, как показано ниже, но он ничего не делает. Это должно дать =IF($G$12="adhoc","A"&C8&G14&C19,"") в ячейке c6, если ячейка g12 является "adhoc".

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
  ByVal Target As Range)

    ' See if the change is related to our cell
    If Not (Application.Intersect(Target, Range("G12")) _
      Is Nothing) Then
        If Range("G12") = "adhoc" Then
            Worksheet("data").Range("C6").Formula = "=IF($G$12=""adhoc"",""A""&C8&G14&C19,"""")"
        End If
    End If
End Sub

1 Ответ

0 голосов
/ 06 сентября 2018

Первая ошибка, с которой я столкнулся при запуске вашего кода, была из-за того, что Worksheet("data").Range("C6").Formula должно быть Worksheets("data").Range("C6").Formula - ему не хватало 's' в 'Worksheets'.

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

Работает нормально, если цель находится на листе, который изменился, и цель включает ячейку G12; однако, если активный лист не «данные», он снова выдаст ошибку, потому что, как только формула обновится на вкладке «данные», которая вызывает событие. Последующее событие вызовет вторичную ошибку, поскольку цель находится не на том же рабочем листе, что и диапазон, с которым вы пытаетесь ее пересечь: Intersect(Target, Range("G12")). Цель находится на листе «данные», а Range("G12") - Activesheet.

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

Если вы хотите, чтобы это выполнялось при изменении любого листа , вам нужно обновить логику вокруг пересечения, полностью указав ссылку на диапазон в Intersect(Target, Range("G12")) - например: Intersect(Target, sh.Range("G12"))

Чтобы обратиться к комментарию , который ничего не делает , это может быть связано с тем, что он срабатывает только в том случае, если изменение действительно было в ячейке G12. Если вы изменяете значения в любой другой ячейке, код выполняется, но if not intersect() is nothing предотвращает ожидаемое обновление формулы ячейки.

Рабочий код:

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
  ByVal Target As Range)

    ' See if the change is related to our cell
    If Not (Application.Intersect(Target, sh.Range("G12")) _
      Is Nothing) Then
        If Range("G12") = "adhoc" Then
            Worksheets("data").Range("C6").Formula = "=IF($G$12=""adhoc"",""A""&C8&G14&C19,"""")"
        End If
    End If
End Sub
...