質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

4913閲覧

C#で、エクセルのセルの値を変数に代入する方法を教えてください

suban

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/12 10:33

編集2016/12/13 05:00

下記のプログラムが、動作するところまでは修正したのですが
oWSheet.Cells[1, 1].Valueのところがセルの値を読み込んでいると
思いますが、このデータを変数にセットしたいと考えております
(バイナリデータでセットできればと思ってます。)

下記のサイトを参考にさせて頂きました。
http://www.osadasoft.com/c-%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%8b%e3%82%89excel%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e8%aa%ad%e3%81%bf%e6%9b%b8%e3%81%8d%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/

Excel._Worksheet oWSheet = (Excel._Worksheet)oExcelWBook.ActiveSheet; // セルA1の値を取得 MessageBox.Show("セルA1の値:" + oWSheet.Cells[1, 1].Value); // セルA2に更新時刻を書き込み oWSheet.Cells[2, 1] = DateTime.Now.ToString("HH時mm分ss秒"); Excel.Range oRange = oWSheet.Cells[2, 1]; // セル選択 oRange.Font.Size = 8; oRange.Font.Name = "MS 明朝"; oRange.Font.Color = 0xFF0000; oRange.Interior.Color = 0x44FFFF; // [Microsoft Excel - 互換性チェック]ダイアログの表示有無 oExcelWBook.CheckCompatibility = false; oExcelWBook.SaveAs(fileName); // Excel保存 MessageBox.Show( 下記のプログラムでbufが未使用でしたのでコンパイラが勝手に削除されているのかと思いまして下記のbufをシリアル出力するようにしました。 byte[] buf = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oWSheet.Cells[1, 1].Value as string); serialPort1.Write(buf, 0, 8); 実行してみますと byte[] buf =・・・・のところに 「型 'System.ArgumentNullException' のハンドルされていない例外が mscorlib.dll で発生しました」 というエラーが発生していました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/12/12 13:50

そのセルのExcel上での型は何でしょう?文字列ですか?文字列をバイナリーデータとして変数へセットするという意味が曖昧です。バイナリーデータはどういう意味で使っていますか?バイナリーデータで変数にセットできたら何ができると期待しているか等々を追記したほうがよいと思います。
suban

2016/12/13 00:12

ご指摘のとおりでした。データの形、変換についてが曖昧でした。(昨日帰り気が付きました)Excel上のデータの形は、文字列で、そのデータのアスキーコードにしてシリアルでバイナリ送信しようとしております。excel上の文字列は8文字です
suban

2016/12/13 01:52

ご指摘のとおりでした。データの形、変換についてが曖昧でした。(昨日帰り気が付きました)Excel上のデータの形は、文字列で、そのデータのアスキーコードにしてシリアルでバイナリ送信しようとしております。excel上の文字列は8文字です
BEACHSIDE

2016/12/13 03:35

結局何を回答すればよいか謎なんですが、質問の「エクセルのセルの値を変数に代入する方法を教えて」ってことを知りたいんでしょうか?データを送信したいんでしょうか?で、サンプルコードで現状で何が問題です?「下記のプログラムが、動作するところまでは修正した」ということですが、「MessageBox.Show("セルA1の値:" + oWSheet.Cells[1, 1].Value); 」で値って取れてるんでしょうか?追記か質問の内容自体更新していただけると回答しやすいかと思います。
suban

2016/12/13 04:21

申し訳けありません。質問が曖昧でした。エクセルのセルの値を変数に代入する方法を教えて頂きたいです。下記のプログラムで、bufferの値をウオッチしました。
BEACHSIDE

2016/12/13 04:34

oWSheet.Cells[1, 1].Valueで値取れてます?取れてないなら、Excelのシートの指定とかインスタンスの取得とか問題っぽいので「oWSheet」で取得したいエクセルシートが取得できているか気になります。(その)部分のコードだったりExcelの状況がわからないのでとりあえずここで書いてます~♪
suban

2016/12/13 04:55

ご指導を賜り、誠にありがとうございます。まだ、teratallの使い方さえわかってなく、申し訳けありません
suban

2016/12/13 04:57

MessageBox.Show("セルA1の値:" + oWSheet.Cells[1, 1].Value)の処理の部分は正常に動作しており、セルの値が表示されておりました。
guest

回答3

0

質問に書いてある情報が正しい前提だと、

byte[] buf = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oWSheet.Cells[1, 1].Value as string);

serialPort1.Write(buf, 0, 8);

oWSheet.Cells[1, 1].Value as stringの結果がNULLだったので、GetBytes()メソッドがArgumentNullExceptionを出しているだけですね。

oWSheet.Cells[1, 1].Valueで値が正しくとれてるんですよね?
問題の切り分けとして、oWSheet.Cells[1, 1].Valueを変数に渡してみたりしてみては?あと、その時の型なんでしょ?で、それをstringにして、GetBytes()メソッドに渡してあげればよいかと。

(今すぐは環境ないので...とりあえず問題切り分けの考え方だけの記載ですが....いけそうですかね?)

投稿2016/12/13 05:16

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suban

2016/12/13 06:47

c#は勉強中で、このように詳しく教えて頂き ありがとうございます
suban

2016/12/13 07:02

ありがとうございます。 切り分けの為、 buf_test に代入してみますと buf_test の宣言を double buf_test ;  としますと、セル値が読める事を確認しました buf_test = oWSheet.Cells[1, 1].Value; buf = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(oWSheet.Cells[1, 1].Value2 as string);
BEACHSIDE

2016/12/13 07:22

ああ、そういうことしてたんですね。エクセルのセルの値が数値なんでしょうか。で、as stringするとnullになるってオチです。 使い方は確認しておいてほしいですが、 oWSheet.Cells[1, 1].Text.ToString()してあげると、数値でもなんでも文字列で取得することができます=GetBytesの引数にすることができます。
BEACHSIDE

2016/12/13 07:28

あ、一応言っておくと、使い方次第ですが、Value.ToString()としてももちろん値はとれます。 あとは、Encoding次第で送信する値が変わるのでご注意くださいくらいって感じですねー♪
BEACHSIDE

2016/12/13 07:45

連投すいません。(さっきから仕事の合間に思い付きで書いてばかりなのです...) 使い方勘違いされないように追記しておくと、doubleかintかなんかを as stringしたのでnullになったという点についてGetBytes()メソッドは、いろんな型を取れるオーバーロードメソッドはあります。で、今回、excelに入力されているものは、数字以外もあるのかなー(DateTimeとか文字列とか)とかってに思って安全策で勝手にToString()にしました。 数字しかないなら数字使ってそのままGetBytesしていいかと判断もできます。型指定面倒だからvar使ってお任せしてよいかもしれませんが、型によってはException出るリスクはあります。 そのためstringにしてGetBytesメソッドに入れてます。 ということは、その後の処理(SerialPortで送信するんです?)のDecodeするときは、その仕様に注意せなあかんということはあります。
suban

2016/12/13 08:08

ありがとうございます。 Text.ToString()、Value.ToString()の両方とも試してみました。 数字は、双方とも正常に読めました。 アルファベットは、読めませんでした。 様々とご指導を戴き、誠にありがとうございます C#の勉強中で、全文の理解には至っておりませんが のちに、読み返し理解を深めます
suban

2016/12/13 08:35

すみません。 byte buf_test  =>String buf_test と修正する事で bufの方も、読めました(アルファベットも) 最初の行で、エラーになっていたようです すみません。
suban

2016/12/13 09:08 編集

誠にありがとうございました。 下記の修正で、セルの文字列がシリアル送信できる事を 確認できました。私の質問の曖昧さ、修正ミスでご迷惑をおかけしました buf = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(oWSheet.Cells[1, 1].Value.ToString()); serialPort1.Write(buf, 0, 4);
guest

0

ValueじゃなくてValue2使うと解決するかもしれません
http://d.hatena.ne.jp/ron_s-nakazawa/20120924/1348452525

投稿2016/12/13 05:07

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suban

2016/12/13 06:46

下記のように、入力しますと buf = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(oWSheet.Cells[1, 1].Value2 as string); 「追加情報:文字列参照が文字列のインスタンスに設定されていません。」というエラーメッセジが表示されました。
ishi9

2016/12/13 06:50

「Value2 as string」ではなく「Value2.ToString()」としてください。
suban

2016/12/13 07:11

ありがとうございました。ご指摘のとおり修正して bufにセル値が入っている事が確認できました。 buf = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(oWSheet.Cells[1, 1].Value2.ToString());
guest

0

ベストアンサー

これでは違いますか?

byte[] buffer = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oWSheet.Cells[1, 1].Value as string);

投稿2016/12/12 11:25

dn315

総合スコア201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suban

2016/12/13 01:05

ご回答を戴き、ありがとうございます。 早速、下記のように追加してみました。 ビルドは正常に実行できましたが、デバッグで bufferの中身を見ますと。'0'でした。(変数に書き込みされていないようです) // セルA1の値を取得 MessageBox.Show("セルA1の値:" + oWSheet.Cells[1, 1].Value); byte[] buffer = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oWSheet.Cells[1, 1].Value as string);
KSwordOfHaste

2016/12/13 04:38 編集

dn315さんの方法を使えばExcelのセルが"AB"ならbufferの中身は2要素で中身は0x41 0x42になります。ちなみに質問者さんがやりたいのは以下のどちらですか? "AB" -> 0x41 0x42 "AB" -> "4142" -> 0x34 0x31 0x34 0x32 「アスキーコードにしてシリアルでバイナリ送信」という表現が若干曖昧な気がします。上のように具体的な例を示せば曖昧さは解消できると思います。
suban

2016/12/13 07:44

皆様、ありがとうございます。 質問が曖昧で、申し訳けありません やりたい事は、上です。 "AB" -> 0x41 0x42 byte[] buffer = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oWSheet.Cells[1, 1].Value as string); とする事で 数字の文字列は、正常に読み込めましたがアルファベットは読めませんでした セルの値    buf値 123     buf[0]=49、buf[1]=50、buf[2]=51 アルファベットも読めるようにしたいと考えております
suban

2016/12/13 08:36

すみません。 byte buf_test  =>String buf_test と修正する事で bufの方も、読めました(アルファベットも) 最初の行で、エラーになっていたようです すみませんでした。
suban

2016/12/13 08:48 編集

皆様、誠にありがとうございました。 下記の修正で、セルの文字列がシリアル送信できる事を 確認できました。私の質問の曖昧さ、修正ミスでご迷惑をおかけしました buf = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(oWSheet.Cells[1, 1].Value.ToString()); serialPort1.Write(buf, 0, 4);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問