Excel Restore по умолчанию формула листа - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь настроить динамический c Формула листа по умолчанию для восстановления Excel, которая принимает 2 переменные: адрес имени поля и адрес значения поля. На самом деле эта часть уже выполнена, но позвольте мне поделиться примером того, чего я хочу достичь: у меня есть лист с:

  • A1 [Название поля],
  • B1 [Поле значение, которое мне нужно восстановить по умолчанию при нажатии на ссылку C1]
  • C1 [Ячейка Гиперссылки с формулой VBA, которая обновляется только при нажатии из-за формулы #]:
=HYPERLINK("#restoreDefaultForRange(" & CELL("address",A1) & ",B1)","⭯")

Я поделюсь кодом VBA в конце поста. Формула работает, вместо B1 я могу даже использовать B1: B3, чтобы восстановить все ячейки в этой области, и я могу использовать 3 области, разделенные на «,», например: B1, B2: B4, B5, и он восстановит все ячейки в указанная область.

Проблема в том, что, хотя часть А1 является динамической c (и если я добавлю / удалю строки / столбцы, ссылка будет перемещаться вместе с ними), В2 - это просто текст, поэтому она не будет update.

Существует ли аналогичная формула, аналогичная CELL («адрес», A1), которая работает для региона, а не для отдельной ячейки, поэтому я могу сделать вторую часть формулы динамической? c также?

Чтобы ответить @Variatus, я добавлю еще несколько деталей: было бы неплохо, если бы это было так просто, но у меня есть несколько вариантов для покрытия:

  • Обе переменные (значение поля и цель поля) могут находиться в разных положениях относительно формулы соединения, A1 B1 C1 - самый простой пример, который я могу привести, но обычно это A2, B2: B5, B1 (поэтому нажмите на гиперссылка в B1 восстановит все ячейки в B2: B5 до их значение по умолчанию, а в A2 - имя поля)
  • Восстанавливаемыми ячейками может быть 1 ячейка или несколько ячеек, которые не могут быть равны 1 рядом с другой, например B2, B5, C10
  • Мне нужно создать формулу листа, чтобы мой менеджер, который не знает VBA, мог также обновить их, чтобы взять на себя часть моей рабочей нагрузки, потому что я был завален в последнее время и ненавижу позволять своим 3-летним часам смотреть телевизор.
VBA:
Function restoreDefaultForRange(targetName, targetRange As Range, Optional targetRange1 As Range, Optional targetRange2 As Range)
  Set restoreDefaultForRange = Selection
  restoreDefaultInputsForRange targetName, targetRange, targetRange1, targetRange2
End function
Private Sub restoreDefaultInputsForRange(targetName, targetRange As Range, Optional targetRange1 As Range, Optional targetRange2 As Range)
    Dim cellTitle, cellI As Range, rngI, cellCounter As Long
    Dim I As Long, MSG As String

    If budgetStatus = StatusInProgress Or budgetStatus = StatusReview Then
        cellTitle = targetName
        cellCounter = 0

        'GET MESSAGE BY LOOPING THROUGH OPTIONAL RANGES
        For Each rngI In Array(targetRange, targetRange1, targetRange2) ' FOR EACH OF THE RANGES, INCLUDING OPTIONAL
            If Not rngI Is Nothing Then                                 '  IF OPTIONAL IS DEFINED
                cellCounter = cellCounter + rngI.Cells.Count
                MSG = WorksheetFunction.TextJoin(", ", True, MSG, targetRange.Address(0, 0))
            End If
        Next
        MSG = "[ " & cellCounter & IIf(cellCounter > 1, " cells - ", " cell - ") & MSG & " ]"

        If vbYes = MsgBox("Restore the default formulas for: " & vbNewLine _
                    & "'" & cellTitle & "'" & vbNewLine _
                    & MSG & vbNewLine _
                    & "", _
                     vbYesNo, "Restore defaults ?") Then


            'UNIVERSAL RESTORE DEFAULT FOR TARGET CELL
            For Each rngI In Array(targetRange, targetRange1, targetRange2) ' FOR EACH OF THE RANGES, INCLUDING OPTIONAL
                If Not rngI Is Nothing Then                                 '  IF OPTIONAL IS DEFINED
                    For Each cellI In rngI.Cells                            '   FOR EACH CELL IN RANGE
                       restoreDefaultsForCell cellI                         '    RESTORE REFAULTS
                    Next
                End If
            Next

            setProgramAlertsOn
            restoreDefaultsMode = False

            MsgBox "Finished restoring defaults", vbOKOnly, "Done"
        End If
     Else
         messageRestoreDefaults
     End If

End Sub
...