none
https://support.microsoft.com/ja-jp/kb/302096 で 質問です。 RRS feed

  • 質問

  • この例題のコードを実行すると問題なく機能します。

    そこで、デスクトップにEXCELをあらかじめ作成し、ここでbutton2を押して実行させてみるとエラーになります。

    「既存のEXCELの表をc#の配列に読み込みたい」のですが、この例題をベースとした場合に どのような方法が有るか

    教えていただきたいと考えます。よろしくお願いします。

    C#のスキルは”初心者”です。

    skysoarjp

    2016年2月28日 8:30

回答

  • こんな

    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!)

    2016年2月28日 9:45

すべての返信

  • こんな

    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!)

    2016年2月28日 9:45
  • ご検討ありがとうございます。

    OpenFilleDialogコマンドで目的のExcel Fileを選択する方法を提案していただきました。

    現実的な方法として参考になりました、今後の具体的な記述例として応用させていただきます。

    また、その他 多くのコメント行で説明していただき大変参考になりました。感謝いたします。

    skysoarjp

    

    2016年2月29日 14:38