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

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

C# と VB.NET の入門サイト

Re[11]: Excelオブジェクトに関して(VB6)


(過去ログ 154 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■89591 / inTopicNo.1)  Excelオブジェクトに関して(VB6)
  
□投稿者/ k3user (59回)-(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



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

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

最悪、無理やりコードでセルの書式設定を変えれば良さそうですが、気持ち悪いですね。
引用返信 編集キー/
■89593 / inTopicNo.3)  Re[1]: Excelオブジェクトに関して(VB6)
□投稿者/ furu (191回)-(2018/12/07(Fri) 11:09:35)
No89591 (k3user さん) に返信
> Oracleよりデータを取得し、事前に用意しているテンプレートに貼り付けを
> 行っているのですが、特定の列(数字型)が通貨型に勝手に変換されてしまいます。

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

桁数指定がないと通貨型になると思います。
引用返信 編集キー/
■89594 / inTopicNo.4)  Re[2]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (60回)-(2018/12/07(Fri) 11:22:05)
リンクス様
回答ありがとうございます。

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

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

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




引用返信 編集キー/
■89595 / inTopicNo.5)  Re[3]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (61回)-(2018/12/07(Fri) 11:25:01)
furu様

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

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

>桁数指定がないと通貨型になると思います。
Oracleの型、桁数が怪しい思いファイルのオープン、クローズのみ行うように
してデバッグしてみたのですが、それでも通貨型となってしまいます。

引用返信 編集キー/
■89596 / inTopicNo.6)  Re[4]: Excelオブジェクトに関して(VB6)
□投稿者/ リンクス (11回)-(2018/12/07(Fri) 11:40:40)
ちょっと調べてみたら、VB6からの操作ではないのですが、
数値が通貨形式になってしまうという案件が報告されています。

■数値が通貨形式になってしまう
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_other-mso_2010/%e6%95%b0%e5%80%a4%e3%81%8c%e9%80%9a%e8%b2%a8/245138dd-246c-4144-83a7-28b1cc9402bb?messageId=1e7a5ead-9100-4ce5-860f-e50f8aac20c0

ただし、この場合、通貨形式となったスタイル自体が編集できなかった、とのことで、
新しくExcel bookを作成して問題を解消したとのことです。(ファイル内のスタイル情報の部分が破損していたらしい?)
今回のケースが当てはまるかどうか分かりませんが、
別のExcel bookで同じことが起こるかどうか、試してみる価値はありそうです。
引用返信 編集キー/
■89597 / inTopicNo.7)  Re[1]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 (1974回)-(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 では制限せず)
引用返信 編集キー/
■89598 / inTopicNo.8)  Re[4]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 (1975回)-(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 )
にしてみる、ということです。
引用返信 編集キー/
■89615 / inTopicNo.9)  Re[5]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (62回)-(2018/12/10(Mon) 11:27:03)
リンクス様

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

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

ファイル破損の可能性も考えられるため、全く新しいシートで
試してみましたが、改善はされませんでした。
プログラムの観点から調査を行っていたので、
環境設定等も見直してみます。

引用返信 編集キー/
■89616 / inTopicNo.10)  Re[6]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (63回)-(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クローズ


引用返信 編集キー/
■89618 / inTopicNo.11)  Re[7]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 (1981回)-(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/
引用返信 編集キー/
■89623 / inTopicNo.12)  Re[8]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (64回)-(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



引用返信 編集キー/
■89626 / inTopicNo.13)  Re[9]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 (1984回)-(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 バージョン)を使っている他者にも
検証できますので、バージョン依存性や環境依存性があるのかどうかを確認できそうです。
引用返信 編集キー/
■89630 / inTopicNo.14)  Re[10]: Excelオブジェクトに関して(VB6)
□投稿者/ k3user (66回)-(2018/12/11(Tue) 14:02:16)
魔界の仮面弁士様

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

>「現象を再現可能なコード」というのは、第三者がそのまま自身の環境で
>検証可能となる情報を提供して欲しい、という意味でした…。
申し訳ございません。当方の認識不足でした。

>既存のファイルを使うのではなく、「新規ブック」で試してみてください。
>新規に新しい Excel ファイルを用意し、そこに最低限度の書式設定を
>施したものを読み込ませて、再現性を確認してみるということです。
>もしも新規ファイルで再現せず、特定のファイルでのみ起こる事象なら、
>VB のコードを見てもあまり意味は無く、元ファイルの内容を疑っていくべきかと。
>一方、新規ファイルでも再現するようであれば、その検証ファイルの作成手順を公開すると共に、
>セルの内容(というか書式指定?)が処理の前後でどう変化するのかを示して頂けれあ、
>他の Excel バージョン(あるいは同じ Excel バージョン)を使っている他者にも
>検証できますので、バージョン依存性や環境依存性があるのかどうかを確認できそうです。

以下の2つを検証しました。

1.新規ファイルを作成し、元ファイルの最低限の書式設定を行い、問題のプログラムを実行
2.新規ファイルを作成し、Excelのオープン、クローズのみを行うプログラムを新規に作成・実行

1の結果:書式が変更されない。
2の結果:書式が変更されない。

上記の結果からファイル自体に問題があるようです。
現在、ファイルの詳細な情報を調査中です。
(原因が分かり次第、ご報告します。)


色々と有益な情報を教えていただき誠にありがとうございます。




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

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

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

よって今回の質問を解決済みとさせていただきます。
回答をいただいた皆様、この度は誠にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -