2016-03-24 2 views
0

私はExcelアドインを作成しており、いくつかの要約統計量を計算するために必要な関数の1つについて書いています。これらは、名前全体としてWorkbookまたはWorksheetのいずれかに追加する必要があります。今私はそれぞれのことをする2つの方法があります。しかし、両方の方法は、第1のものがワークブックに名前を付け、第2のものがワークシートに追加されるという違いとほぼ同じように見えます。Excel.WorkbookとExcel.Worksheetの汎用メソッド

渡された引数に基づいて、提供されたワークシートがnullであるかどうかを確認できるように、このメソッドをより汎用的にする方法はありますか?そうすればブック全体に追加できますか?

/// <summary> 
    /// Generate dynamic summary statistics as <see cref="Name"/>s in the specified <see cref="Workbook"/>. 
    /// </summary> 
    /// <param name="range">The <see cref="Range"/> of the data that needs summary statistics.</param> 
    /// <param name="doCalculate">Defines which variables in the summary have to be calculated.</param> 
    public DynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate) 
    { 
     var book = Globals.ThisAddIn.Application.ActiveWorkbook; 
     var name = ((Name)range.Name).Name; 
     if (doCalculate.Mean) Mean = book.Names.Add(name + "_MEAN", "=AVERAGE(" + name + ")"); 
     if (doCalculate.Variance) Variance = book.Names.Add(name + "_VAR", "=VAR.S(" + name + ")"); 
     if (doCalculate.StdDev) StdDev = book.Names.Add(name + "_STDEV", "=STDEV.S(" + name + ")"); 
     if (doCalculate.Minimum) Minimum = book.Names.Add(name + "_MINIMUM", "=MIN(" + name + ")"); 
     if (doCalculate.Quartile1) Quartile1 = book.Names.Add(name + "_QUARTILE1", "=QUARTILE.INC(" + name + ",1)"); 
     if (doCalculate.Median) Median = book.Names.Add(name + "_MEDIAN", "=MEDIAN(" + name + ")"); 
     if (doCalculate.Quartile3) Quartile3 = book.Names.Add(name + "_QUARTILE3", "=QUARTILE.INC(" + name + ",3)"); 
     if (doCalculate.Maximum) Maximum = book.Names.Add(name + "_MAXIMUM", "=MAX(" + name + ")"); 
     if (doCalculate.InterquartileRange) InterquartileRange = book.Names.Add(name + "_IQR", "=" + Quartile3.Name + "-" + Quartile1.Name); 
     if (doCalculate.Skewness) Skewness = book.Names.Add(name + "_SKEW", "=SKEW(" + name + ")"); 
     if (doCalculate.Kurtosis) Kurtosis = book.Names.Add(name + "_KURT", "=KURT(" + name + ")"); 
     if (doCalculate.MeanAbsDev) MeanAbsDev = book.Names.Add(name + "_AVEDEV", "=AVEDEV(" + name + ")"); 
     if (doCalculate.Mode) 
     { 
      Mode = book.Names.Add(name + "_MODE", "=MODE.SNGL(" + name + ")"); 
      try 
      { 
       Globals.ThisAddIn.Application.WorksheetFunction.Mode_Sngl(range); 
       HasMode = true; 
      } 
      catch 
      { 
       HasMode = false; 
      } 
     } 
     if (doCalculate.Range) Range = book.Names.Add(name + "_RANGE", "=" + Maximum.Name + "-" + Minimum.Name); 
     if (doCalculate.Count) Count = book.Names.Add(name + "_COUNT", "=COUNT(" + name + ")"); 
     if (doCalculate.Sum) Sum = book.Names.Add(name + "_SUM", "=SUM(" + name + ")"); 
    } 

    /// <summary> 
    /// Generate dynamic summary statistics as <see cref="Name"/>s in the specified <see cref="Worksheet"/>. 
    /// </summary> 
    /// <param name="sheet">The <see cref="Worksheet"/> on which the <see cref="Name"/>s should be generated.</param> 
    /// <param name="range">The <see cref="Range"/> of the data that needs summary statistics.</param> 
    /// <param name="doCalculate">Defines which variables in the summary have to be calculated.</param> 
    public DynamicSummaryStatistics(Worksheet sheet, Range range, SummaryStatisticsBool doCalculate) 
    { 
     var name = ((Name)range.Name).Name; 
     if (doCalculate.Mean) Mean = sheet.Names.Add(name + "_MEAN", "=AVERAGE(" + name + ")"); 
     if (doCalculate.Variance) Variance = sheet.Names.Add(name + "_VAR", "=VAR.S(" + name + ")"); 
     if (doCalculate.StdDev) StdDev = sheet.Names.Add(name + "_STDEV", "=STDEV.S(" + name + ")"); 
     if (doCalculate.Minimum) Minimum = sheet.Names.Add(name + "_MINIMUM", "=MIN(" + name + ")"); 
     if (doCalculate.Quartile1) Quartile1 = sheet.Names.Add(name + "_QUARTILE1", "=QUARTILE.INC(" + name + ",1)"); 
     if (doCalculate.Median) Median = sheet.Names.Add(name + "_MEDIAN", "=MEDIAN(" + name + ")"); 
     if (doCalculate.Quartile3) Quartile3 = sheet.Names.Add(name + "_QUARTILE3", "=QUARTILE.INC(" + name + ",3)"); 
     if (doCalculate.Maximum) Maximum = sheet.Names.Add(name + "_MAXIMUM", "=MAX(" + name + ")"); 
     if (doCalculate.InterquartileRange) InterquartileRange = sheet.Names.Add(name + "_IQR", "=" + Quartile3.Name + "-" + Quartile1.Name); 
     if (doCalculate.Skewness) Skewness = sheet.Names.Add(name + "_SKEW", "=SKEW(" + name + ")"); 
     if (doCalculate.Kurtosis) Kurtosis = sheet.Names.Add(name + "_KURT", "=KURT(" + name + ")"); 
     if (doCalculate.MeanAbsDev) MeanAbsDev = sheet.Names.Add(name + "_AVEDEV", "=AVEDEV(" + name + ")"); 
     if (doCalculate.Mode) 
     { 
      Mode = sheet.Names.Add(name + "_MODE", "=MODE.SNGL(" + name + ")"); 
      try 
      { 
       Globals.ThisAddIn.Application.WorksheetFunction.Mode_Sngl(range); 
       HasMode = true; 
      } 
      catch 
      { 
       HasMode = false; 
      } 
     } 
     if (doCalculate.Range) Range = sheet.Names.Add(name + "_RANGE", "=" + Maximum.Name + "-" + Minimum.Name); 
     if (doCalculate.Count) Count = sheet.Names.Add(name + "_COUNT", "=COUNT(" + name + ")"); 
     if (doCalculate.Sum) Sum = sheet.Names.Add(name + "_SUM", "=SUM(" + name + ")"); 
    } 
+0

あなたは 'Func <文字列、範囲>'をとり、ブックには 'books.Names.Add(書式)'と '(書式)=>シートを指定できます。ワークシートメソッドのNames.Add(フォーマット) 'したがって、ワークブックまたはワークシートにアクセスする方法を提供しようとする代わりに、必要なオブジェクトを呼び出す方法を取るメソッドを一般的に提供します。 –

+0

ご返信ありがとうございます。私はどこから始めるべきかを知るために擬似コードで少しの例を提供することは可能ですか?私は前にあなたが言ったことで働いたことはありません。 – Krowi

答えて

2

代わりのWorkbookWorksheetジェネリックへのアクセスをしようと私はFunc<string, string, Name>を提供することのいずれかを呼び出すためにWorkbookまたはWorksheetがより良い方法だろうアクセスが許可されていることを言うと思います。

public DynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate) 
{ 
    var functionToRun = (arg1, arg2) => Globals.ThisAddIn.Application.ActiveWorkbook.Names.Add(arg1, arg2); 

    this.ComputeDynamicSummaryStatistics(range, doCalculate, functionToRun); 
} 

public DynamicSummaryStatistics(Worksheet sheet, Range range, SummaryStatisticsBool doCalculate) 
{ 
    var functionToRun = (arg1, arg2) => sheet.Names.Add(arg1, arg2); 

    this.ComputeDynamicSummaryStatistics(range, doCalcualte, functionToRun); 
} 

private void ComputeDynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate, Func<string, string, Name> functionToRun) 
{ 
    var name = ((Name)range.Name).Name; 
    if(doCalculate.Mean) Mean = functionToRun(name + "_MEAN", "=AVERAGE(" + name + ")"); 
    if(doCalculate.Variance) Variance = functionToRun(name + "_VAR", "=VAR.S(" + name + ")"); 
    // etc. etc. 
} 

は、これは機能 ComputeDynamicSummaryStatistics私はどちらか呼び出されたコンストラクタに基づいて sheet.Names.Add(...)または Globals.ThisAddIn.Application.ActiveWorkbook.Names.Add(...)を呼び出しています functionToRunを呼び出して、すべての時間で言っています。

WorkbookまたはWorksheetのいずれかへのアクセスは、このメソッドには全く知られておらず、現在はすべて追加する名前を提供しています。

+0

これは魅力的なように機能しています。 2つの 'string'引数と戻り値を処理するには、関数初期化子を' Func funcAdd =(name、referencedTo)=> sheet.Names.Add(name、referencedTo); 'に変更するだけでした。 '名前'をタイプしてください。大いに感謝する。 – Krowi

+0

ああ、申し訳ありませんが、2つの文字列の引数を渡すことを完全に忘れました。 –

+0

ここには 'Name'という3番目の引数' TResult'が必要です。 – Krowi

関連する問題