Я пытаюсь настроить динамический 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