2017-04-10 16 views
0

実行時に作成されるCommandButtonのコードを作成する必要があります。このコマンドボタンは、ユーザーデータに基づいているため動的です。実行時に作成されたコマンドボタンのコードが機能しません[Excel VBA]

User_Fromコード

Private Sub UserForm_Activate() 

Dim ctlTXT As Control 

For RevNo = 1 To RevCounter 

    Set ctlTXT = Me.Controls.Add("Forms.CommandButton.1") 

    ctlTXT.name = RevNo 
    ctlTXT.Caption = Sheet4.Range("D" & RevNo + 4).value 
    ctlTXT.Left = 18 
    ctlTXT.Height = 18: ctlTXT.Width = 72 
    ctlTXT.Top = 15 + ((RevNo - 1) * 25)  
Next 

Me.Height = (RevNo * 17) + 50 

ReDim Preserve cmdArray(1 To RevNo) 
Set cmdArray(RevNo).CmdEvents = ctlTXT 
Set ctlTXT = Nothing 

End Sub 

クラスモジュールのコード

Private Sub CmdEvents_Click() 

Dim i As Integer 

i = CmdEvents.name 

RevisionFormPrevious.LblResponsible.Caption = Sheet4.Range("C" & i +4).value 
RevisionFormPrevious.LblEdition.Caption = Sheet4.Range("D" & i + 4).value 
RevisionFormPrevious.LblTelNo.Caption = Sheet4.Range("E" & i + 4).value 
RevisionFormPrevious.LblFeatures.Caption = Sheet4.Range("D" & i + 4).value 
RevisionFormPrevious.Features.value = Sheet4.Range("F" & i + 4).value 

Load RevisionFormPrevious 
RevisionFormPrevious.Show 

End Sub 

問題が作成した複数のボタンがある場合は、コードが唯一の作品であり、最後に作成されたボタン。最初と2番目のボタンがクリックされたとき、何も起こらなかった。

+0

ここで、 'RevCounter'が宣言され、読み込まれ、呼び出されたときの値は何ですか? –

+0

あなたのクラスの名前は何ですか?あなたの 'Class'コードでは、' Public WithEvents CmdEvents As MSForms.CommandButton'を追加する必要があります。次に 'Sub'で' Dim ctlTXT As As MSForms.CommandButton'を使用して定義する必要があります。 –

+0

@MarkFitzgerald RevCounter is別のモジュールでパブリックとして宣言されています。呼び出し時の値は、使用可能なリビジョンの合計数です。 –

答えて

2

各CommandButtonには、名前を含む独自のイベントプロシージャが必要です。この手順を作成するには、VBAプロジェクトにアクセスする必要があります。このプロジェクトは、ハッカーがそのドアを介してコンピュータを制御できるため、非常に落胆します。したがって、問題を処理するには2つの方法があります。

  1. 必要に応じて、独自のイベントプロシージャを持つCommandButtonを必要な数だけ作成します。直ちに必要としないボタンを非表示にして、コードが現在それらを作成する場所に再配置します。
  2. イベントプロシージャが1つのみのボタンを1つだけ作成し、そのキャプションまたはおそらくタグプロパティに異なる値を割り当てます。次に、イベントプロシージャをプログラミングして、ボタンがクリックされたときのキャプションまたはタグの内容に応じて、さまざまな処理を行います。
+0

ありがとうございます。最初のオプションに従うことは複雑になるでしょう。私は、ユーザーに依存するので、作成する必要がある数がわからないからです。今働いている。 –

関連する問題