[align=center]لینک کمکی اضافه شد[/align]
با سلام دوستی سوال فرمودند که چطور می شود فرم های سفارشی در VBA ساخت. به این مفهوم که بشود بر اساس نیاز مشتری Control هایی (button, textbox, label) بسازیم.
این فایل رو من خیلی ساده جهت آموزش در مدت کوتاه درست کردم. لذا ممکن است ایراداتی داشته باشد.
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 هست. البته این روش محدودیت هایی رو ایجاد می کنه. اما برای استفاده در ابتدای راه خیلی مفید می باشد:
ابتدا یک شی اما 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 در شیت و سلول ایجادنمایید.
البته روش اون کار فرق می کند.
موفق و پیروز باشد.
با سلام دوستی سوال فرمودند که چطور می شود فرم های سفارشی در VBA ساخت. به این مفهوم که بشود بر اساس نیاز مشتری Control هایی (button, textbox, label) بسازیم.
نوشته اصلی توسط دوستی
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 هست. البته این روش محدودیت هایی رو ایجاد می کنه. اما برای استفاده در ابتدای راه خیلی مفید می باشد:
ابتدا یک شی اما 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 در شیت و سلول ایجادنمایید.
البته روش اون کار فرق می کند.
موفق و پیروز باشد.
کامنت