2018年11月4日 星期日

LibreOffice 中,如何將「分頁名稱」嵌入「儲存格」的字串中做為顯示用

在製做試算表時,常將不同的資料放在不同的分頁。因為是同類的資料,所以輸出表格、顯示的格式當然相同,而其中只有資料不同而已,某些「儲存格 (cell)」是用以顯示不同的資料內容。但是,在以不同分頁存放不同資料時,其「分頁名稱 (sheet name)」已經分別以不同名稱命名,在「儲存格」中要顯示的名稱又與「分頁名稱」相同,為何要在不同位置做同樣的設定數次呢?為什麼不直接將「分頁名稱」帶到「儲存格」做為顯示之用呢?
  為解決這個問題,就從 LibreOffice 所提供的函式找起。由於,是與試算表本身的資訊有關,可以推測是「資訊」這個分類的函式。其中,又以 CELL 這個函式最有可能,再看其說明,其中就有這個解答,接下來就說明這幾個相關函式的用法,
=CELL("資訊類型", 參照)
=FIND("尋找文字串", "搜尋文字", 搜尋起點)
=LEN("文字字串")
=MID("文字字串", 開始位置, 字數)
其中,
CELL:可取得參照「儲存格」所在「分頁」的「資訊類型」所指定的資訊。
FIND:從「尋找文字串」的「搜尋起點」所指定位置開始搜尋,找出「搜尋文字」從「尋找文字串」之「搜尋起點」算起之位置。
LEN:取得「文字字串」的長度。
MID:從「文字字串」中,指定的「開始位置」開始,取出所指定字數做為一個新字串。

CELL 函式

首先是 CELL 這個函式,可查詢許多資訊,與本文目的有關的為一個 FILENAME 這個「資訊查詢類型」,其中參照是欲查詢該「分頁名稱」所在之任一個「儲存格」,不寫時則指該「儲存格」。以一個儲存在「家目錄」下的一個名為〝測試.ods〞的檔案為例,
=CELL("FILENAME")
查詢結果為:'file:///home/SiB/測試.ods'#$工作表1。在指定參照處填入另一分頁的「儲存格」時,
=CELL("FILENAME", $工作表2.E15)
則查詢結果為:'file:///home/SiB/測試.ods'#$工作表2。可以發現,兩個結果的「檔名」相同,而「工作表名稱」不同。

FIND 函式

但是,「工作表」名稱在最後面,名稱也不能做為查詢的文字(或稱「鍵值」)。不過幸好在「工作表 (sheet)」名稱前,有個 #$ 的可作為辨識標記,因此可以用『#$』做為搜尋的鍵值,從『完整檔名﹢工作表名稱』的字串中,搜尋出「工作表」名稱在字串中的位置。
=FIND("#$", CELL("filename"), 1)
=FIND("#$", CELL("filename"))
=FIND("工", CELL("filename"))
=FIND("#$", CELL("filename")) + 2
第一個函式的查詢結果為 26,若「搜尋起點」為 1 時可以省略。第一個函式即為省略「搜尋起點」的寫法。第三個函式是查詢〝工〞這個字的所在位置,其結果為 28。當然不可能用「工作表名稱」做為「搜尋文字」,可見得以〝$S〞為「搜尋文字」時,「工作表名稱」的位置為需要再加 2,第四個函數即為取得「工作表名稱」字串位置的最終寫法。

MID、LEN 及取得「工作表名稱」的完整函式

最後,要將『完整檔名﹢工作表名稱』的字串中,取出「工作表名稱」。
=MID("文字字串", 開始位置, 字數)
其中,取出字串的字數度與「工作表名稱」有關,事先不可能先知道。不過,MID 這個函式的「字數」參數有個特性,它所指定的是最多取出字數,而取出的字數不可能多於整個字串的字數。因此,將取出字數設定為原字串總字數,是一個最合理的設定值。最終,取得「工作表名稱」的函式寫法為
=MID(CELL("filename"), FIND("#$", CELL("filename"))+2, LEN(CELL("filename")))
結果就是〝工作表1〞,即為「工作表名稱」。

已測試版本:

  • Fedora : 28
  • LibreOffice: 6.0.6.2

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)