まりふのひと

家計簿77を使っているExcel2013および2016の方へのお願いです

≪状況≫

 例えば、[翌月分シート作成]で 8月分のシート「2017-08」を作った とします。

  1. 直後に[×](閉じる)ボタンをクリックしても閉じれません。
  2. 8月分のデータを入力してはいけません
    • 入力を確定した後、「2017-08」シートには何も表示されません。
       「2017-07」シートに入力したことになり、結果として「変更」してしまいます。
    • 例えば、6月分のシートの2行目の日付(セルB2)を見てください。7月の日付になっていませんか?



≪当面の対応≫

 [翌月分シート作成]後、一旦、終了してください。入力してはいけません!

  • 上書き保存するには、[メニュー]ボタンから[保存して閉じる]を選択する。
  • 破棄する場合は、
    1. 一ヶ月以前のシート(例えば「2017-07」)の[×](閉じる)ボタンをクリック後、
    2. [保存しない]を選択する。
       参考)保存もできる...

その後、家計簿を起動すると、正常に入力できます。



≪原因≫

 長いこと悩んでいましたが、下記が原因‥‥ でしょう。

  • Excel2013,2016はどう変わったかExcelでお仕事 2016.06.19)
    ◆SDI(SingleDocumentInterface)になってしまいました。
     まず「おさらい」です。Microsoft Office は黎明期から2010までは全て「MDI(MultiDocumentInterface)」でした。「MDI(MultiDocumentInterface)」というのは、Windows上ではExcelのウィンドウは1つだけですが、そのExcelのウィンドウの中に複数のドキュメントを開くことができる構造のユーザーインタフェースを指します。
     SDIになったことでの一番の問題はVBAの話になりますが、ユーザーフォームを表示させたままで別のワークブックを開くような仕組みで発生します。モーダルで表示されたユーザーフォームのVBAのコードによって別のワークブックを開く場合は、Excel2010までであればユーザーフォームが手前に表示されるため、後ろにあるExcelのウィンドウ内に後から開いたワークブックがアクティブになって表示されますが、Excel2013の場合は開いたワークブックが手前に来てしまい、ユーザーフォームはその後ろに隠れてしまいます。
     通常であればワークブック参照のオブジェクトに対してActivateメソッドでウィンドウの前後が入れ替わってくれますが、モーダルで表示されたユーザーフォームが手前に表示されている状態では後ろで表示されている複数のExcelウィンドウに対してActivateメソッドを発行しても実際の順位は入れ替わりません



≪対策≫

 Microsoftサポートには似たような記事が‥‥

  • Excel 2013 でモーダル ダイアログから開かれたブックのメニューバーやリボンの操作ができずウィンドウを閉じることができないMicrosoftサポート 2016/09/29)
     2 つの 回避策があります。どちらの方法でも、Excel 内部で持つアクティブ ウィンドウのハンドルがを適切に切り替わり、現象を回避できます。

    方法1
     ユーザー フォームをモードレス ダイアログで表示し、UserForm_Layout イベントで、一度フォーム自身を非表示に設定してから、再度、モーダル ダイアログとして表示します。 (UserForm_Layout イベントは、フォームの新しい位置の算出と画面の再描画を行うイベントで、フォームにフォーカスがある際に発生するイベントです。)

    方法2
     フォーム上のボタンがクリックされた場合に、1 秒後にフォームをアンロードし、ウィンドウの最小化を行い、元の画面サイズに戻す処理を順に行います。


 コードのサンプルが載っている‥‥ が、理解できない。
今後も試行錯誤するしかないが、これが完成したとしても Excel2010ではどう動くのだろうか。まだまだ苦戦が続きそうだ...


 余談だが‥‥
今、新生MAPS-TAで「今すぐ使える かんたん Excel2013」(技術評論社)を学習している。テキストは購入せず、サイトから目次とサンプルファイルをダウンロードしてイメージトレーニングしている。
今回の問題から「Section02 Excel 2013の新機能」の内容が気になって、Amazonに発注した。自炊する予定。