簡體   English   中英

VBA以遞歸方式打開excel工作簿

[英]VBA opening excel workbooks in recursion

我正在嘗試編寫用於創建 excel workooks 網絡地圖的代碼(例如一個文件包含指向其他七個文件的鏈接,而這些文件又具有指向可能不同文件的鏈接等)。 由於我不知道網絡中所有文件的集合,我想通過遞歸來做到這一點。 我寫了這段代碼:

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 應用程序關閉。 即使對於為測試目的而創建的小而簡單的文件也是如此。

你能幫我完成這項工作嗎? 我在這里缺少什么?

原因

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)

我的建議

此代碼使 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

結論

測試兩個代碼並選擇最適合您的代碼。

問候 周末愉快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM