Q&A

回答の並べ替え:
投稿新規に質問を投稿する

アクションで他のシートのセルを動的に変更するとシートを開き直しても変更されたままの状態で残ってしまう

tdrk tdrk

2023-03-15 18:25

掲題の件について質問です。
まず、以下のようなアプリを作成します。

・メインシート
 シート起動時は何もしない。
 以下のボタンA、Bを配置。
  ボタンA:サブシートAを「新規ウィンドウで表示」
  ボタンB:サブシートBを「新規ウィンドウで表示」

・サブシートA
 シート起動時は何もしない。
 以下のボタン1、2を配置する。ボタン以外のセルは全てデフォルト空白。
  ボタン1:自身のシートのA1に「test」をセットする
  ボタン2:サブシートBの「値変更」アクションセットを実行する

・サブシートB
 シート起動時は何もしない。
 セルは全てデフォルト空白。
 以下の「値変更」アクションセットを用意。
  値変更:自身のシートのA1に「test」をセットする

<質問内容>
上記アプリを以下の手順で操作すると、
サブシートAのA1はデフォルト(空白)に戻るものの、サブシートBのA1は「test」が残ったままとなります。

①メインシートを起動後、ボタンAを押してサブシートAを開く
②サブシートAのボタン1を押下する(自身のA1にtestが表示される)
③サブシートAのボタン2を押下する(サブシートBの「値変更」アクションセットが実行され、サブシートBのA1にtestがセットされる)
④サブシートAを閉じる
⑤メインシートのボタンBを押してサブシートBを開く
 ⇒A1に「test」が表示されている
⑥メインシートのボタンAを押してサブシートAを開く
 ⇒A1はデフォルト(空白)に戻っている


⑤でサブシートBのA1がデフォルト(空白)に戻らず、値が残ったままになっていることに違和感があります。⑥でサブシートAはデフォルト(空白)に戻るのに関わらず、サブシートBが元に戻らないのはCELFの仕様なのでしょうか。
サブシートAを閉じた時点でサブシートBも閉じられ、サブシートBもデフォルト状態に戻るのが理想なのですが、サブシートBは明示的にクリアするしかないのでしょうか。
上記例は値セットですが、書式変更等も同様に変更されたままの状態となります。

なお、メインシートを閉じてからサブシートBを開き直すとデフォルト(空白)の状態に戻ります。

過去に同系の質問があったら申し訳ございません。ご存知の方、ご教示いただけますと幸いです。

tdrk tdrk
ご回答ありがとうございます。

CELFの仕様なのですね。
今回は明示的にクリアする方法で対処したいと思います。

ご解説いただきどうもありがとうございました。
日本コンピュータシステム(CELFチーム) 日本コンピュータシステム(CELFチーム) パートナー
こんにちは

結論からですが、CELFの仕様になります。

③の手順を実行したタイミングでシートのインスタンスが生成される為、
サブシートBのA1セルに「test」がセットされたシートが内部的に用意されます。

③のタイミングでシートが内部的に生成されるのは、アクションセット内部で
サブシートBのセル値を参照可能にするためだと思います。

検証例
 サブシートBのA1セルに「test」をセット。
 メインシートのアクションでセルに値をセットするアクションで
 A1にサブシート=B!A1&"test"をセット。
 アクションを実行するとメインシートのA1セルにはtesttestがセットされる。

このことから、サブシートを開いていない場合でもサブシートに書き込みを
行ったタイミングで内部でシートの生成が行われ、メインシートのアクションで
サブシートの値を参照した際の矛盾を回避しているのだと思います。
メールコンタクトをとる
新日本コンピュータマネジメント株式会社 新日本コンピュータマネジメント株式会社 パートナー
メダルベストアンサー
こんにちは。

私も類似事象で悩んだことがありました。

CELFでは、③の様に別のシートのアクションを起動することで、そのシートが内部的に開いた状態になっている様です。
その為、⑤により表示した際に、内部的に開いているシートを明示的に見える状態にしただけである為、test がセットされた状態になります。
⑤の処理を行う際に、明示的に内部的に開いた状態になっているシートを「閉じる」処理を入れてクリアを試みましたが、動作させることができませんでした。
「閉じる」は明示的に開いたウインドウに対してしか「閉じる」ことができない様です。

結論としては、記載の通り、サブシートBの値や書式を明示的にクリアする処理を組み込んで頂く事がよいと思われます。

よろしくお願いいたします。
メールコンタクトをとる