Excel VBA: зависимые ячейки
От: Dimonka Верблюд  
Дата: 30.04.19 08:45
Оценка:
Привет всем. Хочется немного не стандартного.
Хочу упростить отображение зависимых ячеек. Т.е. ткнул на ячейку, нажал на кнопку и посмотрел, что к ячейке привязано. Стандартных средств недостаточно, потому что интересуют в основном связи с другими листами.

Получить список ячеек не проблема, даже поделюсь здесь — может кто подскажет как это дело ускорить.
  Кусочек кода
Private Const OneSec = 1 / (24# * 60# * 60#)
Private Const mArrayStep = 1000

Private Function intCellAddress(R As Range) As String
    intCellAddress = R.Parent.Name & "!" & R.Address
End Function

Private Sub EnableScrollbars(Enable As Boolean)
    With ActiveWindow
        .DisplayHorizontalScrollBar = Enable
        .DisplayVerticalScrollBar = Enable
    End With
End Sub

Private Function GetDependentCells(myCell As Range) As Variant
    GetDependentCells = ""
    myCell.Parent.ClearArrows
    myCell.ShowDependents
    CellAddress = intCellAddress(myCell)
    
    EnableScrollbars False
    
    Dim ArraySize As Long, target As Range
    ArraySize = mArrayStep
    ReDim a(1 To ArraySize) As String
    
    i = 1
    k = 1
    tTime = Now()
    On Error GoTo l_exit
    Do
        myCell.NavigateArrow False, i
        Set target = myCell.NavigateArrow(False, 1, i)
        s = intCellAddress(target)
        i = i + 1
        If s <> 1 Then
            a(k) = s
            k = k + 1
            If k >= ArraySize Then
                ArraySize = ArraySize + mArrayStep
                ReDim Preserve a(1 To ArraySize)
            End If
        End If
        If (Now() - tTime) > OneSec Then
            Application.StatusBar = "Checking varaible '" & mVariable & "' usage: " & i
            DoEvents
            tTime = Now()
        End If
    Loop While True
l_exit:
    EnableScrollbars True
    myCell.Parent.ClearArrows
    
    ReDim Preserve a(1 To i - 1)
    GetDependentCells = a
End Function

Хочется связать регионы с одинаковыми формулами, чтобы не флудить длинными списками с одинаковой формулой.
В качестве простого примера:
Ячейка A1 содержит формулу = MyCell * B1
Ячейка A2 содержит формулу = MyCell * B2
Ячейка A3 содержит формулу = MyCell * B3
Я хочу распознать такую последовательность и объединить ячейки в A1:A3 и присвоить им только первую формулу самой верхней или самой правой ячейки. В данном случае = MyCell * B1

На stackoverflow нашёл примерный подход, как можно сравнить формулы:
SameFormula = rng1.FormulaR1C1 = rng2.FormulaR1C1

Но сравнивать всё со всем конечно же совсем не хочется. Понятно, что сравнивать надо только внутри одного листа и после сортировки ячеек.
Может у кого готовый код есть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.