|
>でも、使った方が楽ということもありますので、ケースバイケース。
モジュールレベルの変数を否定している訳ではありません。
そんなこと言ったらクラスを否定しなければなりません。
標準モジュールのPublic変数を作らないほうが良い と言っています。
>
>こちらの xl2010,xl2013 で、ボタンクリックを、5回ずつ実行。
>1回あたり100個のチェックボックスを生成していて、だんだん遅くはなるんですが
>エラーにはならず、それぞれ、500個のチェックボックスが作られました。
>
これに関しては、私の認識不足がありました。作成するActiveXControlが
アクティブシートでなければ、変数が初期化されませんでした。
こんな手順で初期化が再現されました。
新規ブック(Sheet1 Sheet2 というシートが存在する)にて、
Sheet1にActiveXControlのコマンドボタンを二つ配置してください。
(CommandButton1 CommandButton2)。
標準モジュールに 私が否定しているPublic変数の宣言
Option Explicit
Public Wb As Workbook 'ワークブック
Public Ws1 As Worksheet 'ワークシート
Public Ws2 As Worksheet 'ワークシート
ThisworkBookのモジュールに
Option Explicit
Private Sub Workbook_Open()
Set Wb = Me
Set Ws1 = Wb.Worksheets("Sheet1")
Set Ws2 = Wb.Worksheets("Sheet2")
End Sub
Sheet1のモジュールに
Option Explicit
Private Sub CommandButton1_Click()
Dim x As Long
Dim xx As Long
xx = 5
For x = 1 To xx
'チェックボックスを作成する
With Ws2.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False)
End With
Next x
End Sub
Private Sub CommandButton2_Click()
Dim tctrl As Object
For Each tctrl In Ws2.Shapes
If Left(tctrl.Name, 8) = "CheckBox" Then
Ws2.Shapes(tctrl.Name).Delete
End If
Next
End Sub
と殆ど ぴょんさんが提示されたコードと同じですが、同期がとれるように
再度、記述しておきます。
Sheet2のシートをアクティブにして セルA1を選択してください。
Sheet1のシートをアクティブにしてください。
これを 適当な場所に 変数初期化1.xlsm という名前で保存してください。
一度、このブックを閉じたのち、再度開いてください。
1 Commandbutton2をクリックしてください。
2 Commandbutton1をクリックしてください。
Sheet2にチェックボックスが作成されます。
3 Sheet2をアクティブにしてください。
4 チェックボックスが作成されている事を確認し、この状態で上書き保存を行ってください。
5 保存後に Sheet1をアクティブにしてください。
この1〜5を繰り返してください。何度目かの2で
実行時エラー:91 オブジェクト変数またはWithブロック変数が設定されていません
が発生しました(殆ど2回目の2で発生します)。
|
|