我希望将一个工作簿中的总计转移到另一个工作簿,而不使用 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
='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
。