2

私はこの短いコードを持っています

Public n As Integer

Public Sub Foo()

    For i = 0 To 4

        MyModule.n = MyModule.n + 1

    Next i

End Sub

これは、という名前のモジュールで定義されていMyModuleます。このコードは期待どおりに機能しています。初めて実行した後の「MyModule.n」の値は5です。2回目の実行後の値は10になります。

コードを拡張してCommandButtonを追加し、それを作業シートに配置すると、グローバル変数は次MyModule.nの新しい呼び出しごとにその値を失いますFoo

Public n As Integer

Public Sub Foo()

    Dim btn As OLEObject

    For i = 0 To 4

        Set btn = Worksheets("Aufträge").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
        Left:=122, Top:=321, Width:=30, Height:=30)

        MyModule.n = MyModule.n + 1

    Next i

End Sub

コマンドボタンが正しく作成および配置されているため、コードは機能しているようです。2番目のコードフラグメントを実行すると、グローバル変数がリセットされるのはなぜですか?

さらに、2番目のコードフラグメントのForループの後または内部にブレークポイントを配置することはできません。メッセージが表示されますCan't enter break mode at this time

4

2 に答える 2

9

私が行った検索と私の結論に基づくと、ワークシートに動的にコントロールを追加して変数の状態を保持することはできないということです。

その理由は次のとおりです。ボタンを追加すると、シートが強制的にデザインモードになり、変数がリセットされます。

サポートリンク

  1. http://www.pcreview.co.uk/forums/dynamically-adding-activex-controls-via-vba-kills-global-vba-heap-t3763287p2.html

  2. https://web.archive.org/web/20101215134333/http://support.microsoft.com/kb/231089 (元々は//support.microsoft.com/kb/231089)

于 2012-09-02T17:04:05.587 に答える
0

最初の例では、fornextループを使用する必要はありません。なぜあなたはそれをしませんか:

Public n As Integer

Public Sub Foo()

    MyModule.n = 5


End Sub

これにより、1回の操作で処理が実行されます。

2番目の例では、ボタンを1つ追加せず、5つ追加します。「次へ」のヘルプを確認してください。

于 2012-09-02T16:09:35.830 に答える