2016-07-17 6 views
1

私は5つのメソッド(それぞれボタンをクリックすることに基づいている)を持つWindows Formsアプリケーションを持っています。それぞれの方法で、同じエクセルファイルを同じ方法で開きたいと思います。しかし、それぞれの方法では、ワークシート上の別の範囲を選択する必要があります。私は5回書き直すのではなく、Excelファイルを開くための関数を作成しようとしました...Excel変数を返すC#

// method to open Excel and load a the workbook based on date selected. 
public Tuple<Microsoft.Office.Interop.Excel.Application, Workbook, Worksheet> openExcel() 
{ 
    Microsoft.Office.Interop.Excel.Application excelObj = new Microsoft.Office.Interop.Excel.Application();  
    string fileName = @"C:\Users\" + userName + @"\Documents\Visual Studio 2015\Projects\ProgramForMom\ProgramForMom\bin\Debug\Excel Files\" + frm2.year.Text + " Expenses"; 
    Workbook wb = excelObj.Workbooks.Open(fileName, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
    wb.Activate(); // Activates file. 
    Worksheet ws = wb.Worksheets[frm2.month.Text]; 
    ws.Activate(); 
    return Tuple.Create(excelObj, wb, ws); 
} 

すべてはうまくいきます。

私はのいずれかの方法でこの機能を参照してみました

...

var excelObj = openExcel(); 
Workbook wb = openExcel(); 
Worksheet ws = openExcel(); 
var cellValue = ws.Range["A1"].Value2; 

と私は言ってエラーを取得...

「暗黙的にタイプを変換できません 『System.Tuple』へ'Microsoft.Office.Interop.Excel.Workbook'。明示的な変換が存在します(キャストがありません)。

ワークシートに同じエラーが表示されます。同じ正確なことは、単にワークブックという言葉をワークブックの代わりに置き換えるということです。

私が間違ったことを説明してもらえますか?ありがとうございました。

答えて

1

あなたはそれがよりこの

のようになります( Tupleである)あなたのメソッドの戻り値の型と、あなたが openExcel

の出力をキャッチしたい変数のタイプの間のミスマッチを持っています

Tuple<Microsoft.Office.Interop.Excel.Application, Workbook, Worksheet> allThreeInOne = openExcell(); 

あなたが試すことができますし、離れて、すべてをいじる...か、また何ができるか

は、右の関数呼び出しの時点で値にアクセスすることです:

var excelObj = openExcel().Item1; 
Workbook wb = openExcel().Item2; 
Worksheet ws = openExcel().Item3; 

あなたは変数

に正確に一致するタイプを割り当てます。この方法

EDIT:あなたは不必要にあなたが希望の結果を得るために3回だけでファイルを開くであろうから ター後者の解決策はお勧めできませんJoel Coehoornが正しく指摘したように、最初の呼び出しから既に得ています。

離れタプルをいじることは行く方法のようになります。

var excelObj = allThreeInOne.Item1; 
Workbook wb = allThreeInOne.Item2; 
Worksheet ws = allThreeInOne.Item3; 
+0

パーフェクト!どうもありがとうございます。正確に私が必要なもの! – Michael

+0

ようこそ。タプルは短時間で1つの場所で情報を収集するための素晴らしいツールです –

+0

はい、間違いありません。誰かが3つの関数を作成したい、またはグローバル変数を使用して私の問題に似たものを実現したいというこの記事を見ました。あなたのソリューションは良い方法です!非常に簡単で、きちんとした時間を節約します。 – Michael

2
var result = openExcel(); 
var excelObj = result.Item1; 
Workbook wb = result.Item2; 
Worksheet ws = result.Item3; 
var cellValue = ws.Range["A1"].Value2; 
+0

これも機能します。したがって、このソリューションとMong Zhuが投稿したソリューションの両方が非常に便利です。人々に知らせるだけでした。 – Michael

+1

同じファイルを3回開くのをやめてみてください... –