重构代码以断开链接,以便不使用变体类型



如何重构以下子例程,使其不使用 Variant 数据类型?

Sub BreakAllLinks()
Dim Link As Variant
Dim myLinks As Variant
myLinks = Excel.ActiveWorkbook.LinkSources(Type:=Excel.xlLinkTypeExcelLinks)
For Each Link In myLinks
    Excel.ActiveWorkbook.BreakLink Name:=Link, Type:=Excel.xlLinkTypeExcelLinks
Next Link
End Sub       

以下是在没有变体的情况下执行此操作的方法 - 但您不应该这样做。

Sub BreakAllLinks()
    Dim myLinks() As String
    Dim LinkIdx As Long
    Dim Link As String
    ReDim myLinks(1 To UBound(ActiveWorkbook.LinkSources(xlLinkTypeExcelLinks)))
    For LinkIdx = LBound(myLinks) To UBound(myLinks)
        myLinks(LinkIdx) = ActiveWorkbook.LinkSources(xlLinkTypeExcelLinks)(LinkIdx)
    Next LinkIdx
    For LinkIdx = LBound(myLinks) To UBound(myLinks)
        Link = myLinks(LinkIdx)
        ActiveWorkbook.BreakLink Link, xlLinkTypeExcelLinks
    Next LinkIdx
End Sub

为了演示所涉及的所有数据类型,这有点过分。 你只能为..每个数组都有一个变体 - 这就是语言的编写方式。最佳做法不是"不使用变体",而是"尽可能使用最严格的类型变量"。在您的情况下,变量是您可以使用的最严格的类型变量。

有一种方法可以在没有变体的情况下编写它,而且不是那么明显疯狂

Sub BreakAllLinks()
    Dim LinkIdx As Long
    For LinkIdx = LBound(ActiveWorkbook.LinkSources(1)) To UBound(ActiveWorkbook.LinkSources(1))
        ActiveWorkbook.BreakLink ActiveWorkbook.LinkSources(1)(1), xlLinkTypeExcelLinks
    Next LinkIdx
End Sub

但即便如此,我还是会选择变体。值得权衡。

链接源是一个字符串。但何必呢?

Sub M_snb()
  For Each it In ActiveWorkbook.LinkSources(1)
    MsgBox = TypeName(it)
    ActiveWorkbook.BreakLink it, 1
  Next
End Sub

最新更新