C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89591 の関連記事表示

<< 0 >>
■89591  Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/07(Fri) 09:56:47)

    分類:[VB6 以前] 

    Oracleよりデータを取得し、事前に用意しているテンプレートに貼り付けを
    行っているのですが、特定の列(数字型)が通貨型に勝手に変換されてしまいます。
    (プログラム内でセルの書式を通貨型に変換は行ってい無いことを確認)
    貼り付けるデータに問題があると思い、処理概要の2をコメントし
    オープン、クローズのみを行うようにしてみたのですが、それでも通貨型に
    変換されてしまいます。
    そういった情報が無いか探してみましたが、見つからず
    未だ解決に至っていません。
    もしこのような事象に心当たりのある方が
    いらっしゃれば解決方法をご教示ください。


    ●処理概要

    1.Excelオブジェクト作成
    Set gvObjExcel = New Excel.Application
    Set gvObjBook = gvObjExcel.Workbooks.Open(gvExlOPh)
    Set gvObjSheet = gvObjBook.Worksheets(gvAA2000ExlNm)
    gvObjExcel.Visible = False
    gvObjExcel.DisplayAlerts = False

    2.データ取得(以下のようなデータの貼り付け)

    gvObjSheet.Range(数字).Value = gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Value

    3.Excelファイルを任意の場所に保存
    gvObjBook.SaveAs FileName:=gvExlSPh, FileFormat:=51
    gvObjBook.Close
    gvObjExcel.DisplayAlerts = True
    gvObjExcel.ScreenUpdating = True

    4.Excelファイルをクローズ
    gvObjExcel.ScreenUpdating = True
    gvObjExcel.Quit

    ●開発環境
    Visual Basic6(SP6)
    Excel 2010
    MicroSoft Excel 14.0 Object Library


親記事 /過去ログ154より / 関連記事表示
削除チェック/

■89592  Re[1]: Excelオブジェクトに関して(VB6)
□投稿者/ リンクス -(2018/12/07(Fri) 10:55:11)
    2018/12/07(Fri) 10:56:35 編集(投稿者)

    gvObjSheet.Range(数字)の部分が通貨型になってしまうということでよろしいでしょうか?
    元のgvObjSheet.Range(数字).Valueには何が入っているのでしょうか?(0などの数字?空?)
    元々のgvObjSheet.Range(数字)のセルの書式設定の表示形式はどのようになっていますか?

    最悪、無理やりコードでセルの書式設定を変えれば良さそうですが、気持ち悪いですね。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89597  Re[1]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 -(2018/12/07(Fri) 11:58:16)
    No89591 (k3user さん) に返信
    > gvObjSheet.Range(数字).Value = gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Value

    ダイナセットということは、RDO や ADODB ではなく、
    Oracle Objects for OLE での接続とお見受けします。


    まず確認ですが、
     Debug.Print TypeName( gvObjSheet.Range(数字).Value )
     Debug.Print TypeName( ダイナセット.フィールド("テスト").Value )
     Debug.Print TypeName( gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Valuee )
    は、どういう結果となりますか?


    また、Excel のバージョンは何でしょうか?


    古い所では Excel 2002 において、Range.Value に対して
    「内部処理機形式 Date の二次元配列」な Variant を渡すと、
    セルの書式が無視されてしまう事象を経験しており、その対策として
    「内部処理機形式 String の二次元配列」な Variant に
    置き換えて引き渡した経験があるので…。(2000 や 2003 では制限せず)
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89593  Re[1]: Excelオブジェクトに関して(VB6)
□投稿者/ furu -(2018/12/07(Fri) 11:09:35)
    No89591 (k3user さん) に返信
    > Oracleよりデータを取得し、事前に用意しているテンプレートに貼り付けを
    > 行っているのですが、特定の列(数字型)が通貨型に勝手に変換されてしまいます。

    特定の列は数字型と書かれているのでORACLEでnumberですね。
    桁数はどうなっていますか?

    桁数指定がないと通貨型になると思います。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89594  Re[2]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/07(Fri) 11:22:05)
    リンクス様
    回答ありがとうございます。

    >gvObjSheet.Range(数字)の部分が通貨型になってしまうということでよろしいでしょうか?
    Excelテンプレートは数字型で書式設定しています。

    >元のgvObjSheet.Range(数字).Valueには何が入っているのでしょうか?(0などの数字?空?)
    初期値として0をセットしています。

    値のセット方法に問題があると思い、gvObjSheet.Range(数字).Valueをすべてコメントし、オープン、クローズのみ行うようにしたのですが、
    それでも通貨型となってしまいます。



記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89595  Re[3]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/07(Fri) 11:25:01)
    furu様

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

    >特定の列は数字型と書かれているのでORACLEでnumberですね。
    OracleのNumber型です。
    >桁数はどうなっていますか?
    桁数は12桁となっています。

    >桁数指定がないと通貨型になると思います。
    Oracleの型、桁数が怪しい思いファイルのオープン、クローズのみ行うように
    してデバッグしてみたのですが、それでも通貨型となってしまいます。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89596  Re[4]: Excelオブジェクトに関して(VB6)
□投稿者/ リンクス -(2018/12/07(Fri) 11:40:40)
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89598  Re[4]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 -(2018/12/07(Fri) 12:09:32)
    No89591 (k3user さん) に返信
    > 特定の列(数字型)が通貨型に勝手に変換されてしまいます。

    これは、Excel のセル書式すなわち NumberFormat プロパティの値が、
    代入処理の前後で(通貨に)変化してしまう、という意味でしょうか。



    No89595 (k3user さん) に返信
    > OracleのNumber型です。
    > 桁数は12桁となっています。

    NUMBER(12,0) に限らず、oo4o 経由で取得した場合、NUMBER 型フィールドの値が
    内部処理形式 String の Variant 型で返されてくると思います。経験上。
    (oo4o 自体は ORADB_DOUBLE , ORADB_INTEGER, ORADB_LONG などと示してくるのですが)


    ひとまず、通貨型として扱われないようにするため、
    代入式の右辺を「10 進型」にしてみるのはどうでしょう。
    たとえば
     = CDec( gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Valuee )
    にしてみる、ということです。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89615  Re[5]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/10(Mon) 11:27:03)
    リンクス様

    情報ありがとうございます。

    >ちょっと調べてみたら、VB6からの操作ではないのですが、
    >数値が通貨形式になってしまうという案件が報告されています。

    ファイル破損の可能性も考えられるため、全く新しいシートで
    試してみましたが、改善はされませんでした。
    プログラムの観点から調査を行っていたので、
    環境設定等も見直してみます。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89616  Re[6]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/10(Mon) 11:35:39)
    魔界の仮面弁士様
    
    回答ありがとうございます。
    
    >ダイナセットということは、RDO や ADODB ではなく、
    >Oracle Objects for OLE での接続とお見受けします。
    OO4Oを使用しています。
    
    >>まず確認ですが、
    > Debug.Print TypeName( gvObjSheet.Range(数字).Value )
    > Debug.Print TypeName( ダイナセット.フィールド("テスト").Value )
    > Debug.Print TypeName( gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Valuee )
    >は、どういう結果となりますか?
    
    以下の結果となりました。
    Debug.Print TypeName( gvObjSheet.Range(数字).Value )                                              → Double
    Debug.Print TypeName( ダイナセット.フィールド("テスト").Value )                                   → String
    Debug.Print TypeName( gvObjSheet.Range(数字).Value + ダイナセット.フィールド("テスト").Valuee )   → Double
    
    >また、Excel のバージョンは何でしょうか?
    Excel 2012で確認を行っています。
    
    
    >これは、Excel のセル書式すなわち NumberFormat プロパティの値が、
    >代入処理の前後で(通貨に)変化してしまう、という意味でしょうか。
    
    現象としてはそのようになるのですが、
    調査のため以下の2の処理をすべてコメントアウト
    してみたのですが、それでも通貨型に変換されてしまいます。
    
    1.Excelオープン
    2.データ取得&代入
    3.Excelクローズ
    
    
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89618  Re[7]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 -(2018/12/10(Mon) 14:13:11)
    2018/12/10(Mon) 14:40:24 編集(投稿者)

    No89616 (k3user さん) に返信
    >> また、Excel のバージョンは何でしょうか?
    > Excel 2012で確認を行っています。

    言葉足らずで済みません。
    知りたかったのはマイナーバージョンとか C2R / MSI の情報とかです。

    https://support.microsoft.com/ja-jp/help/2121559/
    https://docs.microsoft.com/en-us/officeupdates/update-history-office-2010-click-to-run

    「14.0.4760.1000 (32 ビット)」とか
    「14.0.5128.5000 (32 ビット)」とか
    「14.0.6123.5001 (32 ビット)」とか
    「14.0.7106.5003 (32 ビット)」とか


    No89591 の段階で 2010 & 14.0 と書かれていたので、メジャーバージョンは分かって
    いるつもり…・・・だった――のですが、今度は Excel 2012 になっていますね…?
    それだと Windows 版ではなく、Mac 版ということになってしまうのですが。


    > 調査のため以下の2の処理をすべてコメントアウト
    > してみたのですが、それでも通貨型に変換されてしまいます。
    > 1.Excelオープン
    > 2.データ取得&代入
    > 3.Excelクローズ

    取得も代入もせず、開いて閉じるだけ(上書き保存すらしない)ということでしょうか。
    それとも Save あるいは SaveAs は行うということでしょうか。

    環境依存の問題なのかどうか、再現性を確認したいので、
    手順 1 と 3 だけに単純化した「現象を再現可能なコード」を
    作成してもらえないでしょうか。



    No89615 (k3user さん) に返信
    > ファイル破損の可能性も考えられるため、全く新しいシートで
    > 試してみましたが、改善はされませんでした。

    新規シートではなく、新規ブックで試してみてください。
    (破損しているブックに新しいシートを追加しても、改善するとは限らないので)


    【追記】
    1 つ思い出しました。
    Workbook の SaveAs メソッドを呼び出す際に、
    Local 引数を明示してみてください。


    『Excelを操作(Excelファイルを開く、保存する、閉じる)するだけで表示形式が勝手に変わってしまう』
    https://social.msdn.microsoft.com/Forums/ja-JP/4e454fcc-93f8-4372-98ac-9a65fb3e38e3/excelexcel


    上記は、Excel 2013で Workbooks.Open / Save を実施して
    再度ファイルを開くと、表示形式が変わってしまうというもので、
    バージョンや使用メソッドが微妙に異なるのですが、
    現象としては酷似しているので、一応試してみる価値がありそうです。


    参考までに、上記 URL 事象の当時の検証バージョンを記載しておきます。

    - 再現しないことを確認
    ・ Office 2007 SP1、SP2、SP3
    ・ Office 2010 RTM、SP1、SP2
    - 再現することを確認
    ・ Office 2013 C2R (15.0.4711.1003)


    この現象は、Office 文書の保存時に、各国で統一形式とするために、
    VB6 等からの操作や VBA での動作時にのみ、Excel の内部ロケールが
    一時的に英語モードの切り替わって処理されるためだそうです。

    そのため、この問題が発生するバージョンの Excel では、
    意図的に Local 引数に True を指定して SaveAs することで
    英語への切り替えが抑制され、問題が回避されるのだとか。


    なお、SaveAs メソッドの「Local 引数」は 2002 以降で使用可能です。
    https://www.saka-en.com/office/vba-saveas-text-date-num/
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89623  Re[8]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/10(Mon) 18:16:13)
     魔界の仮面弁士様
    
    回答ありがとうございます
     
    
    >知りたかったのはマイナーバージョンとか C2R / MSI の情報とかです。
    Office: Microsoft Office Professional Plus 2010 Excel Ver 14.0.7214.5000(32Bit)となります。
     
    >手順 1 と 3 だけに単純化した「現象を再現可能なコード」を
    >作成してもらえないでしょうか
    以下の環境でデバッグを行いました。(■Excelライブラリ処理の部分をご確認ください。)
    
    >Workbook の SaveAs メソッドを呼び出す際に、
    >Local 引数を明示してみてください
    SaveAsメソッドにLocal:=trueを追加して確認しましたが、変化はありませんでした。
    
    
    書式が通貨型に変わってしまうセルですが、Aのセル(数値型)とBのセル(数値型)
    を足した値をセットしています。( =A10 + B10のような)
    (データのセットの処理をコメントしても発生するので、関係はありませんが...)
    
    
    ●環境
     OS:Microsoft Windows XP Professional Version 2002 SP3
     VB6:Microsoft Visual basic 6.0(SP6)
    
    ●コンパイル設定
     ビルド形式:ActiveX DLL
     コンパイル方法:ネイティブコードコンパイル(コードの実行速度を最適化)
     
    ●プログラムが参照しているライブラリ
     Visual Basic For Applications
     Visual Basic runtime objects and procedures
     Visual Basic objects and procedures
     OLE Automation
     Oracle InProc Server 5.0 Type Library
     Microsoft Excel 14.0 Object Library
    
    ●プログラム構成
    
      clExcelOutput.cls(Excelファイル出力メイン処理)
      mdExcel.bas(Excelライブラリ)
      
    
    ●プログラム概要
    
    -- -----------------------------------------------------
     ■Excelファイル出力メイン処理
    -- -----------------------------------------------------
      1.初期処理
          1.1.呼び出しパラメータの受け取り
          2.2.データベース接続
    
      2.Excelファイル作成処理
          2.1.Excelのオープン
          2.2.Oracleからデータを取得
            (OraDynasetオブジェクトに対してSQLの結果をセット(データベースの接続、クエリ実行、クローズはライブラリで行っています。)
          2.3.Excelにデータをセット
            以下のように値をセット
            gvObjSheet.Range("I8").Value = wvDyn.Fields("komoku1").Value
    
      3.Excelファイル保存処理
    
      4.Excelファイルクローズ処理
    
    -- -----------------------------------------------------
     ■Excelライブラリ処理
    -- -----------------------------------------------------
    
      - ------------------------------
      - Excelファイルのオープン
      - ------------------------------
         Set gvObjExcel = New Excel.Application
         Set gvObjBook = gvObjExcel.Workbooks.Open(指定したフォルダ)
         Set gvObjSheet = gvObjBook.Worksheets(指定したファイル名)
         gvObjExcel.Visible = False
         gvObjExcel.DisplayAlerts = False
    
    
      - ------------------------------
      - Excelファイルの保存
      - ------------------------------
         gvObjBook.SaveAs gvExcelTempPath
         gvObjExcel.DisplayAlerts = True
    
    
      - ------------------------------
      - Excelファイルのクローズ
      - ------------------------------
        gvObjExcel.ScreenUpdating = True
        gvObjExcel.Quit
    
        Set gvObjExcel = Nothing
        Set gvObjBook = Nothing
        Set gvObjSheet = Nothing
    
    
    
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89626  Re[9]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 -(2018/12/10(Mon) 20:46:01)
    2018/12/10(Mon) 20:54:16 編集(投稿者)

    No89623 (k3user さん) に返信
    > Office: Microsoft Office Professional Plus 2010 Excel Ver 14.0.7214.5000(32Bit)となります。

    確認ありがとうございます。ということは、
    KB4461530 (2018/11/08) は未適用で、
    KB4461466 (2018/10/04) までが適用されている状態でしょうか。

    https://www.catalog.update.microsoft.com/?updateid=3c886187-6d89-496d-b68c-15abd12bba89
    https://www.catalog.update.microsoft.com/?updateid=1914e637-8c9a-49fa-8361-2f621e2cb1cf


    > ビルド形式:ActiveX DLL
    > コンパイル方法:ネイティブコードコンパイル(コードの実行速度を最適化)

    この DLL は、タスクスケジューラーや Web サービスなどといった
    ユーザー対話のないサービスセッションから呼び出しているのではなく、
    普通のデスクトップ アプリからの呼び出しという認識で良いでしょうか。
    (実行アカウント依存の問題かどうかの確認ということです)



    >> 手順 1 と 3 だけに単純化した「現象を再現可能なコード」を
    >> 作成してもらえないでしょうか
    > 以下の環境でデバッグを行いました。

    「現象を再現可能なコード」というのは、第三者がそのまま自身の環境で
    検証可能となる情報を提供して欲しい、という意味でした…。



    > Set gvObjExcel = New Excel.Application
    > Set gvObjBook = gvObjExcel.Workbooks.Open(指定したフォルダ)
    > Set gvObjSheet = gvObjBook.Worksheets(指定したファイル名)

    Workbooks.Open でフォルダを指定することはできませんし、
    同様に、Worksheets コレクションのインデックスに
    ファイル名を指定することもできないはず。(エラーになりました)

    Worksheets コレクションに指定可能な引数は "ファイル名" ではなく、
    「1 以上ワークシート数以下の自然数」
    「ワークシートの名前」
    「ワークシートオブジェクト」
    もしくは「上記を 1 つ以上含んだ Variant 配列」だけだと思いますよ。


    で、先の投稿の繰り返しになりますが、
    既存のファイルを使うのではなく、「新規ブック」で試してみてください。
    新規に新しい Excel ファイルを用意し、そこに最低限度の書式設定を
    施したものを読み込ませて、再現性を確認してみるということです。

    もしも新規ファイルで再現せず、特定のファイルでのみ起こる事象なら、
    VB のコードを見てもあまり意味は無く、元ファイルの内容を疑っていくべきかと。

    一方、新規ファイルでも再現するようであれば、その検証ファイルの作成手順を公開すると共に、
    セルの内容(というか書式指定?)が処理の前後でどう変化するのかを示して頂けれあ、
    他の Excel バージョン(あるいは同じ Excel バージョン)を使っている他者にも
    検証できますので、バージョン依存性や環境依存性があるのかどうかを確認できそうです。
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89630  Re[10]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/11(Tue) 14:02:16)
    魔界の仮面弁士様
    
    回答ありがとうございます。
    
    >「現象を再現可能なコード」というのは、第三者がそのまま自身の環境で
    >検証可能となる情報を提供して欲しい、という意味でした…。
    申し訳ございません。当方の認識不足でした。
    
    >既存のファイルを使うのではなく、「新規ブック」で試してみてください。
    >新規に新しい Excel ファイルを用意し、そこに最低限度の書式設定を
    >施したものを読み込ませて、再現性を確認してみるということです。
    >もしも新規ファイルで再現せず、特定のファイルでのみ起こる事象なら、
    >VB のコードを見てもあまり意味は無く、元ファイルの内容を疑っていくべきかと。
    >一方、新規ファイルでも再現するようであれば、その検証ファイルの作成手順を公開すると共に、
    >セルの内容(というか書式指定?)が処理の前後でどう変化するのかを示して頂けれあ、
    >他の Excel バージョン(あるいは同じ Excel バージョン)を使っている他者にも
    >検証できますので、バージョン依存性や環境依存性があるのかどうかを確認できそうです。
    
    以下の2つを検証しました。
    
    1.新規ファイルを作成し、元ファイルの最低限の書式設定を行い、問題のプログラムを実行
    2.新規ファイルを作成し、Excelのオープン、クローズのみを行うプログラムを新規に作成・実行
    
    1の結果:書式が変更されない。
    2の結果:書式が変更されない。
    
    上記の結果からファイル自体に問題があるようです。
    現在、ファイルの詳細な情報を調査中です。
    (原因が分かり次第、ご報告します。)
    
    
    色々と有益な情報を教えていただき誠にありがとうございます。
    
    
    
    
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89642  Re[11]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user -(2018/12/12(Wed) 13:54:15)
    Excelファイルが破損している原因を調査しましたが
    今の所、原因はつかめていません。

    ・オプション設定の再度確認
    ・ファイルを修復してオープン
    ・すべてのセルの書式を確認
    ・不要な数式・マクロが動いていないか?
    ・名前管理の確認

    根本的な解決とはなっていませんが
    Excelファイルを新たに作成する方法を取りました。

    よって今回の質問を解決済みとさせていただきます。
    回答をいただいた皆様、この度は誠にありがとうございました。
記事No.89591 のレス / END /過去ログ154より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -