کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

لوپ در تمام کنترل های یک تب و تغییر رنگ کنترل فعال



فرم Single دارم با تب کنترل حاوی 15تب . تکست باکس و کمبوباکس های مختلفی در هر تب وجود دارد.فرم unbound است ( به جدولی وصل نیست ) . میخواهم از keypress در تب کنترل استفاده کنم تا در تمام کنترل های تمام تب ها حلقه ایجاد کند و رنگ پس زمینه را به سفید تغییر دهد روی تمام کنترل ها جزکنترل فعال ( فوکس گرفته ) که رنگ پس زمینه آن زرد شود.با Screen.ActiveControl می توانم مشخص کنم اما مطمئن نیستم چگونه اینرا در کدهایی بکار بگیرم تا لوپی بین هر کنترل بزنم.
I have a single form with a Tab Control containing 15 tabs. Various Text Boxes and Combo Boxes on each Tab. The Form is unbound. I want to use the KeyPress Event on the Tab Control to loop through all the controls on all tabs and change the background colour to white for all controls except the active control, where I want the background colour to be yellow. I can identify the Screen.ActiveControl but am not sure how to incorporate this into some code that loops through every control. Any bright ideas? Thanks for any help, as I'm new to this!
ایجاد حلقه در تمام کنترل های یک فرم : 


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)


office/typename-function


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 : 


acBoundObjectFrameBound object frame
acCheckBoxCheck box
acComboBoxCombo box
acCommandButtonCommand button
acCustomControlActiveX (custom) control
acImageImage
acLabelLabel
acLineLine
acListBoxList box
acObjectFrameUnbound object frame or chart
acOptionButtonOption button
acOptionGroupOption group
acPagePage
acPageBreakPage break
acRectangleRectangle
acSubformSubform/subreport
acTabCtlTab
acTextBoxText box
acToggleButtonToggle button


TypeName(Ctl)

Ctl.ControlType

If TypeOf Ctl is .....







ساخت باتن دریکی از پیج های تب کنترل


البته این کار فقط در نمای دیزاین امکانپذیر است یعنی باز کردن فرم  در این نما اگر فایل به accde تبدیل شود چون به دیزاین دسترسی نیست عملیات انجام نخواهدشد !!!


در فرمی یک باتن تعبیه و کدهای زیر در آن نوشته شده قبلش یکسری Variable ها مثل frm باید تعریف شود سپس این کد فرمی بنام form2 را باز کرده و باتنی به تب با نام Page4 اضافه میکند البته فرم 2 را باید با OpenForm در نمای دیزاین باز نمائید.


Set frm = Forms(strFrmName) 
frm.RecordSource = ""
'Set Position Value
intDataX = 2000 intDataY = 2000
'Create Button
Set Ctrl = CreateControl(frm.Name, acCommandButton, , "Page4", "", intDataX, intDataY) Ctrl.Caption = "&Back" Ctrl.Name = "btnBack"
'Create Event
Set mdl = frm.Module lngReturn = mdl.CreateEventProc("Click", Ctrl.Name) mdl.InsertLines lngReturn + 1, vbTab & "MsgBox " & Chr(34) & " >>> " & _ Chr(34) & " " & Chr(38) & " " & Chr(34) & "Hello World" & Chr(34)
DoCmd.Restore

Place a Tab control in Form2 and name one of the tabs "Page4"


در FORM2 یک TAB CONTROL قرار داده و نام یکی از تب ها را PAGE4 








رفتن به Tab مورد نظر با استفاده از باتن



انتقال فوکس به تب مورد نظر : 



فرض کنید در پراپرتی شیت تب کنترل خاصیت Style را به None تغییر داده (  که کلا تب ها مشخص نشود ) و کامند باتنی خارج از تب کنترل ایجاد کرده اید ، زمان کلیک کردن روی باتن CmdOrder فوکس به اولین پیج کنترل TabCtl0 میرود. ( تنظیم Style تب براب عدم ظاهر شدن تب ها و ایجاد باتن بخاطر این است که چپ چین است و خاصیت راست چین نداد )


Private Sub cmdOrder_Click()
Me.TabCtl0.Pages(0).SetFocus
End Sub


Me.tabMyTabControl.Pages(0).Visible = False
پنهان کردن اولین تب پیج  
hides the first tab page.


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 Form
Set frmCust = Forms("Customer")
Dim i as Integer
For i = 0 To frmCust.Count - 1
Debug.Print frmCust(i).ControlName
Next
End 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.

















انتخاب تب دوم از تب کنترل



collections in Access are Zero based
form_formname.tabcontrol.pages(1).setfocus 
for second tab

برای رفتن به تب دوم از عبارت بالا استفاده میشود ایندکس از صفر شروع میشود یعنی تب دوم ایندکس یک را گرفته نه دو


انتقال فوکس به کنترل خاصی در تب کنترل


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 تنظیم شده