قم بتعيين وظيفة VBA قيد التنقل على زر تم إنشاؤه ديناميكيا في Excel UserForm

StackOverflow https://stackoverflow.com/questions/566770

سؤال

أقوم بإنشاء أزرار ديناميكيا على excel UserForm مع التعليمات البرمجية التالية:

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
    .Caption = "XYZ"
    .name = "AButton"
    .Font.Bold = True
    .ForeColor = &HFF&
    ... blah blah blah
End With

أرغب في تعيين وظيفة ليتم تشغيلها عند النقر فوق هذه الأزرار، لكن لا يمكنني العثور على طريقة واضحة للقيام بذلك نظرا لعدم وجود عقار كجزء من الزر نفسه.

هل هناك طريقة للقيام بذلك باستخدام المصطلح أعلاه؟ يجب أن أذهب حول هذا الشيء كله بطريقة مختلفة؟

هل كانت مفيدة؟

المحلول

تحتاج إلى إنشاء معالجات التعليمات البرمجية / الأحداث بشكل حيوي لكل زر.

يستغرق الأمر قليلا - انظر هنا: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html.

قد تكون هناك طريقة أفضل لإنشاء مجموعة من الأزرار في النموذج (كما تعتقد أنك ستحتاج) في وقت مبكر. إنشاء رمز معالج الأحداث كذلك. اجعلهم جميعا مخفيون في البداية.

ثم عندما يفتح النموذج الخاص بك، يمكنك تغيير التسميات التوضيحية في الزر، وجعلها مرئية وتحريكها. سيتم ربط رمز الحدث الذي قمت بإنشائه في البداية بالأزرار المنشط كما هو متوقع.

نصائح أخرى

لإضافة حدث تحكم ديناميكيا في نموذج Excel؛ تحتاج إلى أولا إضافة الحدث (الأحداث) في وحدة نمطية للفئة. على سبيل المثال، سأضيف وحدة نمطية باسم Clstest مع حدث واحد، BTN_Click ()

    '#### CLASS NAMED clsTEST
    Public WithEvents btn As MSForms.CommandButton
    Public frm As UserForm

    Dim iCount As Long

    Private Sub btn_Click()

    iCount = IIf(iCount < 1, 1, iCount + 1)
    btn.Caption = "Count " & Str(iCount)

End Sub
'### END CLASS

كما ترون، فإن الشيء الوحيد الذي سيقوم به هو تعيين التسمية التوضيحية على الزر إلى ثم عدد المرات التيقر بها. بعد ذلك، أدخل رمز النموذج ما يلي:

    Dim mColButtons As New Collection    '## SET A NEW COLLECTION

    Private Sub UserForm_Activate()
    '
    Dim btnEvent As clsTEST
    Dim ctl As MSForms.Control
    '
    Set ctl = Me.Controls.Add("Forms.CommandButton.1")
    '
    With ctl
    .Caption = "XYZ"
    .Name = "AButton"
    END With
    '
    Set btnEvent = new clsTEST   
    Set btnEvent.btn = ctl
    set btnEvent.frm = Me
    '
    mColButtons.add btnEvent
    'End Sub

عند تنشيط النموذج، سيتم إنشاء زر. في كل مرة تقوم فيها النقر فوق الزر سوف تتغير التسمية التوضيحية.

يجب أن يكون الرمز أدناه يعمل

Dim NewButton As OLEObject
Dim CodeModule As Object

Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
    Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
Sub Oval1_Click()
    file = ActiveWorkbook.Name
    Set Output = Workbooks.Add()
    ActiveWorkbook.SaveAs Filename:="Try.xls"        
    Sheets(1).Select        
    ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
    ActiveSheet.Buttons.Text = "DATA"      
    ActiveSheet.Shapes("Button 1").Select
    Selection.OnAction = "Book1.xlsm!data_Click"
End Sub

Sub data_Click()      
    MsgBox "you have clicked me"       
    ActiveSheet.DrawingObjects.Delete        
End Sub

لقد كنت أبحث في هذا أيضا. يبدو أنه يمكنك تشغيل ماكرو باستخدام الخاصية OnClick:

Command1.OnClick = "Macro1"

ثم قم بإنشاء ماكرو بهذا الاسم الذي يدير الوظيفة المطلوبة. هذا هو الاختراق حول هذا حتى أجد شيئا أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top