Как я могу создать формулу, используя VBA для ссылки на динамически смещенный диапазон ячеек? - PullRequest
0 голосов
/ 28 ноября 2018

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

Example Image

Примечание: «---» в верхней части листа представляет несколько месяцев одного и того же отчета за прошедшее время

Как вы можете видеть на изображении, связанном выше, я выделил дваразделы.Мне нужно сделать столбец G суммой E и F из предыдущих номеров отчета.Поскольку каждый день добавляется новый набор данных, я не могу ссылаться на конкретные ячейки, и они должны быть динамическими.Большая проблема здесь в том, что мое количество клиентов будет меняться очень часто.Он будет только идти вверх и всегда будет в том же порядке;даже если клиент потеряет, он остается в отчете в том же месте.

Мои единственные теории о том, как это сделать:

  1. Найти второй до последнего экземпляр клиентаA и определите rng на основе смещенных ячеек справа.Моя проблема с этим заключается в том, что, насколько я понимаю, даже заполнение этой формулы полностью даст мне одно значение.
  2. Добавление =SUM((INDIRECT(ADDRESS(ROW()-5,COLUMN()-2))):(INDIRECT(ADDRESS(ROW()-5,COLUMN()-1)))) к пустым ячейкам.Моя проблема в том, что -5 в смещении может измениться, и даже определение его по количеству пустых ячеек вызовет ошибку при первом входе нового клиента.

Любойпонимание будет очень цениться.И, пожалуйста, дайте мне знать, если у вас есть какие-либо уточняющие вопросы;Я с удовольствием отвечу / отредактирую оригинальное сообщение по мере необходимости.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

@ Gserg получил ответ впереди меня, и его решение - это одна хорошая элегантная линия, хотя я думаю, что это основано на предположении, что там будут предметы каждый день (если я не ошибаюсь?), И ваш скриншот подсказываетони не могут быть последовательными днями все время.

Если вы все еще ищете решение VBA, я бы сделал что-то вроде этого:

Option Explicit    
Sub addOffsetFormula()

    'Declare and set your workbook
    Dim wb As Workbook: Set wb = ActiveWorkbook

    'Declare and set your spreadsheet
    Dim shData As Worksheet: Set shData = wb.Worksheets("Data")

    'Set your last row/column for a dynamic aproach
    Dim lRow As Long: lRow = shData.Cells(1, 1).End(xlDown).Row
    Dim lCol As Long: lCol = shData.Cells(1, shData.Columns.Count).End(xlToLeft).Column

    'Declare some further variables to help
    Dim R As Long, X As Long
    Dim sumFormula As String

    'Declare and set your array to hold your data - much faster to iterate through the array than spreadsheet itself
    Dim tblData(): tblData = shData.Range(shData.Cells(1, 1), shData.Cells(lRow, lCol))

    For R = LBound(tblData) + 1 To UBound(tblData)              'Iterate through your data
        For X = LBound(tblData) + 1 To UBound(tblData)          'Iterate through the same data again
            If tblData(R, 4) = tblData(X, 4) And X > R Then     'Check for match with the next client found (assuming clients are unique)

                'Set your formula to a variable, helps with debugging
                sumFormula = "=SUM(R[-" & X - R & "]C[-2]+R[-" & X - R & "]C[-1])"

                'Assign the formula to the respective cell _
                    If the spreadsheet is massive, you might need to add some optimisation _
                    (ie: assign everything to an array first, then dump into the spreadsheet)
                shData.Cells(X, 7).FormulaR1C1 = sumFormula
            End If
        Next X
    Next R

End Sub

Примечание: это не будетдобавьте что-нибудь к первым нескольким строкам или новым клиентам, так как ранее не с чем сопоставлять, но я ожидаю, что это должно работать так же и с любой формулой.

0 голосов
/ 28 ноября 2018

Вероятно, он может быть дополнительно оптимизирован путем предварительного вычисления диапазона, но наивной версией будет:

=SUMIFS([Outstanding Mail],[Date],LOOKUP([@Date]-1,[Date]),[Customer],[@Customer])
+SUMIFS([Outstanding Faxes],[Date],LOOKUP([@Date]-1,[Date]),[Customer],[@Customer])

, которая основывается на том факте, что ваши даты отсортированы и что LOOKUP возвращаетпоследнее значение, которое не превышает предоставленное значение, поэтому [@Date]-1 заставляет его искать самую большую дату, которая меньше предоставленной даты.Не будет работать в несортированном диапазоне.

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