ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
エラーの全文
コンパイル エラー:
トップレベルのコントロールをコントロールに追加できません。
(英語版)
Cannot add a top-level control to a control.
VBA エディタ(VBE)で UserForm を編集中、または UserForm をロード時に発生します。フォーム上のコントロール(CommandButton、TextBox、Label、Frame など)の親子関係が不正になっていることを示します。
原因: どんな操作で出るか
| 操作 | 状況 |
|---|---|
| 別の UserForm のコントロールをドラッグして持ち込む | ★ 最頻パターン |
| UserForm のコントロールを別 UserForm に「切り取り → 貼り付け」 | 正常に貼れたように見えて壊れる |
| Frame / MultiPage のページ内コントロールを Form 直下にコピー | 親子関係が崩れる |
コードで Set ctrl.Parent = Me のように親を直接書き換え | 不正な親変更 |
| 破損した .frm / .frx ファイルをインポート | ファイルレベルで壊れている |
| サードパーティ製 ActiveX コントロール(古い OCX)混在 | 登録不整合 |
対処1: コントロールを新規作成する
別の UserForm にコントロールを持っていきたい場合、コピー&ペーストではなく、移動先 UserForm で新規にコントロールを配置し、プロパティをコピーしてください。
- 移動元 UserForm でコントロールを選択 → プロパティウィンドウで設定値をメモ(Name, Caption, Font, Size 等)
- 移動先 UserForm を開く
- ツールボックスから同じ種類のコントロールを新規にドラッグ配置
- メモしたプロパティを設定
- 必要ならイベントハンドラのコードもコピー
対処2: UserForm を閉じて再オープン / VBE 再起動
一時的な内部状態の不整合の場合は VBE を再起動するだけで直ります:
- Excel を保存して閉じる
- Excel を再起動 → VBE (
Alt+F11) を開く - 該当 UserForm をダブルクリックして再表示
それでも消えない場合は、ファイルを別形式に変換する手があります:
- UserForm を右クリック → 「ファイルのエクスポート」で
.frmファイルとして保存 - プロジェクトから UserForm を削除
- 再度「ファイルのインポート」でエクスポートしたファイルを取り込む
対処3: 親子関係を意識して動的追加 (Controls.Add)
「Form A のコントロールを Form B にコードで移したい」というシナリオなら、デザイン時にドラッグするのではなく、実行時に Controls.Add で動的に作るのが正解です:
' Form B 側
Private Sub UserForm_Initialize()
Dim btn As MSForms.CommandButton
Set btn = Me.Controls.Add("Forms.CommandButton.1", "btnRun", True)
With btn
.Caption = "実行"
.Left = 10
.Top = 10
.Width = 80
.Height = 24
End With
Dim txt As MSForms.TextBox
Set txt = Me.Controls.Add("Forms.TextBox.1", "txtInput", True)
txt.Left = 10
txt.Top = 40
End Sub
| ProgID | コントロール |
|---|---|
Forms.CommandButton.1 | コマンドボタン |
Forms.TextBox.1 | テキストボックス |
Forms.Label.1 | ラベル |
Forms.ComboBox.1 | コンボボックス |
Forms.ListBox.1 | リストボックス |
Forms.CheckBox.1 | チェックボックス |
Forms.OptionButton.1 | オプションボタン |
Forms.Frame.1 | フレーム |
Forms.MultiPage.1 | マルチページ |
動的追加コントロールにイベントを付ける場合は、クラスモジュールと WithEvents を使います:
' クラスモジュール: ButtonHandler
Public WithEvents Btn As MSForms.CommandButton
Private Sub Btn_Click()
MsgBox "Clicked: " & Btn.Name
End Sub' UserForm
Dim handlers As Collection
Private Sub UserForm_Initialize()
Set handlers = New Collection
Dim i As Long
For i = 1 To 3
Dim b As MSForms.CommandButton
Set b = Me.Controls.Add("Forms.CommandButton.1", "btn" & i, True)
b.Caption = "Button " & i
b.Top = (i - 1) * 30 + 10
b.Left = 10
Dim h As ButtonHandler
Set h = New ButtonHandler
Set h.Btn = b
handlers.Add h ' GC 防止
Next
End Sub
対処4: Frame / MultiPage 内のコントロールを扱うとき
Frame や MultiPage はコンテナであり、その中のコントロールの親は Frame / MultiPage です。Form 直下に移動するときは:
' ❌ NG: ドラッグで Frame の外に出した瞬間に親が変わって壊れる場合あり
' ✅ 推奨: 元 Frame 上で新規作成 → プロパティコピーして配置
' どうしてもコードで移動するなら、新規作成して元を削除
Dim newBtn As MSForms.CommandButton
Set newBtn = Me.Controls.Add("Forms.CommandButton.1", "btnNew", True)
newBtn.Caption = Me.Frame1.btnOld.Caption
newBtn.Left = Me.Frame1.btnOld.Left + Me.Frame1.Left
newBtn.Top = Me.Frame1.btnOld.Top + Me.Frame1.Top
Me.Frame1.Controls.Remove "btnOld"
対処5: 破損 UserForm の復旧
上記すべてで治らない場合、UserForm ファイル自体が破損している可能性が高いです:
- VBE で UserForm を右クリック → エクスポート →
.frm+.frxを保存 - テキストエディタで
.frmを開き、コントロール定義部分を確認 - 不正なエントリ(Parent 指定がおかしいもの)を手動修正
- 再インポート
- それでも壊れている場合は、新規 UserForm を作って一からコントロールを配置(最も確実)
予防策
- UserForm 間でコントロールをドラッグや切り貼りで移動しない
- 共通の UI ならクラスモジュール化して再利用
- 頻繁に変わる UI は実行時
Controls.Addで動的生成 - ファイルは定期的にバックアップ(特にレイアウト変更前後)
- 巨大な UserForm は機能ごとに分割、MultiPage で TabStrip 化
- 古い OCX / ActiveX への依存を減らす(標準コントロールで完結)
関連エラー
| メッセージ | 関連 |
|---|---|
| 「オブジェクトはこのフォームの子オブジェクトではありません」 | 同じく親子関係エラー、Controls コレクションで指定名が存在しない |
| 「型が一致しません (Type mismatch)」 | 動的追加時に Set 漏れ・型違い |
| 「コントロールにフォーカスを設定できません」 | Visible/Enabled が False のコントロールに SetFocus |
| 「自動化エラー (Automation error)」 | OCX 登録崩れ、regsvr32 で再登録要 |
FAQ
Q: 同じファイル / 同じ UserForm を編集中にいきなり出るようになった
A: Excel / VBE のメモリリーク状態のことがあります。一度保存して Excel を完全終了 → 再起動で消えることが多いです。
Q: 共有環境(OneDrive / Teams)で発生
A: 同時編集や非同期同期でファイル破損が起きやすい。ローカルで作業 → 完成版だけ共有が安全。
Q: Controls.Add で作ったボタンが UserForm を閉じてもメモリに残る
A: イベントハンドラ用のクラスインスタンスを Set h = Nothing で明示解放、または UserForm_Terminate で Set handlers = Nothing。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 【Visual Studio】Form自動生成時に「値が有効な範囲にありません」エラー
- トップレベルのコントロールをコントロールに追加できません。
- 指定された名前のソリューションファイルが既に存在するため、ソリューション名を変更できません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?