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 ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

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




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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