|
For Each Ctl In Me.Controls
If Ctl.ControlType=(acTextBox Or acComboBox) Then
'DO SomeThing
Next
'If Ctl.ControlType=acTextBox Or Ctl.ControlType=acComboBox
لوپ در کنترلهای یک سابفرم :
در خط اول در کنترل های فرم می گردد چنانچه TypeName آن SubForm بود میرود به Form آن و تمام کنترل ها را در پنجره immidiate window محیط Vba نمایش میدهد ( Ctrl+G)
For Each ctl In frm.Controls
If TypeName(ctl) = "SubForm" Then
Debug.Print ctl.Name & " is a SubForm"
For Each ctlSub in ctl.Form.Controls
Debug.Print ctlSub.Name
Next
End If
Next
حال در جواب سوال بعد از ایجاد لوپ
Ctl.BackColor = IIf(Ctl.Name = Screen.ActiveControl.Name, 8454143, 16777215)
البته در کنترل تب ، تب هایی وجود دارد و هر تب فقط یک پیج دارد رفرنس به تب خاص و پیج حاوی کنترل ها ( فرضا نام تب کنترل TabCtl0 باشد.)
iTabPage=0 پیج ایندکس تب اول صفر است
For Each Ctl In TabCtl0.Pages(iTabPage).Controls
'iTabPage=iif(iTabPage>15,0,iTabPage=iTabPage+1)
For i=0 To TabCtl0.Pages.Count -1 لوپ در پیج ها
ControlType Property :
acBoundObjectFrame | Bound object frame |
acCheckBox | Check box |
acComboBox | Combo box |
acCommandButton | Command button |
acCustomControl | ActiveX (custom) control |
acImage | Image |
acLabel | Label |
acLine | Line |
acListBox | List box |
acObjectFrame | Unbound object frame or chart |
acOptionButton | Option button |
acOptionGroup | Option group |
acPage | Page |
acPageBreak | Page break |
acRectangle | Rectangle |
acSubform | Subform/subreport |
acTabCtl | Tab |
acTextBox | Text box |
acToggleButton | Toggle button |
TypeName(Ctl)
Ctl.ControlType
If TypeOf Ctl is .....
البته این کار فقط در نمای دیزاین امکانپذیر است یعنی باز کردن فرم در این نما اگر فایل به accde تبدیل شود چون به دیزاین دسترسی نیست عملیات انجام نخواهدشد !!!
در فرمی یک باتن تعبیه و کدهای زیر در آن نوشته شده قبلش یکسری Variable ها مثل frm باید تعریف شود سپس این کد فرمی بنام form2 را باز کرده و باتنی به تب با نام Page4 اضافه میکند البته فرم 2 را باید با OpenForm در نمای دیزاین باز نمائید.
در FORM2 یک TAB CONTROL قرار داده و نام یکی از تب ها را PAGE4
انتقال فوکس به تب مورد نظر :
فرض کنید در پراپرتی شیت تب کنترل خاصیت Style را به None تغییر داده ( که کلا تب ها مشخص نشود ) و کامند باتنی خارج از تب کنترل ایجاد کرده اید ، زمان کلیک کردن روی باتن CmdOrder فوکس به اولین پیج کنترل TabCtl0 میرود. ( تنظیم Style تب براب عدم ظاهر شدن تب ها و ایجاد باتن بخاطر این است که چپ چین است و خاصیت راست چین نداد )
Private Sub cmdOrder_Click()Me.TabCtl0.Pages(0).SetFocusEnd Sub
Tabcontrol.Style Properties :
ظاهر شدن باتن بجای تب با تنظیم کردن خاصیت Style به یک ، البته در برگه پرارتی تب کنترل ( Property Sheet آن ) می توان خاصیت را انتخاب و تنظیم نمود احتیاجی به کد نویسی نیست
Forms("Mailing List").Controls("TabCtl1").Style = 1
در تصویر زیر :
باتن Main نامش butMain است
تب کنترل نامش tabMenu است
Style مربوط به خاصیت تب کنترل است که Property Sheet آن در نمای دیزاین قابل دسترسی است
هرکدام از تب ها نامگذاری شده و هر کدام از پیج ها PageIndex دارد . Page1 در اینجا pageMain نامگذاری شده در رویه زیر که مربوط به باتن Main در تصویر است گفته شده به تب pageMain برود (Value=0 , PageIndex=0 ) طبق شکل تب pageMain که قبلا page1 نامیده شده در تب کنترل ولیوی صفر دارد و پیج ایندکس تب هم صفر است در نتیجه به تب صفر میرود که همان ابتدا است.
Private Sub ButMain_Click()
tabMenu.Value=pageMain.PageIndex
End Sub
پراپرتی Value یک TabControl حاوی شماره ایندکسی از آبجکت Page جاری است.یک آبجکت Page برای هر Tab در TabControl وجود دارد . اولین آبجکت Page همیشه ایندکس 0 دارد و دومی 1 و ادامه دارد ( عدد صحیح و ترتیبی )
پراپرتی PageIndex بین اعداد صحیح 0 و پراپرتی Count کالکشن Pages منهای یک تنظیم میشود.این پراپرتی در هر View می تواند تنظیم شود.تغییرمقدارپراپرتی PageIndex موقعیت آبجکت Page در کالکشن یا مجموعه Pages را تغییر و باعث تغییر آشکارا و قابل دید ترتیب پیج ها روی تب کنترل می شود.( منظور زمانیکه ست کنید از یک پیج به پیج دیگری منتقل یا Move می شوید !!!)
For i=0 To Tabctl0.Pages.Count-1
Msgbox Tabctl0.Pages(i).Name & Chr(34) _
Tabctl0.Pages(i).PageIndex
Next
مثال زیر پیج با نام Notes روی تب کنترل Information در فرم Order Entry را به اولین پیج انتقال میدهد
Forms("Order Entry").Controls("Information").Pages("Notes").PageIndex = 0
CommandButton.TabIndex Property :
تعیین موقعیت کنترل در Tab Order فرم ( محل چیدمان کنترل ها ) . عدد صحیحی است بین صفر تا تعداد کل کنترل ها منهای یک ! بطور مثال اگر فرمی سه کنترل که هر کدام دارای پراپرتی TabIndex است ، باشد مقادیر معتبر برای این پراپرتی 0 1 و 2
تنظیم پراپرتی TabIndex به عدد صحیحی کمتر از صفر خطایی را تولید می کند.
اگر اعداد پراپرتی TabIndex کنترل ها ( هر کنترلی که این خاصیت را دارد ) تغییر دهید ترتیب انتقال روی آنها وقتی کلید Tab را می فشرید تغییر میکند. امتحان بنمائید!!! و در نظرات بنویسید استفاده خواهند برد.
Control.Properties Property :
شئ مجموعه پراپرتی ها مجموعه ای از تمام پراپرتی های مرتبط به یک کنترل است که میتوان به اعضاء تکی مجموعه با استفاده از ایندکس شئ یا عبارت رشته ای که نام شئ عضو است ارجاع داد.
اولین شئ عضو در مجموعه مقدار ایندکس صفر و تعداد کل آن در مجموعه مقداری است از پراپرتی Count مجموعه پراپرتی ها منهای یک.
For i=0 To Controls("Button1").Properties.Count-1
Debug.Print Controls("Button1").Properties(i).Name
Next
اگر کد بالا اشتباه بود فرم و کنترل را تنظیم کنید به متغیری و
For Each Prp In Ctl.Properties
Debug.Print Prp.Name
Next
نمایش کنترل ها در فرم :
Function ShowControls()Dim frmCust as FormSet frmCust = Forms("Customer")Dim i as IntegerFor i = 0 To frmCust.Count - 1Debug.Print frmCust(i).ControlNameNextEnd Function
البته پراپرتی Count در فرم برای شمارش فرم های باز است .
صرفا جهت مطالعه :
intForms = Forms.Count ' Number of open forms.
If intForms > 0 Then
For intI = 0 To intForms - 1
Set frm = Forms(intI)
Debug.Print frm.Name
intControls = frm.Count
If intControls > 0 Then
For intJ = 0 To intControls - 1
Debug.Print vbTab; frm(intJ).Name
Next intJ
و بقیه را خودتان حدس بزنید !!!
CurrentProject.allforms.count
تماما از سایت های خارجی استخراج و کپی شده امتحان کنید چنانچه اشتباه بود اصلاح شده در نظرات قید گردد
refer-to-tab-control-objects-in-vba
انتخاب Tab موردنظر Tabctl.Value=1
در رویداد Onchange که زمان تغییر تب پیج ها اتفاق می افتد در کد زیر کپشن فرم به کپشن پیج تغییر می یابد و با Select Case و پراپرتی Name پیج چنانچه نام داخل Case بود کاری را انجام دهد .
Private Sub tabMain_Change()
On Error GoTo ErrHandler
'get a reference to the active page
Dim pg As Page
Set pg = tabMain.Pages(tabMain.Value)
'update the form's caption
Me.Caption = "Customer Orders - " & pg.Caption
'take action for specific pages
With pg
Select Case .Name
Case "Page1"
'do stuff
Case "Page2"
'do stuff
Case "Page3"
'do stuff
Case "Page4"
'do stuff
End Select
End With
ExitHere:
On Error Resume Next
Set pg = Nothing
Exit SubErrHandler:
Debug.Print Err, Err.Description
Resume ExitHere
End Sub
The Change event occurs when the contents of a text box or the text portion of a combo box changes. It also occurs when you move from one page to another page in a tab control.
With Your_Form
If !tabControl.Pages(!tabControl.Value).Tag = "Your tag" then
'Do Something
End if
End With
The .Value
property of a TabControl returns the index (zero-based) of the current page. So, if I have a TabControl named TabCtl14
that contains two pages, FirstPage
and SecondPage
, then the code...
Private Sub TabCtl14_Click() If Me.TabCtl14.Value = 1 Then MsgBox "SecondPage was clicked." End If End Sub
...displays the MsgBox whenever I click the "SecondPage" tab in the TabControl.
Private Sub YourTabbedControlName_Change() Select Case YourTabbedControlName Case 0 'First Page FirstPageButton.SetFocus Case 1 'Second page SecondPageButton.SetFocus Case 2 'Third page ThirdPageButton.SetFocus End Select End Sub
در رویداد Change تب کنترل که به نام YourTabbedControlName است انتخاب هایی صورت گرفته با Select Case ( در زمان رفتن به فرم یا تب خاصی تعدادی از رویدادها اتومات اجرا میشوند مثل رویداد Change و Click) طبق کد بالا چنانچه در پیج ها جابجاشویم حین این جابجایی فوکس به کنترل خاصی در آن پیج منتقل میشود وقتی به پیج یک می رویم یا بعبارتی پیج یک را انتخاب می کنیم کنترل نوع باتن به اسم FirstPageButton فوکس می گیرد.
Msgbox TabControl1.Pages.Count
با عبارت بالا تعداد پیج های موجود در تب کنترل 1 نمایش داده میشود
TabControl1.Pages(0).Caption = "First Page"
با عبارت بالا خاصیت کپشن پیج با ایندکس صفر در کنترل TabControl1 به First Page تنظیم شده