none
Excelを操作(Excelファイルを開く、保存する、閉じる)するだけで表示形式が勝手に変わってしまう RRS feed

  • 質問

  • 初投稿です。宜しくお願い致します。

    [環境]

    開発環境:Visual Studio Community 2013

         (参照:Microsoft Excel 15.0 Object Library)

    Excel:Microsoft Office Excel 2013

    [発生手順]

    ①Excelを開き、セルA1の表示形式を通貨タブで以下の通りに設定し、保存する。

    小数点以下の桁数:0

    記号:¥

    負の数の表示形式:¥-1,234(黒)

    保存形式:xlsx(私はC:\test\TestData.xlsxに保存しました)

    ②C#でExcelオープン、保存を実行後、閉じる。ソースは以下の通りです。

                Excel.Application xlApplication = null;
    
                try
                {
                    xlApplication = new Excel.Application();
                    xlApplication.DisplayAlerts = false;
    
                    Excel.Workbooks xlBooks = xlApplication.Workbooks;
                    try
                    {
                        Excel.Workbook xlBook = xlBooks.Open(@"C:\test\TestData.xlsx");
    
                        try
                        {
                            xlBook.Save();
                        }
                        finally
                        {
                            if (xlBook != null)
                            {
                                try
                                {
                                    xlBook.Close();
                                }
                                finally
                                {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
                                }
                            }
                        }
                    }
                    finally
                    {
                        if (xlBooks != null)
                        {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
                        }
                    }
                }
                finally
                {
                    if (xlApplication != null)
                    {
                        try
                        {
                            xlApplication.Quit();
                        }
                        finally
                        {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication);
                        }
                    }
                }

    ③上記で実行したExcelファイルを開き、セルA1の表示形式を確認すると、

     負の数の表示形式が(¥1,234)(黒)に変化している。

    何故表示形式が勝手に変わってしまうのか、わかる方がいらっしゃればご教授頂けますでしょうか。

    宜しくお願い致します。


    • 編集済み ふーん 2015年4月19日 6:14
    2015年4月19日 6:13

回答

  • 進展がありましたのでご報告いたします。

    • 本現象は、Excel 2013 固有の現象とのことです。
      • ただし Excel 2007 SP3 および Excel 2010 においては、KB2919152 という良く似たような事象が報告されています。
    • 回避策として、Save メソッドのかわりに、SaveAs メソッドを使うことが出来ます。名前付き引数 Local に true を渡して SaveAS を呼び出すことで、今回の問題点を回避できます。

    // HACK: Excel 2013 の不具合対応
    // xlBook.Save();
    xlBook.SaveAs(xlBook.FullName, Local : true);
    

    • 回答の候補に設定 魔界の仮面弁士MVP 2015年5月14日 10:25
    • 回答としてマーク 星 睦美 2015年5月15日 2:50
    • 回答としてマークされていない 星 睦美 2015年5月15日 2:50
    • 回答としてマーク ふーん 2015年5月24日 12:30
    2015年5月14日 8:22
  • Excel 2013 (x64) + C#2010 の環境で実験したところ、同じ問題が再現しました。
    また、.NET からではなく VBA から自ブック上の Save メソッドを呼び出した場合にも同様のようです。

    ユーザー操作で「Ctrl + S」で上書き保存する分にはズレないようですが…。

    保存前後でブックの状態を確認してみたところ、A1 セルの書式が以下のように設定されていました。

    【保存操作前】
     .NumberFormat      = 『$#,##0_);($#,##0)』
     .NumberFormatLocal = 『\#,##0;\-#,##0』
    
    【保存後に再読込】
     .NumberFormat      = 『\#,##0_);(\#,##0)』
     .NumberFormatLocal = 『\#,##0_);(\#,##0)』
    

    参考資料:「NumberFormatLocalとNumberFormatの違い

    この違いが今回の問題を引き起こしたものと予想しますが、Excel 本体の「通貨」書式の扱いと、Excel ライブラリの保存処理の問題が絡み合う部分になりそうなので、コミュニティでの根本的な解決は難しいかもしれません。明確な対処が必要な場合は、サポートの利用も検討してみてください。



    2015年4月23日 3:06

すべての返信

  • Excel 2013 (x64) + C#2010 の環境で実験したところ、同じ問題が再現しました。
    また、.NET からではなく VBA から自ブック上の Save メソッドを呼び出した場合にも同様のようです。

    ユーザー操作で「Ctrl + S」で上書き保存する分にはズレないようですが…。

    保存前後でブックの状態を確認してみたところ、A1 セルの書式が以下のように設定されていました。

    【保存操作前】
     .NumberFormat      = 『$#,##0_);($#,##0)』
     .NumberFormatLocal = 『\#,##0;\-#,##0』
    
    【保存後に再読込】
     .NumberFormat      = 『\#,##0_);(\#,##0)』
     .NumberFormatLocal = 『\#,##0_);(\#,##0)』
    

    参考資料:「NumberFormatLocalとNumberFormatの違い

    この違いが今回の問題を引き起こしたものと予想しますが、Excel 本体の「通貨」書式の扱いと、Excel ライブラリの保存処理の問題が絡み合う部分になりそうなので、コミュニティでの根本的な解決は難しいかもしれません。明確な対処が必要な場合は、サポートの利用も検討してみてください。



    2015年4月23日 3:06
  • 魔界の仮面弁士さん、回答頂きありがとうございます。

    そして返信が遅れてしまい、申し訳ございません。

    .Net固有の問題かと思ったのですが違うのですね。。。詳細に説明頂きありがとうございます。

    お客様先に帳票アプリケーションと通貨フォーマットのテンプレートファイルを納品しているのですが、マイナス値の場合に本件現象が

    発生したので、思い切って質問させて頂きました。

    今のところ、お客様からは特に指摘が来ておりませんが、自身もどうしてこのような現象が発生するのか、

    気になっておりますので、サポートに連絡してみます。

    満足いく回答がマイクロソフト得られたら、再度本件に投稿させて頂きます。

    2015年4月30日 14:55
  • 本件について、マイクロソフトに質問を投げる見込みでしたが、

    自身が勤める会社では、マイクロソフトとパートナー契約を結んでおらず、

    また、個人で質問を投げるのも高額な料金がかかってしまう為、

    回答を得るのは難しい、という結果に至りました。

    どなたかが解決してくれることを待つことにさせて頂きます。

    2015年5月9日 23:48
  • 緊急性は無いとのことでしたので、質問者に代わって、
    私の方からサポート インシデントを使用してみます。

    本件について報告できる内容が得られるかどうかは
    まだ分かりませんが、期待せずにお待ち下さい。
    2015年5月13日 7:28
  • 進展がありましたのでご報告いたします。

    • 本現象は、Excel 2013 固有の現象とのことです。
      • ただし Excel 2007 SP3 および Excel 2010 においては、KB2919152 という良く似たような事象が報告されています。
    • 回避策として、Save メソッドのかわりに、SaveAs メソッドを使うことが出来ます。名前付き引数 Local に true を渡して SaveAS を呼び出すことで、今回の問題点を回避できます。

    // HACK: Excel 2013 の不具合対応
    // xlBook.Save();
    xlBook.SaveAs(xlBook.FullName, Local : true);
    

    • 回答の候補に設定 魔界の仮面弁士MVP 2015年5月14日 10:25
    • 回答としてマーク 星 睦美 2015年5月15日 2:50
    • 回答としてマークされていない 星 睦美 2015年5月15日 2:50
    • 回答としてマーク ふーん 2015年5月24日 12:30
    2015年5月14日 8:22
  • フォーラム オペレーターの星 睦美です。
    魔界の仮面弁士 さん、情報を提供いただきありがとうございます。

    ふーん さん、こちらのスレッドをご確認いただければと思います。
    その際にこちらのスレッドにも[回答としてマーク] いただけましたら幸いです。

    それでは今後ともMSDN フォーラムをよろしくお願いいたします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support



    • 編集済み 星 睦美 2015年5月15日 2:56 編集
    2015年5月15日 2:55
  • 魔界の仮面弁士 さん、わざわざ確認頂きありがとうございます!!!

    Excel2013環境で修正し確認して、問題なく動作することを確認しました!

    本当にありがとうございます!!!

    2015年5月24日 12:41
  • サポート技術情報が公開されました。

    文書番号 : 3066474
    タイトル : Excel 2013 の VBA でファイルの保存し、再度ファイルを開きなおすとセルの書式が引き継がれない

    https://support.microsoft.com/ja-jp/kb/3066474

    2015年5月25日 1:19