私は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 + ")");
}
あなたは 'Func <文字列、範囲>'をとり、ブックには 'books.Names.Add(書式)'と '(書式)=>シートを指定できます。ワークシートメソッドのNames.Add(フォーマット) 'したがって、ワークブックまたはワークシートにアクセスする方法を提供しようとする代わりに、必要なオブジェクトを呼び出す方法を取るメソッドを一般的に提供します。 –
ご返信ありがとうございます。私はどこから始めるべきかを知るために擬似コードで少しの例を提供することは可能ですか?私は前にあなたが言ったことで働いたことはありません。 – Krowi