Как связать с внешним именованным диапазоном без DDE в LibreOffice Calc
Я хочу перенести общее количество из одной книги в другую без использования 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
Работа.