Как мне обработать код VBA для добавления добавленных строк и столбцов? - PullRequest
1 голос
/ 02 ноября 2019

Я хотел бы изменить приведенный ниже код, чтобы при изменении диапазона (F6: F42) добавлялись добавленные строки / столбцы. Я бы предпочел не менять диапазон на таблицу Excel, но мог бы при необходимости.

    Private Sub Worksheet_Change(ByVal Target As Range)

    On Error Resume Next
    Dim xSht As Worksheet
    Set xSht = ActiveWorkbook.ActiveSheet
    Dim xRg As Range, xCell As Range
    Set xRg = xSht.Range("F6:W42")
    If Not Intersect(Target, Range("F6:W42")) Is Nothing Then
        For Each xCell In xRg
            If xCell = "" Then
                xCell.Value = xCell.Offset(0, 35).Value
            End If
        Next xCell
    End If
End Sub>

Для тех, кто заинтересован, у меня есть две идентичные таблицы цен (не официальные таблицы Excel). Вторая таблица (столбцы AO: BF) используется в качестве таблицы цен по умолчанию. Первая таблица просто извлекает значения из второй таблицы с помощью простых формул, например, первая ячейка имеет формулу = AO6 и т. Д. Если пользователь решает снизить цену в течение пары месяцев, он может ввести новую цену в первую таблицу,Ячейка подсвечивается через условное форматирование, чтобы напомнить ему, что цена была изменена. Однако после того, как продажа закончится, он может просто нажать «Удалить» и вернуться к первоначальной цене.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Хитрость заключается в том, чтобы использовать « Именованные диапазоны » на ваших листах.

Set xRg = xSht.Range("F6:W42")

может стать

Set xRg = xSht.Range("UsuablePrices")  ' <-- I made the name up

Теперь, когда кто-либо добавляет в ячейки(контролируемым и правильным образом) именованный диапазон изменяется, но вам не нужно изменять свой код.

Например, строка вставляется в строку 41. Ваш именованный диапазон теперь относится к «F6: W43», но ваш код остается как Set xRg = xSht.Range("UsuablePrices").

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

0 голосов
/ 02 ноября 2019

Не используйте On Error Resume Next, это плохая практика. Существует способ отловить ошибку, если она существует, и обработать ее соответственно . В любом случае, что касается вопроса - таблица - это единственно возможный вариант, если вы хотите оставаться «чистым».

Без таблицы следует записать куда-нибудь добавленные столбцы и строки. Например, в дополнительном листе «Журнал». Затем рассчитайте необходимый диапазон. Но это слишком много вычислений, и реализация будет кошмаром.

Вот реализация таблицы без "On Error ...":

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim xRg As Range
    Dim xCell As Range
    Set xRg = Range("myTable")

    If Not Intersect(Target, xRg) Is Nothing Then
        For Each xCell In xRg
            If xCell = "" Then
                xCell.Value = "Something blue"
            End If
        Next xCell
    End If

End Sub

Более того, я неЯ уверен, что для этого нужно циклически проходить через xRg, а не через "Target", но я думаю, что для этого есть веская причина.

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