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

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

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

Re[4]: C# Excelの空白セルを判定したい


(過去ログ 140 を表示中)

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

■82094 / inTopicNo.1)  C# Excelの空白セルを判定したい
  
□投稿者/ ごう (13回)-(2016/12/09(Fri) 11:31:53)

分類:[.NET 全般] 

Visual Studio 2013を使用しC#でExcelのセルの値を参照し、
別のファイルへ転記するプログラムを作成しています。

以下のプログラムを書き、rangeのValueプロパティの値で空白を判断しようとしました。
Microsoft.Office.Interop.Excel.Range range = sheet.Cells[row, col];

空白セルのValueに"0.0"と入ってきてしまうことがあり、
セルに数値"0"を入力した場合と区別ができなくて困っています。

他のサイトも検索しましたが、IsEmptyをどこで使えばよいか(Valueはstring型でないため使えないと思う)わからず困っています。

空白セルの判定方法についてご教示いただきたく、よろしくお願いいたします。
引用返信 編集キー/
■82097 / inTopicNo.2)  Re[1]: C# Excelの空白セルを判定したい
□投稿者/ 魔界の仮面弁士 (1006回)-(2016/12/09(Fri) 14:44:15)
No82094 (ごう さん) に返信
> Microsoft.Office.Interop.Excel.Range range = sheet.Cells[row, col];
ReleaseComObject のために、Cells も変数に取った方が
よいかも知れませんが、それはさておき。


> 空白セルのValueに"0.0"と入ってきてしまうことがあり、
具体的にはどういう時でしょうか?

検証可能なワークブックをどこかにアップロードいただくか、
あるいは再現できるデータ入力手順を提示いただけると助かります。


Value プロパティや Value2 プロパティが返す値のデータ型は、
VBA 的には Variant 、C# 側としては dynamic または object ですが、
実際の型は、Range の内容によって変化します。

ただ、本当に空白セルであれば、Variant の Empty が返されます。
これは、「文字列としては ""、数値としてのゼロ」にあたる値ですが、
C# 側では null 扱いになるはずです。

それが 0.0 として返されてしまうということは、
「実際には空白セルではなかった」可能性が思い当たります。


ちなみに、該当する Range オブジェクトの FormulaR1C1 プロパティや
Text プロパティは、どのような値を返してきますか?

また、Application オブジェクトに対して .Evaluate("ISBLANK(Sheet1!A1)") を
呼び出したり、あるいはワークシート上の他のセルに
=ISBLANK(A1) などの数式を書いた場合に true が返されますか?

もしも ISBLANK 関数が false を返すのなら、そのセルがどういう状態なのかを
教えていただくか、検証可能なブックを用意していただけると、
原因を特定しやすくなります。


> IsEmptyをどこで使えばよいか
VBA の IsEmpty 関数のことだとしたら、今回、出番は無いと思います。
引用返信 編集キー/
■82110 / inTopicNo.3)  Re[2]: C# Excelの空白セルを判定したい
□投稿者/ ごう (14回)-(2016/12/12(Mon) 13:54:52)
回答ありがとうございました。
検証可能なワークブックをアップロードすることができないので
当方で確認できた現象について報告させてください。

現象のスクリーンショットは以下の通りです。(firestorageサービスを利用)
http://xfs.jp/pNQzHX

G10、G11 2つのセルに対して
=ISBLANK(G10)と=ISBLANK(G11)を書いてその結果の違いを確認しました。
G10はブランクではなく、G11はブランクでした。

G10セルにカーソルを置き、値を確認すると"0"となっておりました。
これが、range.Valueが"0.0"となってしまう原因でした。

不思議なのは、G10セルの文字色を黒にしたり、
G10セルの幅を広げたりしてみましたが、"0"という数字がセル上で確認できないことです。
これも調べたら、Excelファイルの設定で「ゼロ値のセルにゼロを表示する」のチェックが外れていました。
http://www.relief.jp/itnote/archives/018327.php



引用返信 編集キー/
■82111 / inTopicNo.4)  Re[3]: C# Excelの空白セルを判定したい
□投稿者/ 魔界の仮面弁士 (1008回)-(2016/12/12(Mon) 14:51:00)
No82110 (ごう さん) に返信
> これも調べたら、Excelファイルの設定で「ゼロ値のセルにゼロを表示する」のチェックが外れていました。

この設定は、Excel.Window オブジェクトの DisplayZeros プロパティで確認/変更できます。


また、現在表示されている Window オブジェクト を取得するには、
Excel.Application オブジェクトの ActiveWindow プロパティを使います。


すべての Window オブジェクトを列挙するのであれば、
Workbook オブジェクト(または Application オブジェクト)の
Windows プロパティから Excel.Windows コレクションを取得します。


> セルに数値"0"を入力した場合と区別ができなくて困っています。

非表示なだけで値としては 0 なので、計算上は区別する必要は無いと思いますが、
Window オブジェクトが一つしか無い場合においては、Range オブジェクトの
Text プロパティを使うことで、G10 セルから 空文字列 を得ることができます。


しかし Window オブジェクトが複数ある場合には、Range オブジェクトからでは
正確に辿れません。[表示]リボンの[新しいウィンドウを開く]で、同じシートを表示すると、
同じシートでも、ウィンドウごとにゼロ表示の on/off を切り替えられるためです。
この場合は、現 Window の DisplayZeros プロパティの確認も必要になるでしょう。
引用返信 編集キー/
■82168 / inTopicNo.5)  Re[4]: C# Excelの空白セルを判定したい
□投稿者/ ごう (15回)-(2016/12/14(Wed) 12:57:58)
回答ありがとうございます。

>この設定は、Excel.Window オブジェクトの DisplayZeros プロパティで確認/変更できます。

DisplayZeros プロパティを確認し、0を出力していないブックについては
セルに0が入ってきたとき空白扱いとするように対応することにしました。
(セルに"0"のみが入ることはない、と確認できたため)

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -