[align=center][size=x-large]لینک کمکی اضافه شد[/size][/align]

با سلام دوستی سوال فرمودند که چطور می شود فرم های سفارشی در VBA ساخت. به این مفهوم که بشود بر اساس نیاز مشتری Control هایی (button, textbox, label) بسازیم.

نقل قول نوشته اصلی توسط دوستی
سلام آقای داوری.
چطور میشه از طریق کد در Form،یک کنترل(مثل:label,textbox,...)به فرم اضافه کرد.
[size=large]این فایل رو من خیلی ساده جهت آموزش در مدت کوتاه درست کردم. لذا ممکن است ایراداتی داشته باشد.[/size]

http://www.mediafire.com/file/28v0tpepm2v8bhv/CustomizeControls_with_VBA.xlsm

لینک کمکی:
http://uplod.ir/gax3gakjje3h/CustomizeControls_with_VBA.zip.htm

در فایل بالا دو label ایجاد شده است. یک textbox و دو button

برای ایجاد label ها از کد های زیر استفاده کردم:

Dim label As MSForms.label
Set label = Me.Controls.Add("Forms.Label.1", "myLabe", True)
With label
.Caption = "write some text here:"
.Width = 60
.Height = 25
.Top = 110
.Left = 10
.ZOrder (0)
End With

Dim label2 As MSForms.label
Set label2 = Me.Controls.Add("Forms.Label.1", "myLabel2", True)
With label2
.Caption = "then click these two buttons"
.Width = 200
.Height = 20
.Top = 140
.Left = 10
.ZOrder (0)
End With



برای تولید textbox از کد زیر:

Dim mytextbox As Control
Set mytextbox = Me.Controls.Add("Forms.TextBox.1", "MyTextBox1", True)
With mytextbox
.Width = 150
.Height = 25
.Top = 110
.Left = 70
.ZOrder (0)
End With


دو نوع button درست کردم: اولی withoutevent
Dim mybutton As Control
Set mybutton = Me.Controls.Add("Forms.CommandButton.1", "MyButton1", True)

With mybutton
.Caption = "without events"
.Width = 200
.Height = 25
.Top = 160
.Left = 10
.ZOrder (0)
End With

اگر همین طور ساده button و یا هر control دیگری رو ایجاد کنید. این کنترل event نخواهد داشت. به این مفهوم که شما قادر خواهید بود از امکانات اون استفاده کنید اما event نخواهد داشت. یعنی تابعی به نام button_click() وجود نخواهد داشت. در واقع وقتی کنترلی به این روش درست می کنید باید event اون رو هم دستی ایجاد کنید.

دو راه برای رفع این مشکل وجود دارد.
راه سخت تر:
برای ایجاد event به صورتی دستی (manual) باید از یک event در control مادر (که userform هست) استفاده کنید. مثلا می خواهید رویداد click بسازید. می توانید از رویداد click یوزر فرم استفاده کنید. فقط باید شرطی بگذارید که مکان موس رو ارزیابی کنه در لحظه کلیک و اگر مکان موس روی مقتصات button بود دستورات مورد نظر رو اجرا کنه. در صورت تمایل بیشتر توضیح می دهم.


راه ساده تر
البته راه آسون تر استفاده از control های withevent هست. [size=medium]البته این روش محدودیت هایی رو ایجاد می کنه.[/size] اما برای استفاده در ابتدای راه خیلی مفید می باشد:

ابتدا یک شی اما private خارج از هر گونه تابعی در یوزر فرم ایجاد می کنید با این دستور:
Private WithEvents mybut As MSForms.CommandButton

سپس در تابعی که control ها رو میسازید این کد را اضافه می کنید.
Set mybut = Me.Controls.Add("Forms.CommandButton.1", "mybut", True)

With mybut
.Caption = "with events"
.Width = 200
.Height = 25
.Top = 190
.Left = 10
.ZOrder (0)
End With


به این صورت می توانید event click این button رو فرآخوانی کنید:

Private Sub mybut_Click()
MsgBox ("you wrote '" + Me.Controls("MyTextBox1") + "' in the textbox above.")
End Sub

توجه فرمایید که Me.Controls("MyTextBox1") مقدار داخل textboxی که از طریق VBA ایجاد کرده اید رو برای شما بر میگرداند.

همان طور که گفتم این روش محدودیت هایی رو ایجاد می کنه:
به این مفهوم که باید شما برای هر control یک دستور جداگانه private withevents بنویسید که این در صورتی که تعداد control ها مشخص نباشد و یا به هر دلیلی نشود این کار رو انجام داد محدودیت اساسی است. دیگر محدودیت هایی نیز دارد.



همچینی می توانید button در شیت و سلول ایجادنمایید.
البته روش اون کار فرق می کند.

موفق و پیروز باشد.
اخطار: این یک موضوع قدیمی است
به دلیل قدیمی بودن موضوع، ممکن است برخی فایل های ضمیمه به درستی کار نکنند. لطفا در صورت عدم ضرورت، از بالا آوردن موضوعات قدیمی خودداری نمایید.