LET関数は、計算結果に名前を付けるために使用されます。 変数名を使用して、LET関数の中間計算、値、または括弧「()」内の名前を定義することもできます。LET 関数を使用するには、関数に関連付けられた名前と関連する値のペア、そのすべてを使用する計算を定義します。
この関数を使用すると、特定の範囲やセル参照で何を参照したか、何を計算していたか、同じ式をコピー/貼り付けしたかなどを覚えておく必要はもうありません。
LET関数は、変数で定義された中間値の冗長な再計算を消去することで、計算のパフォーマンスを向上します。
次のサンプルコードは、LET関数を使用することで動的配列値を計算します。その後、その配列を数式で繰り返し参照して、パフォーマンスがどのように向上する方法を示します。
この場合、両方のスプレッドシートコントロールでは、500個の名前とその住所の同じリストが初期化され、両方ともセルN2で同じ数式を使用して、動的配列の一意の州の並べ替えられたリストを返します。
=SORT(UNIQUE(Table1[state]))
左側のスプレッドシートは、LET関数を使用して計算を最適化し、動的配列の結果をIF関数内で再利用します。
=LET(cities,ROWS(UNIQUE(FILTER(Table1[city],Table1[state]=$N2,""))),IF(cities<10,"Less than 10.",IF(cities<20,"Between 10 and 19.",IF(cities<30,"Between 20 and 29","30 or more."))))
右側のスプレッドシートはLET関数を使用せず、IF関数内の都市の式を繰り返します。
=IF(ROWS(UNIQUE(FILTER(Table1[city],Table1[state]=$N2,"")))<10,"Less than 10.",IF(ROWS(UNIQUE(FILTER(Table1[city],Table1[state]=$N2,"")))<20,"Between 10 and 19.",IF(ROWS(UNIQUE(FILTER(Table1[city],Table1[state]=$N2,"")))<30,"Between 20 and 29","30 or more.")))
スプレッドシートを再計算するように[再計算]メニュー項目をアクティブにすると、CalculationEngineでCalculationOnDemandを無効にするために特別なコードが使用されます。これにより、すべてのセルを強制的に再計算し、計算の結果は各スプレッドシートコントロールの上部にあるTitleInfoに表示されます。
LET関数を使用した左側のスプレッドシートの計算処理は、LET関数を使用しない右側のスプレッドシートよりも2?4倍高速です。
LET(name1, value1, [name2…], [value2…], calculation)
有効な引数は次のとおりです。
引数 | 説明 |
---|---|
name1 | 最初に割り当てる名前。 文字で始まる必要があります。 |
value1 | name1 に割り当てられている値または計算。 |
name2 |
(オプション)2 番目の name_value に割り当てる 2 番目の名前。name2が指定されている場合、value2 と 計算が必須です。 |
value2 | (オプション)name2に割り当てられる値または計算。 |
calculation | 最終的な計算では、LET関数内のすべての名前が使用されます。この関数の最後の引数である必要があります。 |
最後の引数は、結果を返す計算である必要があります。
バリアント型を返します。
次のサンプルコードは、2つのLET関数の基本例を示します。
JavaScript |
コードのコピー
|
---|---|
// 動的配列-LET関数は動的配列機能を要求するため、数式を設定する前にCalcEngineから有効にする必要があります。 fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures |= CalcFeatures.DynamicArray; // 値を設定します。 for (int i = 0; i < 5; i++) { fpSpread1.AsWorkbook().Worksheets[0].Cells[i, 2, 4, 2].Value = new Random(2).Next(20, 50); fpSpread1.AsWorkbook().Worksheets[0].Cells[i, 3, 4, 3].Value = new Random(3).Next(10, 40); } // 列ヘッダセルのテキストを設定します。 fpSpread1.AsWorkbook().ActiveSheet.ColumnHeader.Cells[0, 1].Text = "LET function in cell B1"; fpSpread1.AsWorkbook().ActiveSheet.ColumnHeader.Cells[0, 4].Text = "LET function in cell E1"; // セル範囲「A1:A5」に値を設定します。 fpSpread1.AsWorkbook().Worksheets[0].Cells["A1:A5"].Value = 14; // 動的配列として機能するセルB1に数式を設定します。 fpSpread1.AsWorkbook().Worksheets[0].Cells["B1"].Formula2 = "LET(range, A1:A5, range+1)"; // 2つの変数を持つLET関数は「range」と「const」です。「range」は「D1:D5」を指し、「const」は「C1:C5」を指します。 fpSpread1.AsWorkbook().Worksheets[0].Cells["E1"].Formula2 = "LET(range, D1:D5, const, C1:C5, range + const)"; // 列幅を設定します。 fpSpread1.AsWorkbook().ActiveSheet.Columns[1].ColumnWidth = 180; fpSpread1.AsWorkbook().ActiveSheet.Columns[4].ColumnWidth = 180; |
以下に、上記のコードの出力を示します。セルB1には、実際に評価された数式を表す最後の引数として「range + 1」を使用して、数式「"= LET (range, A1: A5, range + 1)」が含まれています。 この数式は結果として15を返します。
同様に、セルE1には、「range」と「const」を変数として使用する数式「= LET (range, D1: D5, const, C1: C5, range + const)」が含まれています。 この場合は、「range」はD1:D5を表し、「const」はC1:C5を表します。この式は結果として61を返します。
次のサンプルコードでは、未処理の販売データを使用しています。このデータは、1人のデータを表示し、空白のセルにダッシュを追加するためにフィルタリングする必要があります。 これを実現するには、、以下に示すように、LET関数を使用してFILTER関数を1回計算することができます。
JavaScript |
コードのコピー
|
---|---|
// 動的配列-LET関数は動的配列機能を要求するため、数式を設定する前にCalcEngineから有効にする必要があります。 fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures |= CalcFeatures.DynamicArray; // ワークシートを取得します。 IWorksheet worksheet = fpSpread1.AsWorkbook().Worksheets[0]; // テキストを設定します worksheet.Cells[0, 0].Text = "LET simplify the complex formula"; // セルを結合します worksheet.Cells[0, 0, 0, 3].Merge(true); worksheet.Cells[0, 0].MergePolicy = MergePolicy.Always; // 列幅を設定します fpSpread1.AsWorkbook().ActiveSheet.Columns[2].ColumnWidth = 80; fpSpread1.AsWorkbook().ActiveSheet.Columns[7].ColumnWidth = 100; // データをフィルタ処理して1人のデータを表示します // 数式を作成します string formula = "LET(filterCriteria,H7,filteredRange,FILTER(B7:E14,B7:B14=filterCriteria),IF(ISBLANK(filteredRange),\" - \",filteredRange))"; // セルにデータを設定します worksheet.Cells[3, 1].Text = "Filter the data to show one person"; // セルに数式を設定します worksheet.Cells[4, 1].Text = formula; // セルを結合します worksheet.Cells[3, 1, 3, 4].Merge(true); worksheet.Cells[3, 1].MergePolicy = MergePolicy.Always; worksheet.Cells[4, 1, 4, 12].Merge(true); worksheet.Cells[4, 1].MergePolicy = MergePolicy.Always; // セルにデータを追加します worksheet.Cells[5, 1].Text = "Rep"; worksheet.Cells[5, 2].Text = "Region"; worksheet.Cells[5, 3].Text = "Product"; worksheet.Cells[5, 4].Text = "Profit"; worksheet.Cells[6, 1].Text = "Amy"; worksheet.Cells[6, 2].Text = "East"; worksheet.Cells[6, 3].Text = "Apple"; worksheet.Cells[6, 4].Value = 1.33; worksheet.Cells[7, 1].Text = "Fred"; worksheet.Cells[7, 2].Text = "South"; worksheet.Cells[7, 3].Text = "Banana"; worksheet.Cells[7, 4].Value = 0.09; worksheet.Cells[8, 1].Text = "Amy"; worksheet.Cells[8, 2].Text = "West"; worksheet.Cells[8, 3].Text = "Mango"; worksheet.Cells[8, 4].Value = 1.85; worksheet.Cells[9, 1].Text = "Fred"; worksheet.Cells[9, 2].Text = "West"; worksheet.Cells[9, 3].Text = ""; worksheet.Cells[9, 4].Value = 0.82; worksheet.Cells[10, 1].Text = "Fred"; worksheet.Cells[10, 2].Text = "West"; worksheet.Cells[10, 3].Text = "Banana"; worksheet.Cells[10, 4].Value = 1.25; worksheet.Cells[11, 1].Text = "Amy"; worksheet.Cells[11, 2].Text = "East"; worksheet.Cells[11, 3].Text = "Apple"; worksheet.Cells[11, 4].Value = 0.72; worksheet.Cells[12, 1].Text = "Rep"; worksheet.Cells[12, 2].Text = "Region"; worksheet.Cells[12, 3].Text = "Product"; worksheet.Cells[12, 4].Value = 0.72; worksheet.Cells[13, 1].Text = "Fred"; worksheet.Cells[13, 2].Text = "North"; worksheet.Cells[13, 3].Text = "Mango"; worksheet.Cells[13, 4].Value = 0.54; worksheet.Cells[6, 6].Text = "Rep"; worksheet.Cells[7, 6].Text = "Result"; worksheet.Cells[6, 7].Text = "Fred"; // セルのスタイルに関するプロパティを設定します fpSpread1.ActiveSheet.Cells[7, 6].BackColor = System.Drawing.Color.LightGreen; fpSpread1.ActiveSheet.Cells[7, 6].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fpSpread1.ActiveSheet.Cells[5, 1, 5, 4].BackColor = System.Drawing.Color.LightBlue; fpSpread1.ActiveSheet.Cells[5, 1, 5, 4].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; // セルに動的配列数式を追加します worksheet.Cells[7, 7].Formula2 = formula; // 4月1日から4月15日までのすべての平日の日付を生成します // 数式を作成します string formula1 = "LET(dates,SEQUENCE(C19-C18+1,1,C18,1),FILTER(dates,WEEKDAY(dates,2)<6))"; // フォーマッタを作成します string formatter = "[$-en-US]dd-mmm-yy;@"; // セルにテキストを追加します worksheet.Cells[15, 1].Text = "Generate all weekday dates between April 1, 2020 and April 15, 2020"; // セルのスタイルに関するプロパティを設定します worksheet.Cells[15, 1, 15, 7].Merge(true); worksheet.Cells[15, 1].MergePolicy = MergePolicy.Always; // セルに数式を追加します worksheet.Cells[16, 1].Text = formula1; // セルのスタイルに関するプロパティを設定します worksheet.Cells[16, 1, 16, 8].Merge(true); worksheet.Cells[16, 1].MergePolicy = MergePolicy.Always; // セルにテキストを追加します worksheet.Cells[17, 1].Text = "Start"; worksheet.Cells[18, 1].Text = "End"; worksheet.Cells[17, 2].Text = new DateTime(2020, 4, 1).ToString(); worksheet.Cells[18, 2].Text = new DateTime(2020, 4, 15).ToString(); // セルのスタイルに関するプロパティを設定します fpSpread1.ActiveSheet.Cells[17, 1, 18, 1].BackColor = System.Drawing.Color.LightBlue; fpSpread1.ActiveSheet.Cells[17, 1, 18, 1].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; // セルのフォーマッタを設定します worksheet.Cells[17, 2].NumberFormat = formatter; worksheet.Cells[18, 2].NumberFormat = formatter; // セルにテキストを追加します worksheet.Cells[17, 6].Text = "Result"; // セルのスタイルに関するプロパティを設定します fpSpread1.ActiveSheet.Cells[17, 6].BackColor = System.Drawing.Color.LightGreen; fpSpread1.ActiveSheet.Cells[17, 6].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; // Add dynamic array formula to cell worksheet.Cells[17, 7].Formula2 = formula1; // フォーマッタを設定します for (var i = 0; i < 11; i++) { worksheet.Cells[i + 17, 7].NumberFormat = formatter; } |
上記コードの実装結果は、以下のようになります。
製品バージョン 15.0 以降で使用できます。