2017-04-10 6 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 

생성 버튼을 하나 이상있는 경우 문제는이다, 코드 만 작동

마지막 버튼이 생성되었습니다. 첫 번째와 두 번째 버튼을 클릭하면 아무 일도 없었습니다.

+0

'RevCounter'가 선언되고, 채워지고, 호출 될 때 그 값은 무엇입니까? –

+0

클래스 이름은 무엇입니까? 귀하의'클래스'코드에서 최상위'Public WithEvents CmdEvents As MSForms.CommandButton'에 추가해야합니다. 그런 다음'Sub'에서'Dim ctlTXT As As MSForms.CommandButton'을 사용하여 정의해야합니다. –

+0

@MarkFitzgerald RevCounter is 다른 모듈에서 공개로 선언되었습니다. 호출 할 때 사용할 수있는 값의 합계는 –

답변

2

각 CommandButton에는 이름이 포함 된 고유 한 이벤트 프로 시저가 필요합니다. 이 절차를 만들려면 해커가 그 문을 통해 컴퓨터를 제어 할 수 있기 때문에 매우 낙심 한 VBA 프로젝트에 액세스해야합니다. 따라서 문제를 처리 할 수있는 두 가지 방법이 있습니다.

  1. 필요할 수있는만큼 많은 CommandButton을 만듭니다. 각 CommandButton에는 고유 한 이벤트 프로 시저가 있습니다. 직접적으로 필요하지 않은 버튼을 숨기고 코드가 현재 생성 한 버튼의 위치를 ​​변경합니다.
  2. 이벤트 프로 시저가 하나 뿐인 버튼 하나만 만들고 캡션 또는 태그 속성에 다른 값을 지정하십시오. 그런 다음 단추를 클릭 할 때 캡션 또는 태그의 내용에 따라 다른 작업을 수행하도록 이벤트 프로 시저를 프로그래밍하십시오.
+0

솔루션을 제공해 주셔서 감사합니다. 첫 번째 옵션을 따르는 것은 복잡 할 것입니다. 사용자에게 의존 할 것이므로 얼마나 많은 것을 만들어야할지 모르기 때문입니다. 그 지금 일하고있어. –