トップ回答者
https://support.microsoft.com/ja-jp/kb/302096 で 質問です。

質問
回答
-
こんな
using System; using System.Windows.Forms; using System.Reflection; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Excel.Application objApp; Excel._Workbook objBook; private void button1_Click(object sender, System.EventArgs e) { try { Excel.Workbooks objBooks; objApp = new Excel.Application(); objApp.Visible = true;//表示しておく(後にするとエラーが発生したときに不可視になってて面倒なので) objBooks = objApp.Workbooks; //ワークブックのファイルパスを指定して開く場合 //objBook = objBooks.Open(@"C:\Users\UserName\Documents\Book1.xlsx"); //半角@マークをつけると指定しやすい //ファイル選択ダイアログで開きたい場合 OpenFileDialog dlg = new Op enFileDialog(); dlg.Filter = "EXCEL|*.xlsx;*.xlsm;*.xltx;*.xls,;xlt|*.*|*.*";//ファイルの種類を指定する dlg.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//デスクトップを初期表示 if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //ファイルが選択されたら objBook = objBooks.Open(dlg.FileName);//そのファイル名で開く } //開いても既存のワークブックは書き換える必要が無いから何もしない } catch (Exception theException) { String errorMessage; errorMessage = "Error: "; errorMessage = String.Concat(errorMessage, theException.Message); errorMessage = String.Concat(errorMessage, " Line: "); errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error"); } } private void button2_Click(object sender, System.EventArgs e) { Excel.Sheets objSheets; Excel._Worksheet objSheet; Excel.Range range; if (objBook == null) { MessageBox.Show("ワークブックが開かれていないよ"); return; } try { try { //シート名を指定して開く objSheets = objBook.Worksheets; objSheet = (Excel._Worksheet)objSheets.get_Item("Sheet1"); } catch (Exception theException) { String errorMessage = theException.Message; MessageBox.Show(errorMessage, "ワークシートが開けないよ"); return; } //配列にしたい範囲を指定する range = objSheet.get_Range("A1", "E5"); Object[,] saRet; //ここで範囲の値を一括で2次元配列に取り込んでいる saRet = (System.Object[,])range.get_Value(Missing.Value); //ここからは確認のために表示をさせているだけなので必要ではない long iRows; long iCols; iRows = saRet.GetUpperBound(0);//配列の行数 iCols = saRet.GetUpperBound(1);//配列の列数 String valueString; valueString = "Array Data\n"; for (long rowCounter = 1; rowCounter <= iRows; rowCounter++) {//配列の行数を繰り返す for (long colCounter = 1; colCounter <= iCols; colCounter++) {//配列の行数を繰り返す object value = saRet[rowCounter, colCounter]; if (value == null) { //セルに何か値が入っていたよ valueString = String.Concat(valueString, value.ToString() + ", "); } else { //セルに何も値が入っていなかったよ //空っぽnullのため、ToString()はエラーになるので分岐 valueString = String.Concat(valueString, ", "); } } valueString = String.Concat(valueString, "\n"); } MessageBox.Show(valueString, "Array Values"); } catch (Exception theException) { String errorMessage; errorMessage = "Error: "; errorMessage = String.Concat(errorMessage, theException.Message); errorMessage = String.Concat(errorMessage, " Line: "); errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error"); } } } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 Tak1waMVP, Moderator 2016年2月29日 2:39
- 回答としてマーク 星 睦美 2016年4月13日 8:12
すべての返信
-
こんな
using System; using System.Windows.Forms; using System.Reflection; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Excel.Application objApp; Excel._Workbook objBook; private void button1_Click(object sender, System.EventArgs e) { try { Excel.Workbooks objBooks; objApp = new Excel.Application(); objApp.Visible = true;//表示しておく(後にするとエラーが発生したときに不可視になってて面倒なので) objBooks = objApp.Workbooks; //ワークブックのファイルパスを指定して開く場合 //objBook = objBooks.Open(@"C:\Users\UserName\Documents\Book1.xlsx"); //半角@マークをつけると指定しやすい //ファイル選択ダイアログで開きたい場合 OpenFileDialog dlg = new Op enFileDialog(); dlg.Filter = "EXCEL|*.xlsx;*.xlsm;*.xltx;*.xls,;xlt|*.*|*.*";//ファイルの種類を指定する dlg.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//デスクトップを初期表示 if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //ファイルが選択されたら objBook = objBooks.Open(dlg.FileName);//そのファイル名で開く } //開いても既存のワークブックは書き換える必要が無いから何もしない } catch (Exception theException) { String errorMessage; errorMessage = "Error: "; errorMessage = String.Concat(errorMessage, theException.Message); errorMessage = String.Concat(errorMessage, " Line: "); errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error"); } } private void button2_Click(object sender, System.EventArgs e) { Excel.Sheets objSheets; Excel._Worksheet objSheet; Excel.Range range; if (objBook == null) { MessageBox.Show("ワークブックが開かれていないよ"); return; } try { try { //シート名を指定して開く objSheets = objBook.Worksheets; objSheet = (Excel._Worksheet)objSheets.get_Item("Sheet1"); } catch (Exception theException) { String errorMessage = theException.Message; MessageBox.Show(errorMessage, "ワークシートが開けないよ"); return; } //配列にしたい範囲を指定する range = objSheet.get_Range("A1", "E5"); Object[,] saRet; //ここで範囲の値を一括で2次元配列に取り込んでいる saRet = (System.Object[,])range.get_Value(Missing.Value); //ここからは確認のために表示をさせているだけなので必要ではない long iRows; long iCols; iRows = saRet.GetUpperBound(0);//配列の行数 iCols = saRet.GetUpperBound(1);//配列の列数 String valueString; valueString = "Array Data\n"; for (long rowCounter = 1; rowCounter <= iRows; rowCounter++) {//配列の行数を繰り返す for (long colCounter = 1; colCounter <= iCols; colCounter++) {//配列の行数を繰り返す object value = saRet[rowCounter, colCounter]; if (value == null) { //セルに何か値が入っていたよ valueString = String.Concat(valueString, value.ToString() + ", "); } else { //セルに何も値が入っていなかったよ //空っぽnullのため、ToString()はエラーになるので分岐 valueString = String.Concat(valueString, ", "); } } valueString = String.Concat(valueString, "\n"); } MessageBox.Show(valueString, "Array Values"); } catch (Exception theException) { String errorMessage; errorMessage = "Error: "; errorMessage = String.Concat(errorMessage, theException.Message); errorMessage = String.Concat(errorMessage, " Line: "); errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error"); } } } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 Tak1waMVP, Moderator 2016年2月29日 2:39
- 回答としてマーク 星 睦美 2016年4月13日 8:12