Excel でスピンボタン(▲▼の小さい矢印で数値を増減するコントロール)を使いたいけど、「どこに挿入するか分からない」「リンクするセルに値が反映されない」「VBA でどう書く?」と詰まる人が多いコントロールです。
主な原因は、フォームコントロール版 と ActiveX 版 の 2 系統が存在し、それぞれ別の API・別のイベントを使うことを知らない点にあります。
本記事の主な内容は次のとおりです。
- 2 系統の 12 観点比較表(フォーム vs ActiveX)
- Min/Max/SmallChange の実上限(Excel 2024 build 19929 で実機検証)
- VBA
AddFormControl(xlSpinner)による動的生成 - 月選択ドロップダウンとの組み合わせ応用
Worksheet_Changeが発火しない罠- 動かない 7 原因チェックリスト
コピペで動く 配布用 xlsm(8 シート)も用意しました。
スピンボタンとは — 用途と挿入の 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)を使うのが安全です。

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

| 観点 | フォームコントロール | 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)— 値を反映するセル参照
※コードプロパティ(Value、Min 等)は VBA で Shape.ControlFormat 経由でアクセスします。ダイアログ表記とコード表記の対応は本記事で 5 か所一致させているので、相互変換に迷う必要はありません。

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!A1 | Sheet1 の A1 | シート名 + セル |
"'Sheet1'!A1" | Sheet1!A1 | Sheet1 の A1 | スペースなしシート名のシングルクォートは自動除去 |
"'Data Sheet'!A1" | 'Data Sheet'!A1 | Data 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 × 5ms 後、3 回目以降はDelayms 間隔で発火)Orientation: 縦/横の向き(fmOrientationAuto = -1: サイズで自動 /fmOrientationVertical = 0: 縦固定 /fmOrientationHorizontal = 1: 横固定)
3 つのイベントの使い分け(参考)
ActiveX スピンボタンには SpinButton1_Change、SpinButton1_SpinUp、SpinButton1_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 シナリオを実機で比較できます。

再帰発火を防ぐ 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 SafeExit で EnableEvents = 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 で定期実行する記事 も参考になります。セルを点滅させる応用例は セル点滅マクロの記事 をご覧ください。

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 プロパティの実機確認範囲は以下のとおりです:
| プロパティ | 実機確認範囲 | 既定値 | 備考 |
|---|---|---|---|
Min | 0〜30,000 | 0 | 負値(-1 など)はエラー「Spinner クラスの Min プロパティを設定できません」 |
Max | 0〜30,000 | 30,000 | 30,001 以上はエラー。Min < Max の制約あり(初期 Min=0 なら実質 1〜30,000) |
SmallChange | 0〜30,000 | 1 | 負値はエラー、0 は受理されるが矢印クリックで値変化なし |
LargeChange | プロパティ自体が存在しない | — | スクロールバーには存在(既定 10)、スピンボタンには無い |
Microsoft Learn の MSForms ページの転用注意
Microsoft Learn の Max, Min properties と SmallChange property のページには「推奨範囲 -32,767〜+32,767」と書かれています。しかしこれは MSForms ライブラリ(= ActiveX SpinButton / ScrollBar)の仕様であり、Excel ワークシートに挿入したフォームコントロールの ControlFormat にはそのまま当てはまりません。
ControlFormat.Max の Learn ページと ControlFormat.Min の Learn ページには型が Long としか書かれておらず、実機の 0〜30,000 範囲は公式に明記されていません。Microsoft Support の スピン ボタン追加手順には「最小値・最大値を入力」とあるだけです。読者が MSForms ページの ±32,767 をフォームコントロール側に適用すると、Min=-1 でエラーになって混乱しがちなので注意してください。

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 の通常設定を推奨します。

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

Shape.Type と Shape.FormControlType の区別
挿入したスピンボタンを後から識別する場合は、Shape.Type と Shape.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 SubShape.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 つを順に確認してください:

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 = -1 や cf.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
コメント