Обновление столбцов в строке последовательно после изменения одной ячейки - PullRequest
0 голосов
/ 20 марта 2012

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

Я пытаюсь найти способ обновить определенные столбцы в одной и той же строке при изменении этого первого значения;через событие Worksheet_SelectionChange, если возможно (или другим способом, если результат тот же).

Что я хочу сделать: я ввожу «стартовую» дату в столбец A .Мне нужно Excel, чтобы затем обновить столбец B той же строки на основе значения в столбец A .Затем мне нужно столбец C (та же строка) для обновления на основе нового значения в столбец B ;тогда мне нужно столбец D для обновления на основе значения в столбец C ;и так далее.Имеет ли это смысл?

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Я не понимаю, почему для этого потребуется какой-либо VBA.Просто напишите формулы в ваших клетках.Это довольно просто, правда.

Вот пример, в котором дата, введенная в столбце A, изменяет значение в столбце B, которое, в свою очередь, изменяет значение в столбце C и т. Д.

enter image description here

Строка 2 показывает результат формул, а строка 4 показывает сами формулы (извинения за плохое форматирование этих довольно длинных формул).

1 голос
/ 21 марта 2012

Вы, кажется, действительно хотите VBA, поэтому я выложу другой ответ (весьма отличный от моего другого).

Здесь я использую событие Worksheet_Change.Вызывает функцию, которая возвращает массив типа Variant, содержащий даты.Затем этот массив можно записать на лист, просто используя =.

Я считаю, что это немного сложнее, чем просто использование формул в ячейках, но у него есть преимущество в более чистом интерфейсе, который вам, кажется, нужен.

В модуле листа:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Target.Offset(0, 1).Resize(1, 3) = RelevantDates(Target.Value)
    End If

End Sub

В модуле кода:

Function RelevantDates(startDate As Date) As Variant
    Dim v As Variant
    ' Adapt to your needs:
    ReDim v(1 To 3)
    v(1) = startDate + 1 ' add one day
    v(2) = DateSerial(Year(v(1)), Month(v(1)), Day(v(1)) + 7) ' add one more week
    v(3) = DateSerial(Year(v(2)), Month(v(2)) + 1, Day(v(2))) ' add one month
    RelevantDates = v
End Function

Конечно, приведенное выше возвращает только 3 довольно тривиальные даты, но вы можете настроить этокак вы считаете нужным.

enter image description here

0 голосов
/ 20 марта 2012

В идеале, ваши более поздние столбцы должны содержать формулы на основе предыдущих столбцов.Что-то вроде =A2*100 для столбца B2 и =B2+88 для столбца C2.

Если это не так просто, потому что вычисления сложны, рассмотрим функции листа, например =ComplicatedFunction(A2) для столбца B2.

Function ComplicatedFunction(depended_on As Range)

    If depended_on.Value <> 0 Then
        PAYEES = 1
    Else
        PAYEES = 2
    End If
End Function

Если это невозможно, то вы правы - может помочь событие изменения рабочего листа, возможно, что-то вроде:

Public Sub Worksheet_Change(ByVal Target As Range)

    If Target.Column = 1 Then
        Debug.Print "change to column A encountered"
        Range(2,Target.Row).Value = Target.Value + 2
    ElseIf Target.Column = 2 Then
        Debug.Print "change to column B encountered"
        Range(3,Target.Row).Value = Target.Value + 99
    ElseIf Target.Column = 3 Then
        Debug.Print "change to column C encountered"
        Range(4,Target.Row).Value = Target.Value * 7
    End If

End Sub

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

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