
Excelワークシート関数で変数が使えるように 92
ストーリー by headless
変数 部門より
変数 部門より
taka2 曰く、
Microsoftが Excelの 新関数「LET()」を発表した(Officeサポートの記事)。
使い方は「 LET(変数名1, 値1, 変数名2, 値2, … , 変数を使った計算式) 」で、たとえば「LET(x, 1, y, 1, x+y)」は2になる。
「IF(ISBLANK(○○○○), "-", ○○○○)」など、同じ部分式が繰り返し登場するような式はExcelにはありがちだが、これを「LET(VAR, ○○○○, IF(ISBLANK(VAR),"-",VAR))」とすることで、記述が単純になり、部分式の計算回数削減による速度向上も見込める。
Excelが関数型プログラミング言語へ大きな一歩踏み出したって印象。あとは再帰ができれば完璧?
LET関数はベータ機能として現在Office Insiderの一部を対象にテストが行われている。今後数か月かけて最適化が行われ、完成後はOffice Insider全員およびOffice 365サブスクライバーへの提供が行われるとのこと(サポート記事英語版)。
LET可愛くないよLET (スコア:0)
やはりここはλでお願いしますた
Re:LET可愛くないよLET (スコア:1)
「ラムだっちゃ」
Re:LET可愛くないよLET (スコア:1)
Re: (スコア:0)
別の言語(C#)だとvarだったり、
スコープの範囲の違いでvarとletの両方が定義されていたり(Javascript)、
変数ではなく定数を定義するためのものだったり(swift)
言語間で一貫性が無いよなlet
Re:LET可愛くないよLET (スコア:2)
省略可能というかほぼ100%省略されるので存在を忘れられてるBASICのLETもあります…
うじゃうじゃ
Re: (スコア:0)
C#にもクエリ式内でlet句がある
どっちもC# 3.0で導入されたんだからどっちかに統一しても良かったのにね
スコープが狭い (スコア:0)
グローバル変数とかほしい、とか思ったけどスコープを管理する方法がないか。
Re:スコープが狭い (スコア:1)
そこまで行くともうそこらの空きセル使えと言う話になる
Re: (スコア:0)
名前の定義で代用できない?
Re: (スコア:0)
名前を使って、シートのコピーができなくなって、何でもかんでも1つのシートに詰め込まれた仕様書がお客さんからよくくる。
Re: (スコア:0)
名前の定義の良くないところというか、UIがダメなところって、
その定義の存在がこの機能を知らないユーザーにはよく分からないところと、
シートスコープでなくグローバルスコープがデフォルトになっているところだと思う。
こういった状態が分かり辛く制御し辛い系不備はWordの方が多いけど、
「名前の定義」は非常に有益なのに、目立たないために設定が無視されたり理解が浸透してなかったりなので、
UIを改善して欲しいなんてことをここで書いてもしょうがないんだが。
Re:スコープが狭い (スコア:1)
問題はエクセルに搭載された機能が多すぎること。
そしてユーザの学習意欲が低すぎること。
どうしようもない。
Re:スコープが狭い (スコア:1)
名前の定義がグローバル、かつ見えにくいおかげで、機能知らない人がシートコピーして使いまわすと大変なことになるんだよね。
古い名前の定義が残り続けて、そこに他社の会社名とか製品名を使用したフォルダやファイル名への参照が入っていたり。
それに気が付かないまま別の顧客に送ってしまったり。
Re: (スコア:0)
式が短く書けるというだけで、これならまだ今のEXCELの「名前」の機能使ったほうが便利な気がする。
Re:スコープが狭い (スコア:2, 参考になる)
計算が一回で済むというメリットを見落としている。
「名前」を複数書けば「名前」の参照処理が複数回行われ、そこには該当「名前」オブジェクトに係る処理が付随する。
このLETの名前は式を割り当てても式の結果を記憶するタイプだから一回の計算で済むわけで。
互換性のない新機能 (スコア:0)
こんなの使ってたら、他者とのデータ共有が崩壊するよね。
Re:互換性のない新機能 (スコア:4, すばらしい洞察)
新機能っていうんだから、これまでのものと互換性があるはずがない
Re: (スコア:0)
外部との互換性のあるデータ交換の為にExcelを選んでいるつもりの人達の立場は、どうすれば…
Re:互換性のない新機能 (スコア:1)
これまでも色んな新しい関数が追加されてるけど、LETだけなぜ噛みつくの?
Re:互換性のない新機能 (スコア:1)
外部とやりとりするバージョンを決めるとか、使ってよい関数を決めるとか。
Excelに限らず普通にやってることでは?
Re: (スコア:0)
私が使っている関数ですので勝手に使わないでください --- ある同僚
Re: (スコア:0)
こんなの使ってたら、他者とのデータ共有が崩壊するよね。
それ故にLetがあるのですよ
Let it be...
Re: (スコア:0)
ポリコレ案件
空きセルつかうのとどう違うの? (スコア:0)
こういったのは、非表示設定にした適当な空きセルを使うもんだとおもってたが
Re:空きセルつかうのとどう違うの? (スコア:1)
空きセルを使わなくても良くなります。便利だと思いませんか?
ちなみに let() ってのは関数型言語では定番の関数です。
Lisp とか let だらけになります。それくらい便利です。
letが定義できるのは、いわゆるローカル変数(局所変数)です。
空きセルは有る意味グローバル変数(大域変数)になります。
プログラムを書いたことが有る人なら
グローバル変数を使うよりもローカル変数を使ったほうがトラブルが少ないことは良く知っていると思います。
つまり空きセルを使うよりもletを使ったほうがトラブルが少なくなります。
これは大きな違い、アドバンテージになります
Re: (スコア:0)
VBAとかじゃあかんの?
Re:空きセルつかうのとどう違うの? (スコア:1)
マクロ付き形式だと色々面倒。
開いてもらえないかもしれないし。
# Web版で機能するか否かも大きな違いになると思う。
Re: (スコア:0)
ワークシート関数で済ませられるならその方が良い。何でもかんでもVBAでやろうとするのは無能。
Re:空きセルつかうのとどう違うの? (スコア:1)
ワークシート関数で深いネストとかされると、後から大変(私はExcelベースの込み入ったのは怖くて手が出せない)。
VBAで関数を作成して、関数の意図や処理内容のコメントを付けておいたほうが、後世の人のためになると思う。
Re:空きセルつかうのとどう違うの? (スコア:2, おもしろおかしい)
自分で書く時は改行とインデント入れて
=
IFERROR(
IF(A1"",
VLOOKUP(A1,D:F,3,FALSE),
VLOOKUP(B1,G:I,3,FALSE)
),
""
)
みたいにしていて、うっかりそのまま他人に渡すと「式も=しか入って無いセルに計算結果表示されてます」と指摘される罠・・・
Re:空きセルつかうのとどう違うの? (スコア:1)
ワークシート関数って、VBAとか使わない限り、一括表示できないよね。
複雑なのだと、どこに何があるか探すのが面倒。
Re:空きセルつかうのとどう違うの? (スコア:1)
セキュリティポリシーによりマクロは無効。有効にはできません。
Re:空きセルつかうのとどう違うの? (スコア:1)
さすがにある程度複雑になってくるとVBAにしないと大変になるけど、例として挙げられてるISBLANKがらみのように
「VBA使うほどではない単純な式だけど(今までの)Excel数式だと長ったらしくわかりにくくなる式」はあるので
"ちゃんと使い分けることができれば"メリットはけっこう大きいと思う。
うじゃうじゃ
Re: (スコア:0)
データ数が多いと、マルチスレッドで動かせないVBAは足かせにならない?
# そんなもんExcelに食わせるなというツッコミは無しでお願いします。
Re:空きセルつかうのとどう違うの? (スコア:1)
>非表示設定にした
>適当な空きセル
今後のオートメーションその他にその従来型発想が「デメリットで害」とかでは?
曰く「属人的バッドノウハウ」云々。根拠の薄い憶測ですけど。
Re: (スコア:0)
そのセル内容の保持が省けるんだと思われ。メモリが足りないかデータ大杉の時に嬉しい可能性アリ?
Re: (スコア:0)
数式の入ったセルが1つしかないなら、その判断でも大して変わらないが、
数万行ある表の中の数式を書く場合などで、ありがたみが判ると思う。
数式を使うセルの数だけ適当な空きセルが必要になるが、表の途中に行・列の追加した瞬間、その空きセルも同期をとって増やさないと崩壊する。
letがあると回避できる。
でも、新機能って、職場のオフィス環境のExcelバージョンが上がらないかぎり、他人と共有するシートで使えないから、
この機能を職場で使えるのは遠い未来だなぁ。
Re: (スコア:0)
セルへの書き込みは遅いので、計算が重くなる原因にもなっている
LETで変数宣言ってBASICか? (スコア:0)
ループのためにIとかJを使うんですね。
Re:LETで変数宣言ってBASICか? (スコア:1)
MSらしくBASIC由来なんでしょうけど、LETって変数への代入全般じゃなかったっけ。
多くのBASICでは省略できたけど、稀に記載必須の仕様があったような
これでバッドノウハウ解消 (スコア:0)
=ISTEXT("交通費")*24800+ISTEXT("宿泊費")*8800
としてたのを
=LET(交通費,24800,宿泊費,8800,交通費+宿泊費)
と書けるようになるわけですね。これは分かりやすい。
Re: (スコア:0)
おかしくない変数名を、その運用の幅の中から名付けていくコストを気にするなんて、バッドノウハウそのものだからな。
もちろん運用が変わったら、変数名にもそれを反映させないといけない。
スコープは? (スコア:0)
セル内?
シート単位とかブック単位とかグローバルとか欲しいよね
Re: (スコア:0)
どころか関数呼び出し内。
「let(…,」から「)」まで。無理にスコープと呼ぶなら、ぐらいの感じだけど。
この関数をスコープを意識しなきゃらならないような使い方しようと思うと、かなり悲惨なコードになるんじゃないかな。
ちょっと待て (スコア:0)
LETはなんで私普通の関数ですみたいな顔してるんだ?
構文は関数だが引数のセマンティクスが通常関数とは違うだろ。
例えば
LET(x:=A, y:=B, x+y)
みたいな構文にするべきじゃないのか?
Re:ちょっと待て (スコア:2)
わざわざ特殊な記法にしても、誰も得しない。
見慣れないものが増えたら、事故が増えるだけやろ。
# あくまでExcelの「関数」なんやし。w
Re: (スコア:0)
LETのスコープ内処理だから問題ないだろ。
セルアドレスを書けばRangeオブジェクトで、式を書けば式に応じたオブジェクトになる自由さから言えば、ローカル名前型というオブジェクトが追加になったと思えば良い。
Re: (スコア:0)
新しい演算子を追加すると、構文解析もちょいと改造しなきゃならず
互換を目指すGSuiteのGoogleやLibreOffice陣営から激しい抵抗にあって
「せっかくOpenDocumentの時代なのに、また悪の帝国Micro$oftが勝手な真似を!」ってなりそう。
それを避けたんではなかろうか。
Re: (スコア:0)
釣りに誰も引っかからないね。
Re: (スコア:0)
ストレスたまってるんやな。