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

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

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

エクセルのシングルコーテーションの扱い

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

■83744 / inTopicNo.1)  エクセルのシングルコーテーションの扱い
  
□投稿者/ むぅ (18回)-(2017/04/06(Thu) 11:49:54)

分類:[C#] 

Vs2010 .net3.5 C# Win7 32/64

お世話になります。
エクセルシートのセルに '0003' のようなデータを記入している場合、
この値を含む領域を以下の用にして取得すると、先頭のシングルコーテーションが消えてしまいます。

Excel.Range rgn2 = ws.Range(ws.Cells[1, 1], ws.Cells[nMaxRow, nMaxCol]);
object[,] ob = (object[,])rgn2.Value;

取得できるデータは 0003' になる。

正しく、'0003'と取得することはできないでしょうか。
尚、エクセルシート側は他のツールからも参照されているため、変更することはできない
という制約があります。

よろしくお願いします。

引用返信 編集キー/
■83751 / inTopicNo.2)  Re[1]: エクセルのシングルコーテーションの扱い
□投稿者/ 魔界の仮面弁士 (1245回)-(2017/04/06(Thu) 13:40:43)
No83744 (むぅ さん) に返信
> エクセルシートのセルに '0003' のようなデータを記入している場合、
> この値を含む領域を以下の用にして取得すると、先頭のシングルコーテーションが消えてしまいます。

文字列先頭の「'」は、「文字列データ」であることを意味しています。

実際、手動でExcel に「'0003'」とキーボードから入力した場合、
先頭のシングルクォートの無い「0003'」とセルに表示されることでしょう。



> 正しく、'0003'と取得することはできないでしょうか。
CSV ではなく、Excel データなのですよね。

この場合、先頭のシングルクォートはそもそもデータの一部では無いため、
取得しないのが正解です。
http://officetanaka.net/excel/function/tips/tips15.htm


一応、クリップボード操作等により、先頭の ' もデータの一部と
みなされるケースがありますが、そのようなセルの場合は問題ない筈です。

http://www.vb-user.net/junk/replySamples/2017.04.06.13.33/excel.png

たとえば上記のケースでは、Range の Value プロパティ や Text プロパティで
B2 セルに対しては、「'0003'」が返却され、
B4 セルに対しては、「0003'」が返却される状態となります。


どうしても区別したければ、PrefixCharacter プロパティを併用してみてください。
引用返信 編集キー/
■83752 / inTopicNo.3)  Re[2]: エクセルのシングルコーテーションの扱い
□投稿者/ むぅ (19回)-(2017/04/06(Thu) 14:25:08)
魔界の仮面弁士さま
お世話になります。ご回答、ありがとうございます。

> この場合、先頭のシングルクォートはそもそもデータの一部では無いため、
> 取得しないのが正解です。
このシートを扱っている他のシステムが 'aaa'hogehoge のようにシングルコーテーション
から始まるデータを入力して扱っているため、作成しているツールでも先頭のシングルコーテーション
を読み取る必要があるのですが、2次元配列に取り込む形での実装で、先頭からカットされるので
困っております。

> B2 セルに対しては、「'0003'」が返却され、
> B4 セルに対しては、「0003'」が返却される状態となります。
ハードコピーを見た限りでは、両方とも'0003'となっているようですが、
プロパティ参照になると、変わるということでしょうか。


> どうしても区別したければ、PrefixCharacter プロパティを併用してみてください。
PrefixCharacterは読み取り専用のプロパティですが、どのように利用すればよいでしょうか。

よろしくお願いしますm(__)m


引用返信 編集キー/
■83753 / inTopicNo.4)  Re[3]: エクセルのシングルコーテーションの扱い
□投稿者/ 大谷刑部 (19回)-(2017/04/06(Thu) 14:48:18)
No83752 (むぅ さん) に返信
> 魔界の仮面弁士さま
>>B2 セルに対しては、「'0003'」が返却され、
>>B4 セルに対しては、「0003'」が返却される状態となります。
> ハードコピーを見た限りでは、両方とも'0003'となっているようですが、
> プロパティ参照になると、変わるということでしょうか。

魔界の仮面弁士さんの言っていることを理解してますか?
セルの値自体が'0003'だと0003'なるといっていると思いますが?

''0003'とするか、="'0003'"
としないと、値は'0003'にならないと思いますが。
これはVBの問題ではなく、単にExcelの仕様です。
引用返信 編集キー/
■83754 / inTopicNo.5)  Re[4]: エクセルのシングルコーテーションの扱い
□投稿者/ 大谷刑部 (20回)-(2017/04/06(Thu) 15:21:28)
No83753 (大谷刑部 さん) に返信
> これはVBの問題ではなく、単にExcelの仕様です。

すみません。C#でしたね。ただどっちにしたもプログラム言語の問題ではありません。

尚、クリップボードからの貼り付けの場合、
'0003'をセルに張り付けるか、式入力に張り付けるかによって、
値が、'0003'となるか0003'なるか変わると思います。

入力インターフェースをどこまで許すか、
仕様を明確にした方がいいと思います。
引用返信 編集キー/
■83755 / inTopicNo.6)  Re[3]: エクセルのシングルコーテーションの扱い
□投稿者/ PANG2 (169回)-(2017/04/06(Thu) 15:25:24)
No83752 (むぅ さん) に返信
> このシートを扱っている他のシステムが 'aaa'hogehoge のようにシングルコーテーション
> から始まるデータを入力して扱っているため、作成しているツールでも先頭のシングルコーテーション
> を読み取る必要があるのですが、2次元配列に取り込む形での実装で、先頭からカットされるので
> 困っております。

先頭のシングルコーテーションが、セル値に設定されないという他システム側のバグだと思いますが..


>>どうしても区別したければ、PrefixCharacter プロパティを併用してみてください。
> PrefixCharacterは読み取り専用のプロパティですが、どのように利用すればよいでしょうか。

https://oshiete.goo.ne.jp/qa/8974726.html
引用返信 編集キー/
■83756 / inTopicNo.7)  Re[3]: エクセルのシングルコーテーションの扱い
□投稿者/ 大谷刑部 (21回)-(2017/04/06(Thu) 16:45:38)
No83752 (むぅ さん) に返信
>>どうしても区別したければ、PrefixCharacter プロパティを併用してみてください。
> PrefixCharacterは読み取り専用のプロパティですが、どのように利用すればよいでしょうか。

PrefixCharacterが'の時をどう扱うかですが、
PrefixCharacterの'を一律データの'とみなしてしまうなら、

PrefixCharacterのlengthをとるなり、

if (PrefixCharacter = ''')

で条件分岐するなりすればよいと思います。

ただ、Excelの仕様にわざわざ逆らうロジックがいいとはあまり思えません。

''と入力して値が'の場合と
コピペで'を張り付けて値が'の場合、
excelの仕様上は値はともに'なので。




引用返信 編集キー/
■83757 / inTopicNo.8)  Re[3]: エクセルのシングルコーテーションの扱い
□投稿者/ 魔界の仮面弁士 (1246回)-(2017/04/06(Thu) 18:27:03)
No83752 (むぅ さん) に返信
>>どうしても区別したければ、PrefixCharacter プロパティを併用してみてください。
> PrefixCharacterは読み取り専用のプロパティですが、どのように利用すればよいでしょうか。

string s = rng.PrefixCharacter + rng.Textもしくはrng.Value;

という感じです。複数セルの一括処理はできないので、1 セルずつ調べる必要があります。
引用返信 編集キー/
■83758 / inTopicNo.9)  Re[4]: エクセルのシングルコーテーションの扱い
□投稿者/ 魔界の仮面弁士 (1247回)-(2017/04/06(Thu) 18:55:49)
No83756 (大谷刑部 さん) に返信
> ''と入力して値が'の場合と
> コピペで'を張り付けて値が'の場合、
> excelの仕様上は値はともに'なので。

一度「'」付きでセットされたセルに対して、
新しい値 "ABC" をセットした場合には、
「ABC」形式でセットされるバージョンもあれば、
「'ABC」形式でセットされるバージョンもあるので、
各パターンに対処しようとすると、意外と大変だったりします。


> PrefixCharacterが'の時をどう扱うかですが、
> PrefixCharacterの'を一律データの'とみなしてしまうなら、

PrefixCharacter が返す値は、「」 と 「'」 だけではあるとは限りません。
TransitionNavigKeys = True な場合には、「^」や「"」が返されることもあります。


通常は先頭' がセル上に表示されることは無いですし、
数式バーの表現が異なるとはいえ、データ上は PrefixCharacter が無視されるわけですから、
そういうものだと割り切ってしまった方が良いとおもいますよ。> むぅさん
引用返信 編集キー/
■83761 / inTopicNo.10)  Re[4]: エクセルのシングルコーテーションの扱い
□投稿者/ むぅ (21回)-(2017/04/07(Fri) 11:30:35)
2017/04/07(Fri) 11:59:50 編集(投稿者)

お世話になります。
ご回答、ありがとうございます。
PrefixCharacter ですが、取り扱うエクセルシートの数が大量となるため、
各セルへの個別アクセスをすると処理時間が長くなり、実用に堪えなく
なるため、今回は見送ります。

※動作確認はOffice2007で実施中

現場に確認してみて判明したことです。
MDBレコード上で先頭にシングルコーテーション
を含むデータがあり、該当レコードをエクセルシートにコピペすると、
シート上では先頭のシングルコーテーションも見える状態になります。その状態で
既存システムで該当データを扱うと先頭のシングルコーテーション
も正常に取り扱って処理ができます(欠落が発生しない)。

但し、エクセルシートに貼り付けた状態で 'aaa' だったものを 'aaa2' とか
に手編集した場合、その時点で先頭の’は見えなくなります。また、既存システム
でのデータ処理も先頭の'が欠落します。
シート内部で何らかの違いが発生しているように思うのですが、この違いは何でしょうか。

セルの表示形式上では標準となり、違いがあるようには見えません。


なにか情報がありましたら、よろしくお願いします。








引用返信 編集キー/
■83762 / inTopicNo.11)  Re[5]: エクセルのシングルコーテーションの扱い
□投稿者/ W10 (1回)-(2017/04/07(Fri) 12:44:52)
No83761 (むぅ さん) に返信

MDBからコピペしたセルの中身を数式バーでのぞけば
''abc'
みたいになってませんでしょうか?
引用返信 編集キー/
■83763 / inTopicNo.12)  Re[6]: エクセルのシングルコーテーションの扱い
□投稿者/ むぅ (22回)-(2017/04/07(Fri) 13:12:01)
W10 さま
>''abc'
>みたいになってませんでしょうか?

ならないです。'abc' で、先頭の’も見える状態です。


上記セルをF2キーで編集状態に入って、Enterキーを押すと
先頭の’が見えない状態となり、 abc' という表示になります。

再度F2を押して編集状態とすると 'abc' になるため、先頭の’
が特殊記号として変化しているように思います。


引用返信 編集キー/
■83765 / inTopicNo.13)  Re[7]: エクセルのシングルコーテーションの扱い
□投稿者/ 大谷刑部 (22回)-(2017/04/07(Fri) 13:54:05)
No83763 (むぅ さん) に返信
> W10 さま
> >''abc'
> >みたいになってませんでしょうか?
>
> ならないです。'abc' で、先頭の’も見える状態です。
>
>
> 上記セルをF2キーで編集状態に入って、Enterキーを押すと
> 先頭の’が見えない状態となり、 abc' という表示になります。
>
> 再度F2を押して編集状態とすると 'abc' になるため、先頭の’
> が特殊記号として変化しているように思います。
>

その状態が、
値(Valueプロパティー)がabc'
でPrefixCharacterプロパティーの値が'である状態と思いますが。
それが古来からのExcelの仕様です。

魔界の仮面弁士さんがおっしゃっているように、
その際のPrefixCharacterプロパティーの値が'であるケースと
値(Valueプロパティー)自体に'が含まれるケースのパターンを取りきるのが
ほぼ不可能になる限り難しいので、

実際にあり得るケースと、アプリ側の仕様の前提を確定させてから
ロジックを組み立てた方がいいと思います。







引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ