Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
シート上に配置したActiveXコントロール
投稿日時: 19/09/21 13:42:43
投稿者: S.Kos

こんにちは、みなさま
 
下記コードは、yPosとxPosで指定するセル位置に、ActiveXのラジオボタンを配置します
  for yPos = stRow to edRow
    Set Rng = Range(Cells(yPos, xPos), Cells(yPos, xPos + 1))
    wid = Rng.Width * 5#: hei = Rng.Height
    top = Rng.top: lef = Rng.Left + 10:
     
    Set NewOptionButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _
                          DisplayAsIcon:=False, Left:=lef, top:=top, Width:=wid, Height:=hei).Object
     
    With NewOptionButton
      .Font.Size = 12
      .Caption = "なんちゃらかんちゃら"
      .LinkedCell = "AG" & CStr(yPos)
    End With
  next
 
次に、下記コードでそのラジオボタンを削除します。
  For Each obj In OLEObjects
    If TypeOf obj.Object Is MSForms.OptionButton Then obj.Delete
    If TypeOf obj.Object Is MSForms.CheckBox Then obj.Delete
  Next
 
この削除コードを「書く場所」について、ご教示ください。
1 ラジオボタンを配置したシートにPrivateで書けば、問題無く動作するように思います。
2 標準モジュールにPublicで書くと、5回に2回くらいの割合でEXCELが固まります。
3 このシートのWorksheet_Deactivate内に書いても、5回に2回はアウトです。
 
要は、他のシートがアクティブになるとき、このシートに配置したラジオボタンを削除したい・・・
 
シート上に配置したActiveXコントロール(ラジオボタン)制御のアレコレをご教示いただければ幸いです。

回答
投稿日時: 19/09/22 13:43:56
投稿者: simple

Excelのおかしな振る舞いについて議論するのであれば、
・変数をきちんと宣言した
・Sub から End Subまでを書いたもの
をきちんと提示したほうがよいと思いますね。
標準モジュールに書く場合と、シートモジュールに書く場合と
両方きちんと提示したほうがよいでしょう。
(OLEObjectsなんて、標準モジュールだったら変数とみなされて、エラーになりますしね。)
 
# 実はそうではなくて、こう書いていました、ということになりそうなので、
# 誰もそうしたことには時間を使いたくない、というのが普通のひとの感覚です。

回答
投稿日時: 19/09/22 17:35:33
投稿者: WinArrow
投稿者のウェブサイトに移動

参考例
 
標準モジュールに記述した場合
こんな書き方もあるという例です。
Sub test()
Dim obj As OLEObject
 
    For Each obj In Sheets(1).OLEObjects
        If obj.Object.DisplayStyle = fmDisplayStyleOptionButton Then obj.Delete
        If obj.Object.DisplayStyle = fmDisplayStyleCheckBox Then obj.Delete
    Next
End Sub

投稿日時: 19/09/23 15:34:28
投稿者: S.Kos

simpleさん、 WinArrowさん、ご教示のほどありがとうございました。
 
当面の問題は、ひょんなこと(?)で解決しました。
セルとのリンク、つまり .LinkedCell = "AG" & CStr(yPos) を無くし、コントロールの値に直接触ることで、クリアできました。