質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3898閲覧

VBAで、選択範囲にチェックボックスを入れようとしたが、すべて選択範囲の左上に重ねて入ってしまう

halmichi

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/21 07:40

前提・実現したいこと

Microsoft360のエクセルを使っています。
VBAで指定した範囲のセルにチェックボックスを埋め込みたいです。

VBAで、指定した範囲のセルにチェックボックスを埋め込みたい
でヒントをいただいたのでできると思って解決にしたのですが、やっぱりうまくいきませんでした。

下のコードでは、飛び飛びの選択範囲を指定して、ForEachでセルごとに処理するように書いたつもりですが、C5だけにたくさんのチェックボックスが埋め込まれてしまいます。

コードの中のSample_CheckBox1()は下記のページからコピペしたもので、曰く選択範囲にチェックボックスが入れられるとのことですが、
チェックボックス埋め込み
何度読んでも、どこで埋め込むセルを指定しているのかわかりません。ActiveSheetで選択範囲が指定されるんでしょうか?

発生している問題・エラーメッセージ

デバッグ中に、「中断モードでは入力できません」と出る
セルの個数分はC5に埋め込まれているようです。

該当のソースコード

vba

1Private Sub CommandButton2_Click() 2 3Dim checkBoxCells As Range 4Dim checkBoxCell As Range 5 6'指定した範囲にチェックボックス生成 7Set checkBoxCells = Range("C5:C15,E5:E15,G5:G15,I5:I15") 8checkBoxCells.Select 9 10 For Each checkBoxCell In checkBoxCells 11 Sample_CheckBox1 12 Next 13 14End Sub 15 16Sub Sample_CheckBox1() 17'チェックボックスのみとしてセルの中央に配置する 18 19 Application.ScreenUpdating = False 20 21 With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ 22 Link:=False, DisplayAsIcon:=False) 23 'サイズを縮小しチェックボックスのみ表示 24 .Height = 10 25 .Width = 11 26 '対象セルの中央配置 27 .Top = .Top + (ActiveCell.Height - .Height) / 2 28 .Left = .Left + (ActiveCell.Width - .Width) / 2 29 With .Object 30 'テキスト 31 .Caption = "" 32 '背景色 33 .BackColor = rgbWhite '色定数:白 34 'チェックボックスON=True,OFF=False 35 .Value = True 36 End With 37 End With 38 39 Application.ScreenUpdating = True 40 41End Sub

試したこと

中断モードでは入力できません とか

が似た症状を扱っているように感じましたが、よくわかりませんでした。
シートを変えているのにOLEObjectを使うとまずいと言っているようなのであまり関係ないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ExcelVBA

1Private Sub CommandButton2_Click() 2 Dim chkBoxCells As Range 3 Dim c As Range 4 5 '指定した範囲にチェックボックス生成 6 Set chkBoxCells = Me.Range("C5:C15,E5:E15,G5:G15,I5:I15") 7 chkBoxCells.Select 8 9 For Each c In chkBoxCells 10 c.Activate 11 Next 12End Sub

まずは上記のコードをステップインで実行して、
画面上どう変わるのか確認してください。
基本的にアクティブセルは1つしか存在しません。
どれがアクティブセルか確認できるはずです。

子プロシージャには、はっきりどのセルに対して作業をするのか、
受け渡した方がよいかと思います。

アクティブになっているであろうセルを指定するのは、
他人任せな感じで個人的に嫌いです。
あと、マクロ実行中に間違ってセルをクリックしたら(そんなことが起きたりするのか不明ですが)、
意図しない挙動をする可能性がある気がして怖いです。

動作を確認したら、以下で試してみてください。

ExcelVBA

1Private Sub CommandButton2_Click() 2 'Application.ScreenUpdating = False 3 4 Dim c As Range 5 For Each c In Me.Range("C5:C15,E5:E15,G5:G15,I5:I15").Cells 6 Sample_CheckBox1 c 7 Next 8 9 'Application.ScreenUpdating = True 10End Sub 11 12Private Sub Sample_CheckBox1(ByRef rngTarget As Range) 13'チェックボックスのみとしてセルの中央に配置する 14 With Me.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ 15 Link:=False, DisplayAsIcon:=False) 16 'サイズを縮小しチェックボックスのみ表示 17 .Height = 10 18 .Width = 11 19 '対象セルの中央配置 20 .Top = .Top + (rngTarget.Height - .Height) / 2 21 .Left = .Left + (rngTarget.Width - .Width) / 2 22 With .Object 23 'テキスト 24 .Caption = "" 25 '背景色 26 .BackColor = rgbWhite '色定数:白 27 'チェックボックスON=True,OFF=False 28 .Value = True 29 End With 30 End With 31End Sub

投稿2020/08/21 08:22

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

halmichi

2020/08/21 19:15

ありがとうございます。 デバッグがOLEオブジェクトがあるせいでできないなら、それを取り払って確認するのは思いつきませんでした。 Meの使い方も確かにご指摘の通りで、こちらのほうが確実です。 勉強になりました。
guest

0

ベストアンサー

VBA

1.Top = .Top + (ActiveCell.Height - .Height) / 2 2.Left = .Left + (ActiveCell.Width - .Width) / 2

ActiveCellが指定されています。
この部分をご希望のセルに変えましょう。


これで

VBA

1.Top = checkBoxCell.Top + (checkBoxCell.Height - .Height) / 2 2.Left = checkBoxCell.Left + (checkBoxCell.Width - .Width) / 2

投稿2020/08/21 07:53

編集2020/08/22 00:58
radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

halmichi

2020/08/21 08:16

```VBA For Each checkBoxCell In checkBoxCells Sample_CheckBox1 checkBoxCell Next End Sub Sub Sample_CheckBox1(ByVal checkBoxCell As Range) 'チェックボックスのみとしてセルの中央に配置する Application.ScreenUpdating = False With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False) 'サイズを縮小しチェックボックスのみ表示 .Height = 10 .Width = 11 '対象セルの中央配置 .Top = .Top + (checkBoxCell .Height - .Height) / 2 .Left = .Left + (checkBoxCell .Width - .Width) / 2 ``` ありがとうございます。 上記のように直してみたのですが、やっぱり同じ症状です。 どこかおかしいでしょうか? よろしくお願いいたします。
radames1000

2020/08/21 08:27 編集

追記したものをお試しくださいー
halmichi

2020/08/21 19:11

なるほど、コピペ元の記事に複数チェックボックスが入っていたので、複数選択したセルに一発で入るものと思い込んでいましたが、そうではなかったんですね。 確かに今回作ったものは、いくら対象セルを変えて処理を繰り返しても、選択範囲は変わっていないのでC5に入り続ける形になっていました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問