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

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

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

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

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

شماره آیتم انتخاب شده در لیست باکس کمبو با ویژگی ListIndex




-برگرفته از داکیومنت سایت Office 



ویژگی ListIndex برای تعیین اینکه کدام آیتم در کمبوباکس انتخاب شده بکار می رود.



ویژگی ListIndex عدد صحیحی بین 0 تا تعداد کلی آیتم ها در لیست باکس یا کمبوباکس منهای یک است. مایکروسافت اکسس مقداراین  ویژگی را هنگام انتخاب آیتم در لیست باکس یا قسمت لیست باکسِ کمبوباکس تنظیم می کند.مقدار ویژگی ListIndex آیتم اول در یک لیست 0 است و مقدار دومی یک و همین طور ...


این ویژگی فقط با استفاده از ماکرو یا ویژوال بیسیک در دسترس است.می توان این ویژگی را فقط در نمای فرم ( Form View ) و نمای برگه داده ( DataSheet )  خواند.این ویژگی فقط خواندنی است و در دیگر نماها ( Views ) موجود نیست !!! 


مقدار ویژگی ListIndex نیز با تنظیم ویژگی BoundColumn روی 0 برای کمبو یا لیست باکس ، موجود است .اگر ویژگی BoundColumn روی صفر تنظیم شود فیلد جدول زیرینی که     به کمبوباکس یا لیست باکس آن محدود شده است ، دارای همان مقدار تنظیم ویژگی ListIndex است.


لیست باکس ها همچنین ویژگی MultiSelect دارند که به کاربر اجازه انتخاب چند آیتم از کنترل را می دهند. زمانیکه چندین انتخاب در یک لیست باکس انجام شوند ، با استفاده از ویژگی Selected کنترل می توان تعیین کرد کدام آیتم ها انتخاب شده اند. ویژگی Selected یک آرایه ای از مقادیر از صفر تا مقدار ویژگی ListCount منهای یک است . برای هر آیتم در لیست باکس ، چنانچه آیتم در حالت انتخاب باشد  ویژگی Selected ، ترو ( True )  است و اگر نباشد False ( عدد صفر )


Combobox1.Selected=Not Combobox1.Selected


مجموعه ItemSelected همچنین روشی برای دسترسی دادا در ردیف های انتخاب شده یک لیست باکس یا کمبو باکس را فراهم می نماید.


از مجموعه ItemSelected  همراه با ویژگی Column یا ItemData برای بازیابی داده ها از ردیف های انتخاب شده در یک لیست یا کمبو باکس استفاده نُمائید .برای فهرست یا لیست مجموعه ItemSelected می توان از عبارت  For Each ...Next استفاده کرد.


برای مثال ، اگر لیست باکسی از کارمندان در فرم دارید ، می توان مجموعه ItemSelected فهرست کرد و از ویژگی ItemData کنترل برای برگرداندن مقدار ستون محدود شده برای هر ردیف انتخاب شده در لیست باکس استفاده کرد.

برای فعال کردن چند انتخابی ردیف ها در یک لیست باکس ، ویژگی MultiSrlect را به Simple یا Extended تنظیم کنید.

مجموعه ItemSelected دو ویژگی Count و Item دارد بدون هیچ مِتُدی


برای انتخاب اولین آیتم در لیست باکس در یکی از رویدادها : 

Me.ComboBox1.ItemData(0)



Refer to the third column in your combo box. Column numbering is zero-based.


Combo1.Column(2)





۲۴ اسفند ۱۴۰۱ در تعقیب و گریز پلیس و قاچاقچیان در البرز : 

این مرکز اعلام کرد: مأموران برای توقف خودرو اقدام به تیراندازی می‌کنند که در حین تیراندازی 2 تیر اسلحه به طور سهوی به یک زن و یک دختر اصابت کرده که سریعاً پس از این حادثه به مرکز درمانی منتقل می‌شوند.






















persian-dance-azarahang













اضافه کردن All به کمبو باکس



Sub GetComboBoxList()
Dim strList, strSQL As String

strList = "<All>;"
With cboState
With CurrentDb.OpenRecordset(.RowSource)
Do Until .EOF
strList = strList & !State & ";"
.MoveNext
Loop
End With
.RowSourceType = "Value List"
.RowSource = strList
End With
End Sub

در کد بالا از پراپرتی RowSourceType آبجکت کمبو باکس  برای باز شدن در RecordSet استفاده شده ، در رکوردست لوپ زده و گفته تا زمانیکه به انتهای فایل نرسیده All و مقادیر داخل فیلد State را در StrList موقتا ذخیره کند ( چون پابلیک تعریف نشده  فقط در همین رویه استفاده می شود و فرمان که تمام شد از بین میرود) و در آخر RowSource  شده StrList 


البته با union query هم می توان All را با آیتم های کمبو باکس همراه کرد ، fieldtobedataforcombo نام فیلدی که رکوردها یش باید در کمبو نمایش داده شوند.


Cbo1.RowSource="

Select distinct fieldtobedataforcombo from table1 

Union

Select "ALL" 

Group by fieldtobedataforcombo

Order by fieldtobedataforcombo" 

Cbo1.RowSourceType="Table/Query"







MultiSelection Microsoft Access



ComboBox.ItemData property (Access) :

expression.ItemData (Index)

پراپرتی ItemData داده در ستون باند شده برای ردیف مشخص شده در یک کمبو باکس را بر می گرداند. ایندکس از صفر شروع میشود

با استفاده از مجموعه ItemSelected می توانید تعیین کنید که کدام ردیف یا ردیف ها در لیست باکس آن انتخاب شده 

باید پراپرتی MultiSelect لیست یاکس به Simple یا Extended تنظیم شود تا کاربر قادر به انتخاب بیشتر از یک ردیف باشد.

از پراپرتی Column هم می توانید استفاده کنید که داده کدام ستون و ردیف برگردانده شود.


ListBox.ItemsSelected property (Access) :

مجموعه ItemSelected دو پراپرتی Count و Item دارد بدون داشتن هیچ متدی البته



Dim frm As Form, ctl As Control
Dim varItm As Variant
Set frm = Forms!Contacts
Set ctl = frm!Names
For Each varItm In ctl.ItemsSelected
Debug.Print ctl.ItemData(varItm)
Next varItm


مثال بالا مقدار باند کالمن هر ردیف انتخاب شده را چاپ میکند در پنجره immidiate window


مثال زیر باز شدن گزارش با شرط خاصی مشخص شده، یک لیست MultiSelection است و چنانچه کاربر  یک یا چند داده را انتخاب کند و باتن cmdOpenReport را بفشارد گزارش حاوی داده ها ی گرفته شده باز میشود.




Private Sub cmdOpenReport_Click()

    Dim varItem As Variant
    Dim strEmployeeIDList As String
    Dim strCriteria As String
    Dim ctrl As Control    
    Set ctrl = Me.lstEmployees    
با پراپرتی کانت چک میکند که حداقل یک گزینه از لیست باکس انتخاب شده باشد.
    If ctrl.ItemsSelected.Count > 0 Then
در کد For Each....Next  داده آیتم یا آیتم های انتخاب شده را با پراپرتی ItemData ی کنترل میگیرد ، بین آنها کاما گذاشته و به متغیر strEmployerIDList میدهد
        For Each varItem In ctrl.ItemsSelected
            strEmployeeIDList = strEmployeeIDList & "," & ctrl.ItemData(varItem)
        Next varItem
      چون یک کاما قبل از اولین آیدی گرفته شده ( متغیر)  قرار می گیرد با تابع Mid گفته که عبارت بعد از کاما در متغیر قرار گیرد در نتیجه آن کاما حذف میشود.
        ' remove leading comma
        strEmployeeIDList = Mid(strEmployeeIDList, 2)     
حال نوبت به نوشتن شرط یا Criteria است که در  آرگومان WhereCondition  قرار داده شده  in هم کلمه ای است رزرو شده که در عبارات sql استفاده میشود و بیان نموده که strEmployeeIDList هایی که در فیلد EmployeeID ( دیتا تایپ نامبر است ) موجود است فهرست شوند .... چون ID نامبراست احتیاجی نیست که بین هر داده گرفته شده کوتیشن قرار گیرد ولی اگر دیتا تایپ فیلد تکست بود می بایست بین هر داده ای که از لیست باکس گرفته میشود غیر از همرا بودن با کاما ، تک کوتیشن نیز در ابتدا و انتهای آن قرار گیرد.

        strCriteria = "EmployeeID In(" & strEmployeeIDList & ")"
در کد زیر دستور باز شدن گزارش rptEmployees با چشم انداز Preview و شرط strCriteria داده شدس.
        DoCmd.OpenReport "rptEmployees", _
            View:=acViewPreview, _
            WhereCondition:=strCriteria
    Else
اگر هیچ آیتمی در لیست باکس انتخاب نشده باشد پیغامی را با Msgbox رایز میکند با پرامپت هیچ کارمندی انتخاب نشده.
        MsgBox "No employees selected", vbInformation, "Warning"
    End If
   
End Sub



expression.Column (IndexRow)


پراپرتی کالمن در آبجکت کمبو و لیست باکس که index اشاره به ستون مورد نظر دارد و Row هم اشاره به ردیف و از صفر شروع میشوند. فرضا شما میخواهید داده ستون دو و ردیف سوم را بگیرید.


.Column(1,2)



زمانیکه پراپرتی MultiSelect کنترل لیست باکس به None تنظیم شود فقط یک آیتم می تواند انتخاب شود و پراپرتی Selected می تواند به True تنظیم شود.وقتی پراپرتی MultiSelect کنترل لیست باکسی به Simple یا Extended تنظیم شود هر کدام یا تمام آیتم های انتخاب شده می تواند پراپرتی Selected برابر True خودش را داشته باشد. پس مشخص شد با Selected می توانید مشخص کنید کدام آیتم یا آیتم ها Select شده اگر True باشد انتخاب میشود و اگر به False تنظیم شود از حالت انتخاب در می آید.


لیست باکس چند انتخابی یا Multi-Selection باند شده به فیلدی همیشه دارای پراپرتی Value مساوی با Null است . می توان از پراپرتی Selected یا مجموعه ItemSelected برای بازیابی اطلاعات آیتم هایی که انتخاب شده اند ، استفاده نمود.


 عبارت زیر پنجمین آیتم در لیست را انتخاب ( Select ) می نماید


نام کنترل لیست باکس در اینجا ListBox1 است

 Me!Listbox1.Selected(4)=True



ComboBox.LimitToList property (Access) :

از پراپرتی LimitToList برای محدود کردن مقادیر کمبو باکس به آیتم های لیست شده استفاده میشود یعنی اگر به True تنظیم شود اگر مقداری در تکست باکس کمبو تایپ شود و در لیست نباشد زمان Enter و از دست دادن فوکس خطایی را نمایش میدهد که آیتم در لیست نیست.

Forms("Order Entry").Controls("States").LimitToList = True 


اگر بخواهید پیغام خودتان را نشان دهد در رویداد NotInList می توانید Response را مساوی صفر و پیام مورد نظرتان را در Msgbox قرار دهید


ComboBox.ListCount property (Access) :

تعیین تعداد ردیف های لیست باکس قسمتی از کمبو باکس ( کمبو باکس همانطور که در یادداشت های دیگر گفته شده یک قسمت تکست باکس و یک قسمت DropDown دارد.

اگر  پراپرتی ColumnHeads به True تنظیم شود این ردیف هم اضافه میشود یعنی ایندکس آن صفر است


ComboBox.ListRows property (Access) :

برای تنظیم حداکثر تعداد ردیف هایی که در لیست باکس قسمت کمبو باکس نمایش داده شود کاربرد دارد.

ComboBox.Locked property (Access) :

پراپرتی Locked مشخص میکند که می توان داده را در کنترلی در فرم ویرایش کرد.دیفالت True است
و این تنظیم اجازه ویرایش ، حذف و اضافه کردن داده را می دهد.


ComboBox.ListIndex property (Access) : 

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

مقدار پراپرتی ListIndex با تنظیم پراپرتی BoundColumn به صفر در دسترس است. اگر پراپرتی BoundColumn مقدار صفر بگیرد فیلدی که به کمبو یا لیست باکس باند شده حاوی همان مقداری خواهد شد که پراپزتی ListIndex تنظیم شده.



Here is the code to take data from a list box to a table...

Code:
کد زیر برای بردن داده از یک لیست باکس به یک جدول  و از کوئری Append استفاده شده البته Sql آن .

Private Sub Command14_Click()
Dim varName As Variant
Dim varItem As Variant
Dim strSQL As String
Dim undSQL As String
Dim CmbValue As String 
CmbValue = Me.Combo0.Value 
With Me.List9 
For Each varItem In .ItemsSelected

در عبارت Sql زیر در Insert into نام جدول و بعد داخل پرانتز نام فیلدهایی که باید داده به آن اضافه شوند و بعد Values و داخل پرانتز داده ها برای داده های فیلد از نوع دیتا تایپ تکست از تک کوتیشن در ابتدا و انتهای متغیر استفاده می شود . به پرانتزها و فواصل توجه کنید وگرنه خطای Syntax یا نوشتاری خواهید گرفت.

strSQL = "INSERT INTO tlbTempRecordset (UnderwriterName, ST_CODE) VALUES ('" & .Column(0) & "','" & .ItemData(varItem) & "');"
DoCmd.RunSQL (strSQL)
عبارت زیر حتما باید اعمال گردد وگرنه مقادیر تکرار و تکرار میشوند چون در لوپ هستیم   و اتومات Reset  نمی شود عزیزان
strSQL = ""
Next varItem 
End With 
Me.List9.Value = Null 
End Sub




در فرم امکان ساخت کنترل کمبو باکسی که MultiSelection باشد ،  نیست و فقط در جدول این پراپرتی  برای فیلد از نوع کمبو باکس وجود دارد.








باز شدن کمبو باکس زمان انتقال فوکس



when the user goes to a new control it will run the code and dropdown if it's a combo box


کمبو باکس سه قسمت دارد تکست باکس لیست باکس و دراپ داون 


زمانیکه کاربر به کنترل جدیدی میرود کد کار خواهد کرد و اگر کمبو باکس باشد DropDown میشود ( البته طبق گفته ی بالا در کنترل ها لوپ زده و گفته اگر ControlType کنترل acComboBox باشه DropDown انجام شود  ) که در رویداد GotFocus  هر کنترلی که کمبو باکس است می توانید به یک رویه کلی در همون آبجکت فرم ارجاع دهید.



Sub ControlName_GotFocus

DrowDownComboBox comboControl
End Sub

Public Sub DropDownComboBox(ComboControl As ComboBox)
  ComboControl.Dropdown
End Sub









پراپرتی SelStart و SelLength



SelLength :


این پراپرتی تعداد کاراکترهای انتخابی در قسمت تکست باکس یک کمبو باکس را معین می نماید ، از نوع Integer و رنج آن از صفر تا تعداد کاراکترها است ( در قسمت تکست باکس کمبو !!! )


حتما فراموش نشود برای تنظیم یا برگشتی این پراپرتی کنترل باید فوکس داشته باشد پس در کدتون حتما متد SetFocus را بکار ببرید ( Onchange Event ) .


تنظیم این پراپرتی به عددی کمتر از صفر باعث بروز خطا می شود.


SelStart :


این پراپرتی نمایانگر شروع نقطه تکست انتخابی یا موقعیت نقطه درج در صورت عدم انتخاب است 


Integer است و در رنج صفر تا تعداد کل کاراکترها است البته در قسمت تکست باکس کمبو باکس ) پس اینجا فهمیدید که کمبو باکس قسمت هایی دارد شامل تکست باکس ، دراپ باکس و لیست باکس )


مثل پراپرتی بالا حتما فوکس شود از متد SetFocus استفاده کنید

تغییر پراپرتی SelStart انتخاب را کنسل می کند ( همون در جا زدن که قبلا هم گفته شد ) یک نقطه درج در تکست قرار داده و پراپرتی را به صفر تنظیم میکند 


 فرضا  رشته ای دارید که طولانی است و میخواهید با گرفتن ورودی با  جعبه InputBox رشته دیگری را در آن بیابید و بعد از یافتن آنرا مشخص کند با SelLength ( مشخص کردن موقعیت رشته سرچ شده با Instr که عدد صحیحی را بر می گرداند که آنرا در SelStart می گذاریم  )


--------------------------------

Me.Text1.SetFocus

Me.Text1.SelLength=0

Me.Text1.SelStart=Len(Me.Text1)

اگر در تکست باکس کمبو باکس قصد سرچ در لیست باکس آنرا را دارید با Me.Filter ،  از خاصیت Text آبجکت TextBox بهره ببرید گفته شد زمانیکه فوکس از کنترل خارج شود یا بعبارتی فوکس از دست بدهد  خاصیت Value آن تکست باکس مقدار پیدا میکند.


فرضا تکست باکسی دارید که دارای Vertical Scroll است با نوشتن کد زیر در رویداد Enter ، نقطه شروع می شود  نقطه پایان آخرین کاراکتر درج شده ... بعبارتی کرسر به آخرین کاراکتر درج شده میرود .

Event : Enter

Me.Text1.SelStart=Me.Text1.SelLength

SelText:


پراپرتی که متنی  از یک عبارت  رشته ای  انتخابی را برمی گرداند.


اگر متنی انتخاب نشود این پراپرتی حاوی مقدار Null است.این پراپرتی از یک عبارت رشته ای که حاوی متن  انتخابی است استفاده می کند. چنانچه زمان انتخاب متن این پراپرتی تنظیم شود متن انتخابی با تنظیم SelText جدید جایگزین میشود.


حتما باید با SetFocud کنترل فوکس بگیرد فراموش نشود!!!



در رویداد MouseDown  کنترل تکست باکس کد زیر را بنویسید ، متنی بنویسید و Mouse را به سمت پائین فشار دهید در نظرات بنویسید چه اتفاقی رخ میدهد.

With TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With









ComboBox.AddItem Method



اضافه کردن آیتم  جدید به لیست مقادیر داخل کنترل ComboBox مد نظر


نوشتاری : 

expression.AddItem (ItemIndex)

در آرگومان اول ( Item ) رشته ای که می خواهید نمایش دهید را قرار می دهید و آرگومان دوم ( Index )  شماره ردیفی ( از صفر شروع میشود )  است که می خواهید رشته نمایش داده شود آرگومان دوم Optional یا انتخابیست و اگر عددی انتخاب نشود رشته به انتهای لیست کنترل کمبو باکس اضافه خواهد شد.


تابع زیر آیتمی را به ابتدای لیست کنترل کمبوباس اضافه می نماید و در اولین ردیف ( صفراندیسی است برابر با اولین ردیف در لیست )

Function AddItemToBeginning(ctrlComboBox As ComboBox,ByVal strItem As String)

ctrlComboBox.AddItem Item:=strItem, Index:=0

End Function

تابع بالا را در Class Module کپی کنید و  در کامند باتنی که  در فرم حاوی کمبو باکس تعبیه کردید عبارت زیر را بنویسید 

AddItemToBeginning(Combo1,"1234")


توضیحاتی که باید توجه شود : 


خاصیت RowSourceType کنترل مشخص شده باید به Value List تنظیم شود.اگر Table/Query باشد به جدول اضافه نخواهدشد.

این متد فقط برای کنترل های ListBox و ComboBox در فرم معتبر است 

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

برای لیست های چند ستونی از Semicolons برای جداسازی رشته ها برای هر ستون استفاده بنمائید برای مثال  "1010;red;large" برای سه ستون . اگر آرگومان آیتم حاوی رشته های زیادی باشد نسبت به تعداد ستونها ( ; استفاده کرده اید ) بقیه رشته ها اضافه نمی شوند ، اضافه شدن از سمت چپ انجام میگیرد

برای حذف آیتم از لیست مقادیر از متد RemoveItem استفاده بنمائید.






ComboBox.Selected Property


expression.Selected(lrow)


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


مثال زیر : انتخاب پنجمین مورد یا ( Row ) در لیست


Me!Combobox.Selected(4) = True


استفاده از خاصیت Selected در ویژوال بیسیک برای تعیین اینکه آیتمی در کمبو باکس انتخاب شده باشد






عدم نمایش پیام کمبوباکس درصورت مچ نشدن مقدار تکست باکس کمبو با لیست باکس کمبو



♧استفاده از رویداد NotInList کمبو باکس♧



پراپرتی LimitToList حتما باید Yes باشد 


.NotInList (NewDataResponse)

Response=0 Or Response=acDataErrContinue