VBA открывает учебники Excel по рекурсии - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь написать код для создания карты сети рабочих книг Excel (например, один файл со ссылками на семь других файлов, которые, в свою очередь, имеют свои собственные ссылки на возможно разные файлы и т. Д. c.). Поскольку я не знаю a priori набор всех файлов в сети, я хочу сделать это с помощью рекурсии. Я написал этот фрагмент кода:

Sub recLink(strPath As String)
Dim WB As Workbook
Set WB = Workbooks.Open(strPath , False, True)

If Not IsEmpty(WB.LinkSources(xlExcelLinks)) Then
    For Each LNK In WB.LinkSources(xlExcelLinks)
        Debug.Print LNK
        Call recLink(Str(LNK))
    Next LNK
Else
End If

WB.Close (False)
End Sub

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

Не могли бы вы помочь мне с этой работой? Что мне здесь не хватает?

1 Ответ

0 голосов
/ 21 февраля 2020

Причина

The issue is on the Str(LNK) from "Call recLink(Str(LNK))".

Решение

Создайте строковую переменную и установите LNK в эту переменную, затем вы можете вызвать функция с использованием строковой переменной. Это будет работать.

Dim strLink as String
.
.
strLink = LNK
Call recLink( strLink )
.
.

Как я нашел

Я обнаружил это только потому, что сначала пытался поместить все ссылки в массив, и такая же проблема возникла, когда VBA собирался просто определить массив с помощью LNK. Поэтому я понял, что проблема не может быть в рекурсивном вызове, и единственное, что отличалось, - это функция STR (). arrLink (x) = Str (LNK)

My sugestion

Этот код сохраняет все windows скрытия Excel, более красивую презентацию и ускоряет выполнение.

Function recLink(strPath As String)
   Dim objMaster              As Object
   Dim wbkMaster              As Workbook
   Dim strLink                As String

   Set objMaster = CreateObject("Excel.Application")
   With objMaster
      .Visible = False
      Set wbkMaster = .Workbooks.Open(strPath)

      If Not IsEmpty(wbkMaster.LinkSources(xlExcelLinks)) Then
          For Each LNK In wbkMaster.LinkSources(xlExcelLinks)
            strLink = LNK
            Debug.Print strLink
            Call recLink(strLink)
          Next LNK
      Else
      End If

   End With

   wbkMaster.Close (False)
   Set objMaster = Nothing
   Set wbkMaster = Nothing

End Function

Заключение

Протестируйте оба кода и выберите лучший для вас.

С уважением Приятных выходных.

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