Article

【Excel】スピンボタン VBA 完全ガイド|2 系統の違いと動かない 7 原因

この記事で分かること

Excel スピンボタンの使い方を、フォーム vs ActiveX の 2 系統の違い、Min/Max 実上限、動かない 7 原因まで Excel 2024 実機検証つき解説します。

Excel でスピンボタン(▲▼の小さい矢印で数値を増減するコントロール)を使いたいけど、「どこに挿入するか分からない」「リンクするセルに値が反映されない」「VBA でどう書く?」と詰まる人が多いコントロールです。

主な原因は、フォームコントロール版ActiveX 版 の 2 系統が存在し、それぞれ別の API・別のイベントを使うことを知らない点にあります。

本記事の主な内容は次のとおりです。

  • 2 系統の 12 観点比較表(フォーム vs ActiveX)
  • Min/Max/SmallChange の実上限(Excel 2024 build 19929 で実機検証)
  • VBA AddFormControl(xlSpinner) による動的生成
  • 月選択ドロップダウンとの組み合わせ応用
  • Worksheet_Change が発火しない罠
  • 動かない 7 原因チェックリスト

コピペで動く 配布用 xlsm(8 シート)も用意しました。

  1. スピンボタンとは — 用途と挿入の 2 経路
  2. 2 系統の違い 早見表(フォーム vs ActiveX)
  3. 方法 1: フォームコントロール版(xlSpinner と「リンクするセル」)
    1. 挿入とプロパティ設定
    2. VBA から ControlFormat にアクセスする
    3. 「リンクするセル」の書き方 6 パターン
    4. 矢印クリックでの動作
  4. 方法 2: ActiveX 版(環境依存の参考扱い)
    1. Office LTSC 2024 では ActiveX が既定で無効化されている
    2. ActiveX を挿入できる環境での操作(参考)
    3. 3 つのイベントの使い分け(参考)
  5. Worksheet_Change 連動の罠 — 矢印クリックでも cf.Value 代入でも発火しない
    1. 再帰発火を防ぐ Worksheet_Change の書き方
    2. 月選択ドロップダウンとスピンボタンの組み合わせ応用
  6. Min / Max / SmallChange の実上限 — Microsoft Learn の MSForms ページの転用注意
    1. 実機確認範囲は Min=0〜30,000、Max=0〜30,000、SmallChange=0〜30,000
    2. Microsoft Learn の MSForms ページの転用注意
    3. Value 代入の 4 階層ルール
    4. Min > Max の反転状態は Value が機能停止
  7. VBA でスピンボタンを動的に作成する
    1. Shape.Type と Shape.FormControlType の区別
    2. 非表示・無効化と印刷制御
  8. FAQ — スピンボタンが動かない 7 原因チェックリスト
    1. 1. シートが保護されている(LinkedCell がロック中)
    2. 2. 開発タブが表示されていない
    3. 3. マクロが無効化されている / Office LTSC 2024 で ActiveX が既定無効
    4. 4. LinkedCell に範囲(A1:A3)を指定している
    5. 5. LinkedCell に存在しないシート名 / スペース入りシート名でクォート無し
    6. 6. コントロールが削除済み
    7. 7. Min / Max を 0〜30,000 範囲外に設定しようとしている
    8. ※ Mac / Web Excel での非対応について
  9. まとめ

スピンボタンとは — 用途と挿入の 2 経路

Excel のスピンボタンには フォームコントロール版ActiveX 版 の 2 系統があります。いずれも ▲▼の 2 つの矢印ボタンで 数値を 1 ずつ(または指定した増分で)増減する ためのコントロールです。月・日・年などの日付入力、ボリュームレベルの調整、入力フォームの値選択などに使います。

同じく「矢印で値を変える」コントロールに スクロールバー もあります。スクロールバーは LargeChange(バー部分のクリックで動く量)や ProportionalThumb(つまみの比例サイズ)といった独自プロパティを持ちますが、スピンボタン側にはありません。スピンボタンは「離散値を 1 個ずつ動かす」、スクロールバーは「広い範囲を連続的にスクロールする」と用途で使い分けます。

Excel でスピンボタンを挿入するには、開発タブを表示したうえで 「挿入」 ボタンから 2 つのグループのどちらかを選びます:

  • フォームコントロール グループ内のスピンボタン(推奨。VBA なしでも動く。Mac 利用時は対象環境での動作確認を推奨)
  • ActiveX コントロール グループ内のスピンボタン(VBA イベントで複雑な処理を書きたい場合、Windows 版 Excel 限定)

※開発タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」のチェックを入れてください。フォームコントロールの一般的な挿入手順は プルダウンを開発タブから作成する記事 も参考になります。

Office LTSC 2024 では ActiveX コントロールが既定で無効化されています。Office 2024 環境で開発タブの挿入メニューに「ActiveX コントロール」グループが表示されない場合は、フォームコントロール版(本記事 h2-3)を使うのが安全です。

Excel 2024 開発タブの挿入メニューにフォームコントロール グループのみ表示される画面 (ActiveX コントロール グループは Office LTSC 2024 で既定無効)
Excel 2024 build 19929 の開発タブ。Office LTSC 2024 では ActiveX コントロール グループが既定で無効化されています。

2 系統の違い 早見表(フォーム vs ActiveX)

フォームコントロール版と ActiveX 版は、見た目は似ていても API・プロパティ・イベント・対応プラットフォームが大きく異なります。以下の 12 観点を 1 表で比較します:

Excel スピンボタン フォームコントロール版と ActiveX 版の 12 観点完全比較表
フォームコントロール版と ActiveX 版の 12 観点比較。Excel 2024 build 19929 実機検証 + Microsoft Learn / Support。
観点フォームコントロールActiveX コントロール
1. 挿入経路開発タブ → 挿入 → フォームコントロール → スピンボタン開発タブ → 挿入 → ActiveX コントロール → スピンボタン
2. VBA アクセスShape.ControlFormat 経由OLEObject.Object 経由
3. 値の連動ControlFormat.LinkedCell でリンクするセルを指定OLEObject.LinkedCell でリンク、または SpinButton1.Value 直接参照
4. Min/Max の範囲実機 0〜30,000(Min<0 はエラー)推奨 -32,767〜+32,767(MSForms 仕様)
5. SmallChange の範囲実機 0〜30,000推奨 -32,767〜+32,767
6. LargeChange プロパティなし(スクロールバーのみ)なし
7. Delay プロパティなし既定 50 ms(連続クリック時の遅延)
8. Orientation プロパティなし(リサイズハンドルで縦横切替)fmOrientationAuto=-1 / Vertical=0 / Horizontal=1
9. イベント「マクロの登録」で 1 つのマクロを割当3 イベント: Change / SpinUp / SpinDown
10. Worksheet_Change 発火矢印クリックでも VBA cf.Value 代入でも発火しない / VBA Range.Value 直書込なら発火MSForms 仕様では Change イベントで値変更を扱う
11. 環境制約Mac: 一部互換 / Web: サポート限定Mac / Web 不可(Windows 限定)。Office LTSC 2024 では既定で無効化(再有効化は組織のセキュリティポリシーに従う)
12. 動作安定性シンプルで安定、初心者向け高機能だがマクロ無効化・デザインモード忘れなどでハマりやすい

使い分けの目安: VBA を書かずに「値の増減」だけ実現したいなら フォームコントロール版(Mac でも使う場合は対象環境での動作確認を前提に)。VBA で連続クリック時の挙動制御(Delay)、上下個別のイベント処理(SpinUp / SpinDown)が必要なら ActiveX 版。本記事はフォームコントロールを主軸にしつつ、ActiveX の独自機能も解説します。

方法 1: フォームコントロール版(xlSpinner と「リンクするセル」)

1 つ目の方法は、開発タブの「フォームコントロール」グループから挿入するスピンボタンです。「コントロールの書式設定」ダイアログで「リンクするセル」を指定するだけで、矢印クリックで指定セルの値が増減します。VBA を 1 行も書かなくても使えるのが特徴です。

挿入とプロパティ設定

開発タブ → 挿入 → フォームコントロール内のスピンボタンアイコンをクリックし、シート上でドラッグすると挿入されます。挿入後、右クリック → 「コントロールの書式設定」 → 「コントロール」タブで以下の 5 つのプロパティを設定します:

  • 現在値(コード上は Value)— スピンボタンの初期値
  • 最小値Min)— 矢印を下方向にクリックして到達する下限
  • 最大値Max)— 矢印を上方向にクリックして到達する上限
  • 変化の増分SmallChange)— 矢印 1 回クリックでの増減量
  • リンクするセルLinkedCell)— 値を反映するセル参照

※コードプロパティ(ValueMin 等)は VBA で Shape.ControlFormat 経由でアクセスします。ダイアログ表記とコード表記の対応は本記事で 5 か所一致させているので、相互変換に迷う必要はありません。

Excel フォームコントロール スピンボタンを A2 セルに LinkedCell 設定したシート全景
配布 xlsm シート 2 のフォームコントロール版スピンボタン。Min=0/Max=100/SmallChange=1/LinkedCell=A2。

VBA から ControlFormat にアクセスする

挿入したスピンボタンは Worksheets(1).Shapes("Spinner 1").ControlFormat で操作できます。たとえば以下のコードで Min=0, Max=100, SmallChange=5, LinkedCell=A1 を一括設定できます:

Sub SetupSpinner()
    Dim cf As ControlFormat
    Set cf = Worksheets(1).Shapes("Spinner 1").ControlFormat
    cf.LinkedCell = "A1"
    cf.Min = 0
    cf.Max = 100
    cf.SmallChange = 5
    cf.Value = 50
End Sub

「リンクするセル」の書き方 6 パターン

実機検証 で LinkedCell プロパティに渡せる文字列形式を確認しました。stored 値の正規化と書込先の挙動は以下のとおりです:

記述cf.LinkedCell 保持値書込先備考
"A1"A1同一シートの A1相対参照、現在のシート
"$A$1"$A$1同一シートの A1絶対参照保持
"Sheet1!A1"Sheet1!A1Sheet1 の A1シート名 + セル
"'Sheet1'!A1"Sheet1!A1Sheet1 の A1スペースなしシート名のシングルクォートは自動除去
"'Data Sheet'!A1"'Data Sheet'!A1Data Sheet の A1スペース入りシート名はシングルクォート保持必須
"Data Sheet!A1""" (空文字)書込先なしスペース入りシート名でクォート無しは無効化(エラーは出ないが書き込まれない)

スペースを含むシート名は必ずシングルクォートで囲んでください。クォートなしの "Data Sheet!A1" ではエラーが出ませんが、LinkedCell が空文字に潰れて書込先なしになります。

別シートのセルもリンク可能ですcf.LinkedCell = "Sheet2!A1" と設定すれば、スピンボタンを置いたシートと別の Sheet2 の A1 セルに値が書き込まれます。月選択画面とデータシートを分けたいときに便利です。

矢印クリックでの動作

設定後、シート上のスピンボタンの ▲ をクリックすると LinkedCell の値が +SmallChange され、▼ をクリックすると -SmallChange されます。Max(最大値)に達した後 ▲ を更にクリックしても値は変化しません。Min(最小値)に達した後の ▼ も同様で、循環はしません。

※矢印クリックでリンクするセルの値は更新されますが、Worksheet_Change イベントは発火しません。これは VBA から cf.Value = N で書き換えた場合と同じパスを通るためです。詳しくは h2-5 で扱います。

方法 2: ActiveX 版(環境依存の参考扱い)

2 つ目の方法は ActiveX コントロールのスピンボタンです。VBA で 3 種類のイベント(Change / SpinUp / SpinDown)を個別に処理できる点がフォームコントロール版との違いです。Windows 版 Excel のみ対応します。

Office LTSC 2024 では ActiveX が既定で無効化されている

Microsoft Learn の Overview of Office LTSC 2024 によると、Office LTSC 2024 では ActiveX コントロールが既定で無効化されています。Office 2024 環境で開発タブの挿入メニューに「ActiveX コントロール」グループが表示されない場合は、フォームコントロール版(本記事 h2-3)を使うのが安全です。本記事の実機検証も Excel 2024 build 19929 で実施しており、ActiveX コントロールの挿入は環境依存となります。

再有効化が必要な場合は、組織の管理者・セキュリティポリシーに従ってください。本記事ではセキュリティ設定変更の手順までは案内しません。

ActiveX を挿入できる環境での操作(参考)

ActiveX が有効な環境では、開発タブ → 挿入 → ActiveX コントロール グループの「スピンボタン」アイコンをクリックし、シート上でドラッグして配置します。配置後はデザインモードが有効になっており、この状態で右クリック → 「プロパティ」を開くと、プロパティウィンドウが表示されます。

プロパティウィンドウで設定する主なプロパティは以下です:

  • (Name): ActiveX オブジェクトの識別名(既定 SpinButton1)。イベントプロシージャ名と一致させる必要があります。
  • LinkedCell: 値を反映するセル(例: A1、別シートなら Sheet2!A1
  • Min / Max: 値の下限・上限(既定 0 / 100、推奨 -32,767〜+32,767)
  • SmallChange: 矢印クリック 1 回での増減量(既定 1)
  • Delay: 連続クリック時の遅延(既定 50 ms、最初のイベントは即時、2 回目は Delay × 5 ms 後、3 回目以降は Delay ms 間隔で発火)
  • Orientation: 縦/横の向き(fmOrientationAuto = -1: サイズで自動 / fmOrientationVertical = 0: 縦固定 / fmOrientationHorizontal = 1: 横固定)

3 つのイベントの使い分け(参考)

ActiveX スピンボタンには SpinButton1_ChangeSpinButton1_SpinUpSpinButton1_SpinDown の 3 イベントがあります。Excel の VBE で対象シートのシートモジュールを開き、以下のコードを貼り付けます:

Private Sub SpinButton1_Change()
    Range("B1").Value = "値変更: " & SpinButton1.Value
End Sub

Private Sub SpinButton1_SpinUp()
    Range("B2").Value = "▲クリック: " & Now
End Sub

Private Sub SpinButton1_SpinDown()
    Range("B3").Value = "▼クリック: " & Now
End Sub

▲をクリックすると SpinUp イベントの後に Change イベント(合計 2 件)が発火します。▼の場合は SpinDown + Change です。「上クリックと下クリックで違う処理をしたい」場合は SpinUp / SpinDown を使い、「値が変わったときに同じ処理を走らせたい」場合は Change 1 つで十分です。

設定後、開発タブの「デザインモード」をクリックして解除すると、スピンボタンが動作するようになります。デザインモードが有効なままだとクリックしても動かないので、「動かない」と感じたらまずこれを確認してください。他の VBA 実行時エラーで詰まったら VBA 実行時エラー 76 の解決方法 も参考にしてください。

Worksheet_Change 連動の罠 — 矢印クリックでも cf.Value 代入でも発火しない

フォームコントロール スピンボタンを VBA で扱うとき、もっとも踏みやすい罠が Worksheet_Change イベントの発火パスです。

結論を先に書きます(Excel 2024 build 19929 実機検証)。

  • シート上のスピンボタン矢印クリック → LinkedCell 更新するが Worksheet_Change 発火せず
  • VBA cf.Value = N 代入 → LinkedCell 更新するが Worksheet_Change 発火せず
  • VBA Range("A1").Value = N 直書込 → Worksheet_Change 発火
  • セル A1 を手入力で編集 → Worksheet_Change 発火

つまり、矢印クリックの内部処理は VBA cf.Value 代入と同じパスを通っており、COM プロパティセッター経由で LinkedCell を更新するため、Excel の Worksheet_Change 発火パスを通りません。これはセルを手入力で編集した場合と対照的です(手入力編集なら Worksheet_Change は発火します)。本記事の配布 xlsm(シート 4)で、矢印クリック・cf.Value 代入・Range.Value 代入・セル手入力の 4 シナリオを実機で比較できます。

Excel スピンボタンの Worksheet_Change 発火パス比較 Before / cf.Value=70 後 / Range A2=30 後 の縦並び
Worksheet_Change の発火パス比較。cf.Value 代入では発火せず、Range.Value 直書込で発火 (Excel 2024 build 19929 実機検証)。

再帰発火を防ぐ Worksheet_Change の書き方

Worksheet_Change イベントの中で同じワークシートのセルを書き換えると、その書き込み自体が再び Worksheet_Change を発火させて再帰発火で Excel/COM を不安定化させることがあります。配布 xlsm のシート 4 では以下のパターンで再帰防止を実装しています:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 対象セル A2 以外は無視 (再帰防止 + 無関係なセル変更を弾く)
    If Intersect(Target, Me.Range("A2")) Is Nothing Then Exit Sub
    On Error GoTo SafeExit
    Application.EnableEvents = False
    ' ログを別シート (ChangeLog) に書込 — 自己再発火回避
    Dim logSheet As Worksheet
    Set logSheet = ThisWorkbook.Sheets("ChangeLog")
    logSheet.Range("A1").Value = Format(Now, "yyyy/mm/dd hh:mm:ss")
    logSheet.Range("A2").Value = Target.Address(False, False)
    logSheet.Range("A3").Value = Val(logSheet.Range("A3").Value) + 1
SafeExit:
    Application.EnableEvents = True
End Sub

ポイントは 3 つ: ① Intersect で対象セルだけに反応する、② Application.EnableEvents = False でイベント発火を一時停止、③ ログ書込先を別シートに分けて自己再発火を防ぐ。On Error GoTo SafeExitEnableEvents = True への復帰を保証している点もポイントです(途中でエラーが出てもイベント無効化が残らない)。

月選択ドロップダウンとスピンボタンの組み合わせ応用

セルに Data Validation(入力規則)でドロップダウンリストを設定し、同じセルをスピンボタンの LinkedCell にすれば、「クリックで月選択」+「ドロップダウンで一覧表示」 の両方を提供できます。配布 xlsm のシート 5 で実装例を確認できます。

応用シナリオ: B1 セルに Data Validation で月の数値リストをドロップダウン設定。同じく B1 をスピンボタンの LinkedCell にして Min=1 / Max=12 で配置します。

スピンボタンの矢印クリックとドロップダウン選択のどちらでも B1 が変動し、矢印操作では Min=1 / Max=12 でクランプされます(13 にはできない)。

注意点: VBA から Range("B1").Value = 99 を実行すると、Data Validation は無視されて 99 が入ります。VBA 直書込は Validation を効かさない仕様です(UI 入力時のみ Validation が効く)。スピンボタンの Min/Max クランプは VBA 代入でも効くため、3 つの「上限制約」の働き方は次のように異なります:

  • UI セル手入力(直接タイプ): Data Validation が効く + Worksheet_Change 発火
  • UI 矢印クリック: スピンボタンの Min/Max でクランプ + Worksheet_Change 発火せず
  • VBA Range.Value 代入: Validation も Min/Max も効かない(任意の値が入る) + Worksheet_Change 発火
  • VBA cf.Value 代入: スピンボタンの Min/Max が効く(境界動作は h2-6「Value 代入の 4 階層ルール」を参照) + Worksheet_Change 発火せず

VBA フィルター後の処理は フィルター後の可視最終行を取得する記事、定期的に値を更新したい場合は Application.OnTime で定期実行する記事 も参考になります。セルを点滅させる応用例は セル点滅マクロの記事 をご覧ください。

Excel 月選択ドロップダウンとスピンボタンの組み合わせ Before / VBA Range B3=99 後 の縦並び
Data Validation ドロップダウン + スピンボタン (Min=1/Max=12) の組合せと、VBA Range.Value 代入による Validation 無視。

Min / Max / SmallChange の実上限 — Microsoft Learn の MSForms ページの転用注意

フォームコントロール版スピンボタンの Min / Max / SmallChange の実上限と、それに対する Microsoft Learn の記述の関係は、ここで一度整理しておく必要があります。

実機確認範囲は Min=0〜30,000、Max=0〜30,000、SmallChange=0〜30,000

Excel 2024 build 19929 の実機検証では、フォームコントロール スピンボタンの ControlFormat プロパティの実機確認範囲は以下のとおりです:

プロパティ実機確認範囲既定値備考
Min0〜30,0000負値(-1 など)はエラー「Spinner クラスの Min プロパティを設定できません」
Max0〜30,00030,00030,001 以上はエラー。Min < Max の制約あり(初期 Min=0 なら実質 1〜30,000)
SmallChange0〜30,0001負値はエラー、0 は受理されるが矢印クリックで値変化なし
LargeChangeプロパティ自体が存在しないスクロールバーには存在(既定 10)、スピンボタンには無い

Microsoft Learn の MSForms ページの転用注意

Microsoft Learn の Max, Min propertiesSmallChange property のページには「推奨範囲 -32,767〜+32,767」と書かれています。しかしこれは MSForms ライブラリ(= ActiveX SpinButton / ScrollBar)の仕様であり、Excel ワークシートに挿入したフォームコントロールの ControlFormat にはそのまま当てはまりません。

ControlFormat.MaxLearn ページControlFormat.MinLearn ページには型が Long としか書かれておらず、実機の 0〜30,000 範囲は公式に明記されていません。Microsoft Support の スピン ボタン追加手順には「最小値・最大値を入力」とあるだけです。読者が MSForms ページの ±32,767 をフォームコントロール側に適用すると、Min=-1 でエラーになって混乱しがちなので注意してください。

Microsoft Learn MSForms 推奨 -32,767〜+32,767 と Excel 2024 フォームコントロール実機 0〜30,000 の範囲乖離図解
Microsoft Learn の MSForms ページの推奨範囲を、Excel ワークシート フォームコントロール ControlFormat にそのまま当てはめないでください。

Value 代入の 4 階層ルール

ControlFormat.Value プロパティへの代入は、以下の 4 ルールで処理されます:

入力値結果例 (Min=10, Max=20 の場合)
① 負値 (value < 0)常に拒否(実行時エラー)cf.Value = -1 → エラー
② 0 以上で Min 未満 (0 ≤ value < Min)Min にクランプ(エラーなし)cf.Value = 9 → cf=10
③ Min 以上 Max 以下 (Min ≤ value ≤ Max)そのまま整数化(小数は切捨)cf.Value = 12.5 → cf=12
④ Max 超過 (value > Max)Max にクランプ(エラーなし)cf.Value = 21 → cf=20

重要な非対称性: ①の「負値拒否」は Min がいくつであっても適用されます。たとえば Min=10 の状態でも cf.Value = -1 はエラーになります(Min=10 までのクランプではなく拒否)。一方、Min=10 で cf.Value = 5(正値で Min 未満)は ② のルールで cf=10 にクランプされます(エラーなし)。この非対称性は Excel 2024 build 19929 で確認しました。

Min > Max の反転状態は Value が機能停止

ControlFormat は Min < Max の制約を強制せず、cf.Min = 100; cf.Max = 10 のような反転設定を受理します。しかしこの反転状態では cf.Value 代入が機能停止し、どんな値を代入しても cf=10 / LinkedCell=100 のまま動きません。Microsoft Learn の MSForms 用 Max/Min ページには「Max が下端、Min が上端で動く(反転動作)」と書かれていますが、Excel フォームコントロール側ではこの仕様は実用に耐えません。本記事では Min < Max の通常設定を推奨します。

Excel フォームコントロール Min が Max より大きい反転時の Value 代入機能停止表 Min=100 Max=10 で cf.Value 各値が 10 固定
Min が Max より大きい反転状態は Value 代入が機能停止し実用に耐えません (Excel 2024 build 19929 実機検証)。

VBA でスピンボタンを動的に作成する

VBA からスピンボタンを動的に追加するには、Shapes.AddFormControl メソッドに xlSpinner 定数を渡します:

Sub AddSpinDynamically()
    Dim sp As Shape
    Set sp = Worksheets(1).Shapes.AddFormControl( _
        xlSpinner, Left:=100, Top:=100, Width:=15, Height:=30)
    With sp.ControlFormat
        .LinkedCell = "A1"
        .Min = 0
        .Max = 100
        .SmallChange = 1
        .Value = 50
    End With
End Sub

xlSpinner は Microsoft Learn の XlFormControl 列挙で値 9 として定義されています。Excel 2024 build 19929 実機でも Shape.FormControlType=9 として取得できることを確認済み。同じ列挙には xlScrollBar = 8 もあり、隣接値で間違えやすいので注意。

Excel VBA で Shapes.AddFormControl(xlSpinner) を実行する前後とコードペインの縦並び
VBA AddFormControl(xlSpinner) による動的生成。Shape.Type=msoFormControl + FormControlType=xlSpinner で判定可能。

Shape.Type と Shape.FormControlType の区別

挿入したスピンボタンを後から識別する場合は、Shape.TypeShape.FormControlType の 2 つを使い分ける必要があります:

  • Shape.Type: フォームコントロール全般を表す msoFormControl = 8(スピンボタン以外のボタン、リストボックスなども同じ)
  • Shape.FormControlType: 個別のフォームコントロール種別、xlSpinner = 9

「フォームコントロールの中からスピンボタンだけを抽出する」VBA は以下のように書きます:

Sub ListSpinners()
    Dim sp As Shape
    For Each sp In ActiveSheet.Shapes
        If sp.Type = msoFormControl And sp.FormControlType = xlSpinner Then
            Debug.Print sp.Name & " | Value=" & sp.ControlFormat.Value
        End If
    Next sp
End Sub

Shape.Type = 8 の数値と FormControlType = 9 の数値が紛らわしいですが、片方が「フォームコントロールであることの判定」、もう片方が「種別の判定」という意味の違いがあります。

非表示・無効化と印刷制御

動的生成したスピンボタンには以下の制御プロパティもあります:

  • Shape.Visible = False: スピンボタンを非表示にする(再表示は True
  • cf.Enabled = False: UI クリックを無効化する。ただし VBA からの cf.Value = N 代入は通る
  • cf.PrintObject = False: 印刷時にスピンボタンを除外する設定(既定 True)。実機での印刷出力結果は別途確認
  • Shape.Placement = 3 (xlFreeFloating): セルのサイズ変更でスピンボタンが動かないようにする(既定 1 = xlMoveAndSize

FAQ — スピンボタンが動かない 7 原因チェックリスト

「スピンボタンが動かない」「LinkedCell に値が反映されない」と詰まったとき、以下 7 つを順に確認してください:

Excel スピンボタン動かない 4 原因のエラーダイアログ Min=-1 / 範囲 LinkedCell / 存在しないシート名 / 削除後参照
動かない原因の 4 例。フォームコントロール ControlFormat 実上限 0〜30,000 / 範囲指定の C1 のみ書込 / 存在しないシート名サイレント失敗 / 削除後参照エラー。

1. シートが保護されている(LinkedCell がロック中)

シートが保護されていて、かつ LinkedCell に指定したセルが Locked = True(既定)の場合、矢印クリックで値を書き込めず、エラーも出ないままサイレントに動かない状態になります。さらに紛らわしいのは、VBA から cf.Value = N を代入しても cf 側の値も更新されずに前の値のまま残る点です。「校閲」タブの「シート保護の解除」を実行するか、LinkedCell セルを「ホーム」タブ → 「書式」 → 「セルのロック解除」してから保護をかけてください。

2. 開発タブが表示されていない

そもそもスピンボタンを挿入できない場合は、開発タブが非表示の可能性があります。「ファイル」 → 「オプション」 → 「リボンのユーザー設定」 → 右側のリストで「開発」のチェックを入れます。

3. マクロが無効化されている / Office LTSC 2024 で ActiveX が既定無効

ActiveX 版や VBA で動かしているフォームコントロール版で動かない場合は、ファイルが信頼できる場所の外にあって VBA が無効化されている可能性があります。ファイルを開いた直後に黄色いバーで「セキュリティの警告 マクロが無効にされました」と表示されていたら、「コンテンツの有効化」をクリックしてください。

また、Office LTSC 2024 では ActiveX コントロールが既定で無効化されています。Office 2024 環境で「ActiveX コントロール」グループが開発タブの挿入メニューに表示されない場合、ActiveX 版スピンボタンは挿入できません。フォームコントロール版(本記事 h2-3)で代替してください。再有効化は組織のセキュリティポリシーに従ってください。

4. LinkedCell に範囲(A1:A3)を指定している

cf.LinkedCell = "A1:A3" のように範囲を指定しても、エラーは出ず受理されます。しかし書き込まれるのは A1(左上)のみで、A2/A3 は空のまま残ります。スピンボタンの LinkedCell は単一セルを指定してください。

5. LinkedCell に存在しないシート名 / スペース入りシート名でクォート無し

cf.LinkedCell = "DoesNotExist!A1" のように存在しないシート名を指定しても、エラーは出ません。文字列として保持されますが、書込先がないため矢印クリックしても何も起こりません。

スペースを含むシート名は 必ずシングルクォートで囲む 必要があります。cf.LinkedCell = "Data Sheet!A1" ではエラーが出ませんが、stored 値が空文字に潰れて書込先なしになります。正しくは cf.LinkedCell = "'Data Sheet'!A1" です(クォート保持)。

6. コントロールが削除済み

VBA で sp.Delete 後に sp.ControlFormat.Value を取得しようとすると、「Spinner クラスの Value プロパティを取得できません」エラーになります。シェイプ削除後の参照は無効です。削除する前に必要な値を変数に退避してください。

7. Min / Max を 0〜30,000 範囲外に設定しようとしている

前述のとおり、フォームコントロール版の ControlFormat.Min / Max は 0〜30,000 の範囲しか受け付けません。cf.Min = -1cf.Max = 30001 を実行すると「Spinner クラスの Min / Max プロパティを設定できません」エラーになります。負値や 30,000 超過が必要な場合は、ActiveX が利用できる管理済み環境では ActiveX 版(推奨範囲 -32,767〜+32,767)も選択肢になります。

※ Mac / Web Excel での非対応について

ActiveX スピンボタンは Mac 版 Excel と Web 版 Excel ではサポートされていません。フォームコントロール版は Mac で一部互換、Web 版でも限定的に動作しますが、本記事の実機検証は Windows 版 Excel 2024 build 19929(Office 2024 永続版) でのみ実施しています。Mac / Web を対象にする場合は別途確認が必要です。

まとめ

Excel スピンボタンを使いこなす鍵は、フォームコントロール版と ActiveX 版の 2 系統が別 API・別仕様であることを最初に把握することです。VBA を書かずに値を増減するだけならフォームコントロール版で十分、連続クリック制御や上下個別イベントが必要なら ActiveX 版を選びます。

Min/Max の範囲は 2 系統で異なります。

  • フォームコントロール版: 0〜30,000(Windows 版 Excel 2024 build 19929 実機検証)
  • ActiveX 版: -32,767〜+32,767(MSForms の Learn 記載)

このように根拠の種別も異なる点に注意してください。

cf.Value 代入が Worksheet_Change を発火させない罠、別シート LinkedCell やスペース入りシート名のクォート扱いなど、Excel 2024 実機検証で確認した細部も本文中に盛り込みました。

「動かない」と詰まった時は h2 の最後にある 7 原因チェックリストを順に確認してください。フォームコントロールやプルダウンの一般的な挿入手順は プルダウン作成の記事、VBA 周りの追加情報は フィルター可視最終行セル点滅OnTime 定期実行実行時エラー 76 の記事もご活用ください。コピペで動く配布用 xlsm は以下からダウンロードできます。

※配布 xlsm 内の「ActiveX 組立」シートは Office LTSC 2024 環境では 参考扱いです(ActiveX が既定無効のため、組立手順は動作しない可能性あり)。フォームコントロール版のシート(方法 1、Worksheet_Change 罠、月選択応用、Min/Max 範囲確認、動かない 7 原因チェック)は ActiveX 設定とは無関係に動作します。

excel-vba-spinbutton-sample.xlsm

8 シート / VBA 同梱 / Excel 2024 build 19929 で動作確認。フォームコントロール 5 シート、ChangeLog、ActiveX 組立式 (環境依存) を収録しています。

ダウンロード

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント