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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

4317閲覧

C#のコンボボックスからグリッドビューのデータをExcelファイルに出力したい

rura

総合スコア70

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/08/06 02:30

編集2018/09/06 02:05

前提・実現したいこと

ご閲覧ありがとうございます。
C#を勉強中の初心者です。
下記内容に取り組んでますが、
よくわからないので、
教えてください。

■■な機能を実装中に以下のエラーメッセージが発生しました。

C#の初心者です。
グリッドビューに登録した大量のデータをExcel出力ボタンで
自分の好きなフォルダーに保存しようとしています。
下記サイトなどを参考にやってますが、
どうしても、下記の部分をコピー使用するとエラーが発生してしまいます。
どのように直せばよいでしょうか?
よろしくお願いします。

発生している問題・エラーメッセージ

問題の箇所

エクセルにgridviewのデータが正しく保存されない

objWorkSheet.get_Range( objWorkSheet.Cells[1, 1],objWorkSheet.Cells[ this.Rows.Count,this.Columns.Count]).Value2 = v; いつもこのソースで下記内容のエラーが出現します。 解決策をご教授ください Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''object' に 'get_Range' の定義がありません'

自分のソースコード

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // EXCEL起動 Excel.Application objExcel = new Excel.Application(); Excel.Workbook objWorkBook = objExcel.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel.Worksheet objWorkSheet = (Excel.Worksheet)objWorkBook.Sheets[1]; // DataGridViewのセルのデータ取得 String[,] v = new String[ dataGridView1.Rows.Count, dataGridView1.Columns.Count]; for (int r = 0; r <= dataGridView1.Rows.Count - 1; r++) { for (int c = 0; c <= dataGridView1.Columns.Count - 1; c++) { String dt = ""; if (dataGridView1.Rows[r].Cells[c].Value != null) { dt = dataGridView1.Rows[r].Cells[c].Value. ToString(); } v[r, c] = dt; } } // EXCELにデータ転送 objWorkSheet.get_Range( objWorkSheet.Cells[1, 1], objWorkSheet.Cells[ dataGridView1.Rows.Count, dataGridView1.Columns.Count]).Value2 = v; // エクセル表示 objExcel.Visible = true; // EXCEL解放 Marshal.ReleaseComObject(objWorkBook); Marshal.ReleaseComObject(objExcel); Marshal.ReleaseComObject(objWorkSheet); objWorkSheet = null; objWorkBook = null; objExcel = null; // //メッセージボックスを表示する // DialogResult result = MessageBox.Show("データをExcelに出力しますか?", // "質問", // MessageBoxButtons.OKCancel, // MessageBoxIcon.Exclamation); // //何が選択されたか調べる // if (result == DialogResult.Yes) // { // } // else if (result == DialogResult.No) // { // //「いいえ」が選択された時 // MessageBox.Show("「いいえ」が選択されました\nシステムを終了します。"); // return; // } } private void button2_Click(object sender, EventArgs e) { //OpenFileDialogクラスのインスタンスを作成 OpenFileDialog ofd = new OpenFileDialog(); //はじめに表示されるフォルダを指定する //指定しない(空の文字列)の時は、現在のディレクトリが表示される ofd.InitialDirectory = @"C:\"; //[ファイルの種類]に表示される選択肢を指定する //指定しないとすべてのファイルが表示される ofd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル (*.*)|*.*"; //[ファイルの種類]ではじめに選択されるものを指定する //2番目の「すべてのファイル」が選択されているようにする ofd.FilterIndex = 2; //タイトルを設定する ofd.Title = "開くファイルを選択してください"; //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする ofd.RestoreDirectory = true; //存在しないファイルの名前が指定されたとき警告を表示する //デフォルトでTrueなので指定する必要はない ofd.CheckFileExists = true; //存在しないパスが指定されたとき警告を表示する //デフォルトでTrueなので指定する必要はない ofd.CheckPathExists = true; ////メッセージボックスを表示する DialogResult result = MessageBox.Show("グリッドビューにExcelデータを読み込みしますか?", "質問", MessageBoxButtons.YesNo, MessageBoxIcon.Question); // //何が選択されたか調べる if (result == DialogResult.Yes) { //ダイアログを表示する if (ofd.ShowDialog() == DialogResult.OK) { int MaxColumns = dataGridView1.Columns.Count - 1; int MaxRows = dataGridView1.Rows.Count - 1; //OKボタンがクリックされたとき、選択されたファイル名を表示する MessageBox.Show("「はい」が選択されました" + " \n選択したファイル名" + ofd.FileName + " \n出力範囲 (縦 / 横) " + MaxColumns +" / "+ MaxRows,       "ファイル情報", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //Excelを読み取りをOKした場合のイベント //Excelデータのパス string fileName = ofd.FileName; // EXCEL起動&表示 Excel.Application objExcel = new Excel.Application(); //Excelファイルの中身を開いて確認 Excel.Workbook objWorkBook = objExcel.Workbooks.Open(fileName, // オープンするExcelファイル名 Type.Missing, // (省略可能)UpdateLinks (0 / 1 / 2 / 3) Type.Missing, // (省略可能)ReadOnly (True / False ) Type.Missing, // (省略可能)Format // 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;) // 5:なし / 6:引数 Delimiterで指定された文字 Type.Missing, // (省略可能)Password Type.Missing, // (省略可能)WriteResPassword Type.Missing, // (省略可能)IgnoreReadOnlyRecommended Type.Missing, // (省略可能)Origin Type.Missing, // (省略可能)Delimiter Type.Missing, // (省略可能)Editable Type.Missing, // (省略可能)Notify Type.Missing, // (省略可能)Converter Type.Missing, // (省略可能)AddToMru Type.Missing, // (省略可能)Local Type.Missing // (省略可能)CorruptLoad ); Excel.Worksheet objWorkSheet = (Excel.Worksheet)objWorkBook.Sheets[1]; // EXCELの各セルの値をDataGridViewに表示 Object v; int r = 0; dataGridView1.Rows.Clear(); do { dataGridView1.Rows.Add(); Boolean blnNew = false; for (int c = 0; c <= dataGridView1.Columns.Count - 1; c++) { v = ((Excel.Range)objWorkSheet.Cells[r + 1, c + 1]).Value2; if (v != null) { blnNew = true; dataGridView1.Rows[r].Cells[c].Value = v.ToString(); } } if (blnNew == false) { dataGridView1.Rows.RemoveAt(r); break; } r += 1; } while (true); // EXCEL解放 objWorkBook.Saved = true; objWorkBook.Close(false, Type.Missing, Type.Missing); objExcel.Quit(); Marshal.ReleaseComObject(objWorkSheet); Marshal.ReleaseComObject(objWorkBook); Marshal.ReleaseComObject(objExcel); objWorkSheet = null; objWorkBook = null; objExcel = null; } } else if (result == DialogResult.No) { //「いいえ」が選択された時 MessageBox.Show("「いいえ」が選択されました"); } } } }

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
C# 、Windows Excel 2010

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/08/06 02:38

すみませんが、質問が盛りだくさん過ぎます。質問文が日本語レベルで分からないとこともありますし。質問を今一番知りたいこと一点に絞って質問するのがよさそうです(例:SQL Server のあるテーブルのレコード一覧を DataGridView に表示したい・・・とか)
Zuishin

2018/08/06 03:03

ウィンドウズ 2010 がどれを指すのか全くわかりませんし本当に SQL Server なのかすら怪しいですね。バージョンや名称は正確に書きましょう。
Zuishin

2018/08/09 23:53

人の話を聞かない人だ。
rura

2018/08/31 06:19

WindowsのExcelとSQL Serverが2010です。
yukihisa

2018/08/31 06:33

データの表示まではできているのですかね?なにやらインデントとかもおかしいし、まずは設計からしてみては?
退会済みユーザー

退会済みユーザー

2018/08/31 07:16

話が通じないですね。一度読んでください ⇒ https://teratail.com/help/question-tips 今は「自分が今『何がわからないのか』がわかっていて、言語化できている」が不十分で、「何がわからないかわからない人から質問を受けても、答える側も困ってしまいます」状態です。
len_souko

2018/08/31 16:06

SQL Server 2010とはいったい何なのでしょうか?MicrosoftのSQL Serverは2008の次は2008R2で更に次が2012です。異世界人もしくは他社が名前をパクった偽の製品でもお使いなのでしょうか?
yukihisa

2018/09/02 09:50 編集

Windows2010 とは一体。。。(元に戻った)?ちょっと質問、プログラミングの知識以前にコンピュータに関する知識が足りてないのでは。。。?今の状態で回答があっても完全に出来上がったコードをもらわない限り動かせないような気がします。もう少し自分で勉強、検索などである程度理解できてから質問をした方が良いかと思います。
rura

2018/09/06 02:07

訂正します。SQLserverは2017です
Zuishin

2018/09/06 02:11

直すならちゃんと読み直しておかしいところ全部直してください。回答がつかないのは埋もれているからではなく人と話ができない人の質問に答えるのは面倒だと思われているからだと思います。
Zuishin

2018/09/06 02:14

問題自体は非常に簡単なもので、まともにやり取りができて必要な情報を返してくれる人相手ならすぐに解決するようなものです。
yukihisa

2018/09/06 02:19 編集

objWorkSheet.get_Rangeでググったりしましたか?MSDNのページがトップヒットですが、これを見たら解決できるはず。検索することは大事です。せめてエラーが起こっている部分を検索するくらいはやらないと、「ただの丸投げ」と思われてしまいますよ。それから、皆様の指摘事項に関してガン無視部分が多いですが、分からない部分は「分からない」でもいいので反応しましょう。回答者も人間ですから、きちんと会話が成立しないなら誰も相手をしなくなります。
yukihisa

2018/09/06 02:20

指摘内容がほぼかぶった気がする・・・!
guest

回答1

0

ベストアンサー

もうすでに解決済みかもしれませんし、とんちんかんな回答かもしれませんが、回答させていただきます。

自分も手打ちをしてもGet_Rangeが出てこなく使えない状態で困ったことがあります。
で、正しい方法かはわかりませんが、下記の様に書き換えて利用しています。

objWorkSheet.get_Range(objWorkSheet.Cells[1, 1], objWorkSheet.Cells[dataGridView1.Rows.Count, dataGridView1.Columns.Count]).Value2 = v;


objWorkSheet.Range[(Excel.Range)objWorkSheet.Cells[1, 1], (Excel.Range)objWorkSheet.Cells[dataGridView1.Rows.Count, dataGridView1.Columns.Count]].Value2 = v;

ruraさんの解決の手掛かりになればいいのですが・・

投稿2018/10/21 02:35

chino1976

総合スコア19

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

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

rura

2018/11/01 05:00

すいません。納期でなかなかご連絡できずにいました。 あなた様のソースで試したところ、こちらで起きていたバグ修正案件が大幅に改善されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問