LibreOffice Calc にて範囲名を参照を行うと起動時にエラーになる

初めて質問を投稿致します。よろしくお願い致します。

現在 LibreOffice Calc を使用して会計用の仕訳帳ファイルを作成しているのですが、範囲名を参照しようとすると起動時に #NAME? のエラーが表示されます。一時的にエラーを解決しても、再び開くと同様のエラーが表示されます。具体的には次のような手順でエラーが生じます。

  1. calc-kaikeicho.ots (391.7 KB) を LibreOffice Calc で開きます。(関数が多いので開くのに時間がかかります)
  2. ファイルを開くと、「仕訳帳」シートの有効行で #NAME? のエラーが生じています。
  3. メニューバーから「シート」、「名前付き範囲または式」、「管理」を選択します。
  4. どれでもよいので「参照範囲または数式」の入力欄を選択します。何も変更せず「OK」を選択します。
  5. エラーが解消されて #NAME?FALSE になります。ファイルを保存して閉じて、保存したファイルを再び開くとまたもエラーが表示されます。

calc-kaikeicho.ots は Excel や他の表計算ソフトを使用せず、LibreOffice Calc のみで作成していたのですが、いつの間にやらエラーが生じるようになってしまいました。作成方法としてはマクロや拡張機能等は使用せず、定義した範囲名と関数の組み合わせで作成しています。

解決のために色々とためしたのですが、当方だけでは皆目解決策が分からず、恐れながら質問致しました。LibreOffice の初心者故、拙い文書ではございますが、何卒よろしくお願いたします。(スクリーンショットを何枚も撮影したのですが、新規ユーザーは1つしかメディアファイルを投稿できないようなので、わかりにくくて本当に申し訳ないです。)

現在開発に使用しているコンピューターの環境は以下です。

バージョン: 6.2.8.2
Build ID: f82ddfca21ebc1e222a662a32b25c0c9d20169ee
CPU threads: 1; OS:Linux 3.2; UI render: default; VCL: gtk2; 
ロケール: ja-JP (ja_JP.UTF-8); UIの言語: ja-JP
Calc: threaded

Windowsでも再現しました。
シートをまたいで参照する場合は
範囲をドキュメント(グローバル)に変更し
数式のシート名.範囲名となっている部分からシート名を削除
してみてはどうでしょうか?

1 Like

ご返信ありがとうございます。ご指摘いただいた「範囲をドキュメント(グローバル)に変更」ついて試してみましたが、中々に難しいと感じました。

calc-kaikeicho.ots にて「日付」という範囲名は「仕訳帳」シートの中にも、「繰越処理」シートの中にもそれぞれ別々に異なる値で定義されています。「ヘッダー」や「フッター」の範囲名に至ってはそれぞれで全シート分定義されています。

同じ名前の範囲名を全て「ドキュメント(グローバル)」に変更すると範囲名同士が衝突してしまい、どれか1つの値が採用されて、それ以外の範囲名の値が消えてしまうようなのです。

当方の方では未だ、このエラーについて解決できておりません。更なるご知見などございましたら、ご教示頂ければ誠に幸いでございます。よろしくお願い致します。

一部変更で見えるエラーが出なくなったのでご報告です。
範囲は当初どおりシート内です。

勘定科目一覧表.科目名 INDEX(勘定科目一覧表.内容,0,1)
勘定科目一覧表.分類 INDEX(勘定科目一覧表.内容,0,2)
勘定科目一覧表.祖先分類1 INDEX(勘定科目一覧表.内容,0,3)
勘定科目一覧表.祖先分類2 INDEX(勘定科目一覧表.内容,0,4)
勘定科目一覧表.合計残高 INDEX(勘定科目一覧表.内容,0,5)
勘定科目分類表.分類名 INDEX(勘定科目分類表.内容,0,1)
勘定科目分類表.親分類 INDEX(勘定科目分類表.内容,0,2)
合計残高試算表.種別 INDEX(合計残高試算表.内容,0,1)
合計残高試算表.勘定科目 INDEX(合計残高試算表.内容,0,5)
1 Like

ありがとうございます。ご指摘通り入力したらエラーが表示されなくなるのを確認しました。素晴らしいです。

ひとまずこれで解決ではあるのですが、エラーが生じた原因について引き続き調査を続けたいと思います。

何も解決しませんが、マクロ利用がOKなら、エラー表示を出さない当面の簡単な対応策として、
「ファイルを開くときのイベントに、適当な名前付き範囲を作って直ぐに削除するだけのマクロを実行する」ことを提案します。
とりあえずエラーのない状態で開くことは出来ます。
AIに訊けば3秒で作ってくれるマクロで十分です。マクロを学習する必要はありません。

Ask_88398_OpeningMacro.ods (442.8 KB)


ファイルには以下のマクロが有り、開くときマクロを許可すれば自動的に実行されます。
最初に開くときは許可しないで、怪しいマクロでないことを確認し、再度開くときにマクロを許可することを勧めます。

仕込んでいるマクロは以下です。

Sub RangedNameNewRemove
rem 仮の範囲名を作って、すぐに削除するだけ
 Dim oNR As Object, oCA As new com.sun.star.table.CellAddress
  oNR = ThisComponent.NamedRanges
  oNR.addNewByName("Z_Y_X", "A", oCA, 0)
  oNR.removeByName("Z_Y_X")
End Sub

「NamedRange」にするつもりで、間違えましたが、そのままにします。

2 Likes

ご返信ありがとうございます。マクロを有効にしてファイルを開いたところ、前述のエラーなどの問題が解消されました。

この方法ですと、表計算自体の範囲名を弄ることなく、また LibreOffice Calc 本体のバグが解消された際には、再びマクロのみを取り除けばいいなど、利点が大きいですね。

今までマクロの使用は躊躇していたのですが、当面の間はこの方法で行きたいと思います。

2 Likes

以下のバージョンでも検証したのですが、前述と同様の結果となりました。未だに解決方法が見いだせないので、更なる解答をお待ちしております。

Version: 7.3.2.2 / LibreOffice Community
Build ID: 30(Build:2)
CPU threads: 1; OS: Linux 4.15; UI render: default; VCL: x11
Locale: ja-JP (ja_JP.UTF-8); UI: ja-JP
Ubuntu package version: 1:7.3.2~rc2-0ubuntu0.18.04.1~lo2
Calc: threaded

たとえば、参照を循環させると、このようなエラーになりますが、
どこかで同じようなロジカルな間違いはないかな。。と考えたのですが、
もしそうだとすると、何をやってもエラーは解決しないので、
今回の問題はもっと別の部分にありそうですね。。。

1 Like

1.名前の付け方に間違いがある?
2.名前の定義よりも先に、名前の参照が起きている?
3. 範囲を設定し直すことで解決できないか??
4. 範囲名が復活しないと、どうやっても動かない???

他に考えられる原因はないものでしょうか???

1 Like

名前の定義前に、その名前を利用しようとしている。。とかですかね。。

1 Like

ご返信ありがとうございます。一応確認した限りでは、未定義の範囲名を参照するのはないと思います。(時間がある時にもう一度確認してみたいと思います。)

今回の問題は範囲名の数式選択し、何も変更せず、 「ok」でエラーが解決するのが、最大の謎です。

表示されるエラーメッセージは、以下のようです。

525
#NAME?
無効な名前(Err:525 セルの代替表示は #NAME?)

識別子を評価できませんでした。たとえば、参照が有効でない、
ドメイン名が有効でない、列または行の項目欄がない、
マクロがない、小数位区切りが正しくない、アドインが見つからないなどです。

他にも、Calcの制限ぽいものを見つけました。

数式の最大トークン (数式を解析した後の内部データ単位) 数は
4096/sizeof(pointer) (32ビットプログラムでは1024、
64ビットプログラムでは512)[2]です。
これは数式内の文字数や関数の数に1:1で対応するものではありませんが、
その複雑さは制限されます(複雑すぎる数式ではエラーが発生します)

あまり複雑な数式では、エラーが出る可能性があるということだと思います。

シンプルに、マクロ等で実現する方が、安全かもしれません。

1 Like

https://help.libreoffice.org/latest/ja/text/scalc/05/02140000.html?DbPAR=CALC

https://wiki.documentfoundation.org/Faq/Calc/022/ja

ここに記載がありました。

2 Likes
数式の最大トークン (数式を解析した後の内部データ単位) 数は
4096/sizeof(pointer) (32ビットプログラムでは1024、
64ビットプログラムでは512)[2]です。
これは数式内の文字数や関数の数に1:1で対応するものではありませんが、
その複雑さは制限されます(複雑すぎる数式ではエラーが発生します)

上記については、翻訳が古くて更新しましたので数字は変わりましたが、複雑な場合に問題が起こるケースはありそうでです。
https://wiki.documentfoundation.org/Faq/Calc/022/ja

1 Like

皆様回答ありがとうございます。全てのご回答を拝見しております。

一つずつ順を追って確認しているため、返信が遅くなり申し訳ございません。

改めて見直したのですが「未定義の範囲名の参照」については確認出来ませんでした。

さらにエラーに関する調査を行いたいと思います。

引き続き個人的に調査してみたのですが、特定のシート内の範囲名をそのシート外から参照すると、起動時にエラーが生じるような気がします。

「仕訳帳」シート内で「勘定科目一覧表」内の各種範囲名を参照すると、起動時にエラーになります。ここでの 勘定科目一覧表.ab勘定科目一覧表.科目名 と全く同一の数式です。ただし b は参照範囲がグローバルです。勘定科目一覧表.ab は検証用に定義した範囲名です。

仕訳帳では 勘定科目一覧表.a はエラーですが、b はエラーになりません。

一方で、「勘定科目一覧表」シート内で、「勘定科目一覧表」内の各種範囲名を参照しても、起動時にエラーが全く生じていません。
このことから、参照範囲がグローバルの場合には問題が生じず、別のシートの範囲名を参照すると問題が生じるように思われます。

当方の環境では以上のような結果となったのですが、皆様の環境では写真のような同様の結果となりますでしょうか。今回検証に使用したシートはダウンロード可能です。もしよろしければ検証していただければ幸いです。

test.ods (437.9 KB)

1 Like

シート名:項目名の、例えば「項目名」をユニークにしたら回避出来ないか、などと考えましたが、複雑すぎてこちらで試せません。。
同じ名前がシート違いで沢山ありますよね?

。。。と思ったら、勘定科目一覧表.aでもエラーでしたね。。
参考にならずすみません。

1 Like

各項目を、グローバルにしつつ、ユニークな名前にして衝突を防げばいけるのかな???

1 Like