如何在 LibreOffice Calc 中不通过 DDE 链接到外部命名范围

如何在 LibreOffice Calc 中不通过 DDE 链接到外部命名范围

我希望将一个工作簿中的总计转移到另一个工作簿,而不使用 DDE,因为 DDE 已被弃用,并且给我带来了麻烦。总计位于具有范围名称的单个单元格中。两个工作簿都位于同一目录中。

如果我尝试插入 | 链接或使用导航器从源工作表拖动范围名称,它会逐个字符地插入单元格的内容。这是一个公式,它在源工作表中给出了所需的结果,但在目标中却毫无意义。

如果我在单元格内容工具栏中输入“=”,然后单击源文档中的单元格,这可以正常工作,但它会插入单元格引用原始值,而不是其范围名称='file:///home/simon/Home/Files/Accounts/Peracs14-15.ods'#$Journal.F412。如果我尝试用范围名称替换单元格引用='file:///home/simon/Home/Files/Accounts/Peracs14-15.ods'#Journal.Number20,则会产生错误#NAME。如果我单独输入范围名称,按='file:///home/simon/Home/Files/Accounts/Peracs14-15.ods'#Number20[Enter] 会导致单元格内容更改为='file:///home/simon/Home/Files/Accounts/Peracs14-15.ods'#file:///home/simon/Home/Files/Accounts/Peracs14-15.ods,这很奇怪。原始路径仍然存在,但范围名称已被替换为文件路径没有范围名称,以至于范围名称已经消失。无论“自动完成”是否打开,都会发生这种情况。我可怜的旧电脑是否还被比尔盖茨的回形针所困扰?

由于我需要在每个期间结束时创建一个新工作表,因此重新插入所有这些引用并使用正确的单元格引用会很费力。我知道我遗漏了一些明显的东西,有人能帮我吗?

平台 - Linux Mint 17.3 带有 xfce,基于 Ubuntu 14.04。GUI - xfce V4.10 应用程序 - LibreOffice 版本:5.0.3.2

答案1

https://wiki.openoffice.org/wiki/Documentation/OOo3_User_Guides/Calc_Guide/Referencing_other_documents

='file:///路径&文件名'#$SheetName.CellName.

由此我推断,没有办法将命名范围作为引用的一部分。但是,使用宏可以做很多事情。我的一个想法是使用以下代码:

Sub GetExternalNamedRanges
    Dim rangeNames As New Collection
    Dim namedRanges As New Collection
    oSheet = ThisComponent.Sheets.getByName("External Ranges")
    column = 1
    Do
        filepath = oSheet.GetCellByPosition(column,0).getString()
        If filepath = "" Then
            Exit Do
        End If
        otherComponent = StarDesktop.loadComponentFromUrl( _
            filepath, "_default", 0, Array())
        oRanges = otherComponent.NamedRanges
        namedRanges.Add(oRanges)
        For Each oRange In oRanges
            rangeName = oRange.getName()
            If Not Contains(rangeNames, rangeName) Then
                'rangeNames.Add(oRange.getContent(), oRange.getContent())
                rangeNames.Add(rangeName, rangeName)
            End If
        Next
        column = column + 1
    Loop
    row = 1
    For Each rangeName In rangeNames
        column = 0  'column A
        oCell = oSheet.GetCellByPosition(column,row)
        oCell.setString(rangeName)
        'oCell.setString(oRange.getName())
        For Each namedRange In namedRanges
            column = column + 1
            If namedRange.hasByName(rangeName) Then
                oRange = namedRange.getByName(rangeName)
                oCell = oSheet.GetCellByPosition(column,row)
                oCell.setString(oRange.getContent())
            End If
        Next
        row = row + 1
    Next
End Sub

' Returns True if the collection contains the key, otherwise False.
Function Contains(coll As Collection, key As Variant)
    On Error Goto ErrorHandler
    coll.Item(key)
    Contains = True
    Exit Function
ErrorHandler:
    If Err <> 5 Then
         MsgBox "Error " & Err & ": " & Error$ & " (line : " & Erl & ")"
    End If
    Contains = False
End Function

要使用此功能,请在主文档中创建一个名为“外部范围”的工作表。在单元格 A1 中输入“文件名”。在单元格 B1 中,输入需要引用的第一个文件的路径,以“file:///”开头。在单元格 C1 中输入第二个文件(如果有),在单元格 D1 中输入(如果有更多文件)等。

现在运行宏,它将提取这些文档中所有命名范围的位置。结果如下所示:

外部范围

然后使用这些范围VLOOKUP

=INDIRECT("'" & VLOOKUP("filename", NamedRangesList, 2) & "'#" & VLOOKUP("animal", NamedRangesList, 2))

这将从第一个文件中提取名为“animal”的范围的值(在此示例中位于 $Sheet1.$C$2)。

此公式的使用INDIRECT相当复杂,但可以通过创建 Basic 函数来简化。该函数只需将文件编号和范围名称作为参数,即可执行和INDIRECT操作VLOOKUP

相关内容