Excel: проверить зависимости листа в рабочей книге? - PullRequest
6 голосов
/ 21 февраля 2011

Я в процессе рефакторинга огромной рабочей книги со множеством устаревших частей, избыточных вычислений, взаимозависимостей и т. Д.

По сути, я пытаюсь удалить ненужные листы и внедрить некоторый правильный поток информации в рабочую книгу. Есть ли хороший способ извлечь зависимости между листами (с VBA)?

Спасибо Martin

Ответы [ 3 ]

5 голосов
/ 21 февраля 2011

Вы можете использовать ShowPrecedents и NavigateArrow. вот какой-то псевдокод

for each oCell in oSht containing a formula
ocell.showprecedents
do until nomoreprecedents
i=i+1
Set oPrec = oCell.NavigateArrow(True, 1, i)
If not oPrec.Parent Is oSht Then
' off-sheet precedent
endif
loop
next ocell
0 голосов
/ 12 мая 2016

Вы можете выполнить действия, описанные в разделе «Поиск внешних ссылок, используемых в ячейках» следующей ссылки:

Найти внешние ссылки в Worbook

Но вместо того, чтобы вводить «[», вы должны ввести имя листа, в котором вы пытаетесь найти его зависимости. Он будет отображать большой список каждой ячейки, ссылающейся на лист, но в конце все работает. Не удалось найти способ группировки по листам.

0 голосов
/ 16 апреля 2011

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

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

Sub printDependencies()
    ' Changes workbook structure - save before running this
    Dim wbs As VBA.Collection, wb As Workbook, ws As Worksheets
    Dim i As Integer, s As String, wc As Integer
    Set ws = ThisWorkbook.Worksheets
    Set wbs = New VBA.Collection
    wbs.Add ThisWorkbook, ThisWorkbook.FullName

    For i = ws.Count To 2 Step -1
        ws(i).Move
        wc = Application.Workbooks.Count
        wbs.Add Application.Workbooks(wc), Application.Workbooks(wc).FullName
    Next
    Dim wb As Workbook

    For Each wb In wbs
        For Each s In wb.LinkSources(xlExcelLinks)
            Debug.Print wb.Worksheets(1).Name & "<-" & wbs(s).Worksheets(1).Name
        Next
    Next
End Sub

Код не очень хорошо отшлифован или удобен для пользователя, но работает.

...