VBA技術解説
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2025-12-23 最終更新日:2025-12-23

IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について


IFS関数はExcel2019で新たに追加された関数です。

IFS関数(複数条件)
IFS関数は、1つ以上の条件が満たされているかどうかをチェックして、最初のTRUE条件に対応する値を返します。複数のネストしたIFステートメントを置き換えることができるため、複数の条件指定ではより簡単に記述できます。IFS関数の書式 =IFS(論理式1,真の場合1,[論理式2,真の場合2]…) 論理式1 必須です。

VBAでセルの .Formula (スピル非対応)プロパティに数式を入れるとき、
その数式が「スピル数式」(複数セルに結果が出力される数式)であれば、関数の先頭または引数のセル範囲の先頭に「@」が自動的に追加されます。


ところがIFS関数は、スピルするかどうかにかかわらず、常に関数の先頭または引数のセル範囲の先頭に「@」が自動的に追加されます。
この件について、もう少し詳しく見てみましょう。

スピルの基本については、以下を参照してください。

スピルについて
・スピルとは ・スピルの数式例 ・ゴースト ・スピル範囲での独特な挙動について ・スピルのエラー表示 ・スピル範囲演算子 ・暗黙的なインターセクション演算子 ・従来のスピルしないエクセルとの互換性についての注意点 ・スピル関連記事


そもそも「@」とは

関数の前または範囲の先頭に付く「@」は、

共通部分演算子
暗黙的なインターセクション演算子

と呼ばれるものです。(どちらの呼び方もされます。)

「@」の機能とは?

数式に範囲を渡したとき、数式を入れるセル自身の行にある1値だけを抜き出す機能です。
これを「暗黙的なインターセクション(交差)」と呼びます。
例: 3行目のセルに =INT(@A1:A10) または、=@INT(A1:A10) と入力したとき、INT(A3) として計算してくれます。

手動で数式を入れる場合、
=@INT(A1:A10)
と入力すると、
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について
このメッセージが出ます。

はい
「はい」を選択すると、数式は以下に書き換えられます。
=INT(@A1:A10)
これは、数式を入れるセルと同じ行のセルを使う数式になります。
例えば3行目のセルに入力した場合は、
=INT(A3)
と同じ動作になります。

いいえ
「いいえ」を選択すると、数式はそのまま入ります。
=@INT(A1:A10)
これは、範囲の先頭セルを使う数式になります。
=INT(A1)
言い換えれば、数式結果の先頭のみ出力されると考えても良いです。


VBAでセルに数式を入れる場合

なぜFormulaプロパティ だと自動で「@」が付くのか
スピル非対応のプロパティ
Formula
FormulaLocal
FormulaR1C1
FormulaR1C1Local
Value
スピル対応のプロパティ
Formula2
Formula2Local
Formula2R1C1
Formula2R1C1Local
スピル非対応のプロパティには、スピルする数式(結果が複数セルに及ぶ数式)を直接入力することはできません。
スピル非対応のプロパティにスピルする数式をいれた場合は、「@」を付けて自動的にスピルしない数式(出力が1セルになる数式)に変更されます。
スピルする数式(結果が複数セルに及ぶ数式)は、必ずスピル対応のプロパティに入れてください。

IFS関数はスピルに関係なく「@」が付きます。
IFS関数を含む数式を、VBAでスピル非対応のプロパティに入れると、「@」が自動的に追加されて非スピル数式に変更されます。
Range("B2").Formula = "=IF(A1=1,IFS(A2=1,1,TRUE,2),3)"
これを実行すると、セルに入る数式には「@」が付きます。
=@IF(A1=1,IFS(A2=1,1,TRUE,2),3)
この数式を見ればわかる通り、この数式はスピルしない数式です。
スピルとは関係ない数式です。
しかしなぜか、VBAではスピルする数式として扱われてしまうようです。
原因はIFS関数にあります。
もちろん、IFS関数単体でも同様に「@」が自動的に追加されます。

なぜこうなるのか理由は不明です。
原因ははっきりしません。

そもそも、.Formulaプロパティに入れているので、スピルしない数式で良いのですから、「@」がついて困ることはないと思います。
つまり実害はないと思われますが、セルの数式を確認した際に違和感を覚えるかもしれません。
出来れば、「@」なしの数式にしたいです。

そこで、IFS関数を使った数式は、スピルするかしないかにかかわらず、
スピル対応のプロパティを使うようにしてください。
Range("B2").Formula2 = "=IF(A1=1,IFS(A2=1,1,TRUE,2),3)"
これなら、そのままの数式がセルに入ります。


「@」(インターセクション演算子)が勝手についてしまう関数

以下の関数は、VBAでセルの .Formula プロパティに設定すると、数式の結果が複数セルか1セルかに関わらず「@」が自動的に付いてしまいます。
※実際に検証した結果です。対象関数に過不足がある可能性はご承知おきください。

CELL
CHOOSECOLS
CHOOSEROWS
DROP
EXPAND
FILTER
FILTERXML
FREQUENCY
GROWTH
HSTACK
IFS
INDIRECT
LAMBDA ※イータ縮小ラムダを使った場合でもヘルパー関数は全て(MAP,REDUCE,SCAN,BYROW,BYCOL,MAKEARRAY)
MINVERSE
MMULT
MODE.MULT
MUNIT
RANDARRAY
SEQUENCE
SORT
SORTBY
STOCKHISTORY
SWITCH
TAKE
TEXTSPLIT
TOCOL
TOROW
TRANSPOSE
TREND
TRIMRANGE
UNIQUE
VSTACK
WRAPCOLS
WRAPROWS

上記以外の関数は、引数によって結果が複数セルになる場合(つまりスピルする場合)は、「@」がついてスピルが抑止されます。

以下の関数は、引数に関わらず常に複数セルになるので、必ず「@」が付きます。
FREQUENCY
LINEST
LOGEST
GROUPBY
PIVOTBY




同じテーマ「マクロVBA技術解説」の記事

大量データにおける処理方法の速度王決定戦
遅い文字列結合を最速処理する方法について
大量VlookupをVBAで高速に処理する方法について
Withステートメントの実行速度と注意点
IfステートメントとIIF関数とMax関数の速度比較
スピルって速いの?スピルの速度について
1次元配列の下限インデックスを高速に変更する関数
レーベンシュタイン距離を求めるVBA(スピル対応)とセル数式
WorksheetFunction使用時のパフォーマンスへの影響について
Dirは限界!FSOは遅い!VBAファイル検索をWindows APIで爆速化
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について


新着記事NEW ・・・新着記事一覧を見る

電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
実績/予算ごとの3年間通算累計を出力|エクセル練習問題(2025-11-15)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ