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

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

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

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

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

PreviousControl


Screen.PreviousControl.Name


در کد زیر اگر کنترل تکست باکس یا کمبو باکس باشد و کنترل سورس آن خالی نباشد پراپرتی به False تنظیم میشود ( منظور پراپرتی Dirty ) ترتیب هم نزولی میشود.


With Screen.PreviousControl
If (.ControlType = acTextBox) or (.ControlType = acComboBox) Then
If (.ControlSource <> vbnullstring) and not (.ControlSource Like
"=*") Then
If Me.Dirty Then
Me.Dirty = False
End IF
Me.OrderBy = .ControlSource & " DESC"
Me.OrderByOn = True
End If
End If
End With


زمانیکه رکوردی ذخیره میشود مایکروسافت اکسس پراپرتی Dirty را به False تنظیم میکند.زمانیکه کاربری تغییراتی را به رکوردی ایجاد میکند پراپرتی به True تنظیم می شود.




استفاده از پراپرتی Tag کنترل ها


در رویه زیر در رویداد Current فرم نوشته شده ، کنترل هایی که در خاصیت یا پراپرتی Tag آنها حرف R قید شده باشد  روئت نشوند 


Private Sub Form_Current()
Dim ctl As Control
For Each ctl In Controls
If ctl.Properties("Tag") = "R" Then ctl.Properties("Visible") = False
Next ctl
End Sub



Tag

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


البته این کار فقط در نمای دیزاین امکانپذیر است یعنی باز کردن فرم  در این نما اگر فایل به 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.

















Detail_Print




Private Sub Detail1_Print(Cancel As Integer, PrintCount As Integer)

Dim lngMaxHeight As Long

Dim i As Integer

lngMaxHeight = Me.Itm0.Height

For i = 1 To 3        

If lngaMaxHeight < Me.Itm0.Height + Me("rptPREE" & i).Height Then            

lngMaxHeight = Me.Itm0.Height + Me("rptPREE" & i).Height

End If

Next    

Me.Line (Me.Width, 0)-(Me.Width, lngMaxHeight)

For i = 0 To 24        

Me.Line (Me("Itm" & i).Left, 0)-(Me("Itm" & i).Left, lngMaxHeight)

Next

End Sub




CODE

Me.Line (Me("Itm" & i).Left, 0)-Step(10.5*1440, lngMaxHeight)






نمایش کنترل در صفحه نمایش یا پرینت



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

دیتیل ، هدر و فوتر و اثرش روی تمام کنترل های روی فرم غیر از Page Break است


.DisplayWhen=0


0  نمایش در حالت فرم ویو و زمانیکه پرینت میشود که دیفالت است.

1  در حالت فرم ویو پنهان است و فقط زمان چاپ مشاهده میشود.

2 در حالت فرم ویو نمایان شده ولی در چاپ مشاهده نمیشود.




REMARKS




پراپرتی Format و استفاده در رویداد Change کنترل TextBox


کد زیر که از فروم خارجی سال 2008 استخراج شده را تست و کاربردش  در نظرات را قید نمائید ( فقط ورود اعداد در تکست باکس مجاز باشد ... Input Mask را تنظیم نمائید ) 


Private Sub Text1_Change()
Text1 = Format(Text1, "#,###")
Text1.SelStart = Len(Text1.Text)
End Sub



فرمت های مرسوم برای تایپ Number و Currency


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


قسمت اول برای اعداد مثبت

قسمت دوم برای اعداد منفی

قسمت سوم برای مقادیر صفر

قسمت چهارم برای مقادیر Null


استفاده از سنبل های زیر برای هر نوع داده در Custom Formats : 


Space : فضاهای خالی را بعنوان کارکتر واقعی نشان میدهد

"ABC" : نمایش داخل کوتیشن

!                   : چپ چین کردن 

*                  : پر کردن فضای موجود با کاراکتر بعدی

\                  : نمایش کاراکتر بعدی بعنوان کاراکتر واقعی   .شما می توانید همچنین کاراکترهای واقعی را با قراردادن  علائم کوتیشن اطراف آنها مشاهده نمائید.

[ Color ]   : دیتای فرمت شده را رنگی نمایش میدهد ،  رنگ بین براکت باشد!!!  رنگ های موجود 

Black , Blue , Green , Cyan , Red , Magneta , Yellow , White


تابع زیر در رویداد LostFocus تکست باکس Unbound به نام TaxRefund در صورتیکه مقداربعداز خروج از تکست باکس که ذخیره میشود عددی باشد (  با تابع IsNumeric چک می کند ) با فرمت Currency و اگر نباشد با فرمت Capital یا حروف بزرگ نمایش میدهد.( علامت بزرگتر)



Function FormatValue() As Integer 

    Dim varEnteredValue As Variant 

    varEnteredValue = Forms!Survey!TaxRefund.Value 

    If IsNumeric(varEnteredValue) = True Then 

        Forms!Survey!TaxRefund.Format = "Currency" 

    Else 

        Forms!Survey!TaxRefund.Format = ">" 

    End If 

End Function


\   :  مانند محصور کردن کاراکتر با علامت دابل کوتیشن است 

<  : تمام تکست UpperCase میشود ( حروف بزرگ )

> : تمام تکست LowerCase میشود ( حروف کوچک )



Custom Formats برای فیلدهای نوع تکست می تواند تا دو سکشن داشته باشد.هر سکشن حاوی فرمت خاصی برای داده متفاوت در یک فیلد می باشد.( دو سکشن با  سمی کالن از هم جدا میشوند )


سکشن اول برای فیلدهای حاوی تکست

سکشن دوم برای فیلدهایی با رشته های Zero-Length و Null Values ( نمایش تکست مورد نظر در صورتیکه فیلد دارای طول صفر باشد یا Null )



For example, if you have a text boxcontrol in which you want the word "None" to appear when there is no string in the field, you could type the custom format @;"None" as the control's Format propert setting. The @ symbol in the first section causes the text from the field to be displayed and the second section causes the word "None" to appear when there is a zero-length string or Null value in the field.






















جدا کردن کاراکترها و نگاهی به پراپرتی TextBox.ControlSource



پراپرتی ControlSource  یا به فیلدی از جدول یا کوئری باند میشود یا حاوی عبارتی است که در کنترل تکست باکس تایپ می نمائید ولی چنانچه Expression باشد دیتا ذخیره نمیشود مگر اینکه کنترل سورس به فیلدی از جدول یا کوئری متصل باشد که در صورت تغییر و از دست دادن فوکس دیتای جدید جایگزین خواهد شد.


برای Reports این پراپرتی فقط در Group Level یا گروه بندی کاربرد دارد


فرم و گزارشات بعنوان یک پنجره در دیتا بیس عمل می کنند.منبع اولیه داده برای یک فرم یا گزارش توسط پراپرتی RecordSource خودش به جدول یا کوئری یا عبارت SQL تنظیم و سپس  پراپرتی کنترل سورس به یک فیلد یا عبارتی تنظیم میشود.


اگر پراپرتی ControlSource به عبارتی تنظیم شود مقدارنمایش داده شده فقط خواندنیست یا Read-Only و در دیتابیس ذخیره نمیشود.


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


فرضا عبارت ABC1233D در تکست باکسی با نام Text1 تایپ میشود این عبارت حاوی چند کاراکتر است ؟ .... 8 کاراکتر !!!


me("C" & i).controlSource=Mid(Me.Text1,i,1)


فرضا 11 کنترل تکست باکس ایجاد یا Create می کنید  و پراپرتی Name آنرا به C1 تا C11 تغییر می دهید.


Me منظور فرمیست که در آن کار می کنید 





جدا کردن کاراکتر عددی از یک متن حاوی کاراکتر حرفی


در کد زیر توسط تابع Mid کاراکترها یک به یک  در تابع Asc قرار داده شده ، چنانچه جواب تابع Asc غیر کد های اسکی 48 تا 57 ( کد اسکی اعداد )   باشد در NumericString ذخیره میشود .



کدی که از فروم های خارجی استخراج شده 

Function NumericString(strInput As String) As String
'Returns a string containing only the numeric characters of the input string
Dim i As Integer
Dim intAsc As Integer
NumericString = ""
i = 1
While i <= Len(strInput)
    intAsc = Asc(Mid(strInput, i, 1))
    If (intAsc >= 48 And intAsc <= 57) Then
        'character is Numeric
        NumericString = NumericString + Mid(strInput, i, 1)
    End If
    i = i + 1
Wend
End Function



=NumericString("ABH234D") will return "ABHD"



ASCII control characters non printable :

ASCII code 00 = NULL ( Null character )ASCII code 01 = SOH ( Start of Header )
ASCII code 02 = STX ( Start of Text )
ASCII code 08 = BS ( Backspace )
ASCII code 27 = ESC ( Escape )
ASCII code 28 = FS ( File separator )
ASCII code 127 = DEL ( Delete )











عدم رفتن به رکورد بعدی توسط کلید Tab در سینگل فرم و رفتار کلید Enter



تنظیم خاصیت Cycle  فرم به Current Record 

چون Enter هم تاثیر دارد می توانید در تنظیمات خود اکسس Next Field را انتخاب کنید ( Move After Enter قسمت Client Setting ) در هر صورت کلید هایی هم وجود دارد که می توانند به رکورد بعد پرش کنند و رفتن به رکورد بعد یعنی ذخیره رکوردی که در آن بودید




تصویر زیر هم  زمانیکه نمی خواهیم پیغام های اکشن کوئری ها و حذف یا تغییر دریافت کنید استفاده میشود با برداشتن تیک ها ... Client Setting و قسمت Confirm 



پراپرتی Cycle در فرم فقط رفتار کلید Tab در فرم را کنترل می کند.اگر سابفرم در Tab Order باشه بعد از اینکه این کنترل فوکس دریافت می کندتنظیم این پراپرتی برای سابفرم تعیین می کند زمان فشردن کلید Tab چه اتفاقی می افتد!!!


برای انتقال فوکس به خارج سابفرم کلید ترکیبی Ctrl+Tab را بفشارید


زمانیکه Cycle را به CurrentRecord یا عدد یک تنظیم می کنیم رفتار Tab Key اینطور نوشته شده که بعد از آخرین کنترل فوکس به اولین کنترل در Tab Order می رود.ولی باز هم کلیدهایی وجود دارد که می تواند شما را به رکورد بعدی ببرد ... فوکس در Toggle Button به خودش میرود نه اجزا داخلیش




TabStop



TextBox.TabStop


برای مشخص شدن جابجایی فوکس به یک کنترل استفاده میشود

و از نوع Boolean است ، Yes Or No


اگر به No تنظیم شود یا 0 باشد انتقال فوکس به کنترل با فشردن کلید Tab میسر نخواهدشد.


زمان ساختن کنترلی در فرم مایکروسافت اکسس بصورت خودکار موقعیتی را در Tab Order فرم اختصاص میدهد.هر کنترل جدید در آخر آن قرار می گیرد.اگر بخواهید از در دسترس بودن یک کنترل در فرم جلوگیری کنید خاصیت TabStop کنترل را به No تنظیم نمائید.یعنی کلید Tab در آن کار نمی کند.


در حالت Form View کنترل های غیر فعال و یا پنهان شده در Tab Order باقی می مانند اما زمان جابجایی در کنترل ها با فشردن کلید Tab از آن پرش می کند حتی اگر پراپرتی TabStop آن Yes شده باشد.


تا زمانیکه پراپرتی Enabled کنترل به Yes تنظیم شده می توان با کلیک  یا استفاده از کلیدهای دسترسی روی آن انتخاب شود ، صرفنظر از تنظیم پراپرتی TabStop آن . بطور مثال شما می توانید پراپرتی کامند باتن را برای جلوگیری از انتخاب توسط کاربر به No تغییر دهید.هرچند آنها می توانند روی آن باتن کلیک کرده و آنرا انتخاب نمایند.




پراپرتی 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 در ویژوال بیسیک برای تعیین اینکه آیتمی در کمبو باکس انتخاب شده باشد






Textbox.Text Property


زمانیکه کنترل فوکس دارد پراپرتی یا خاصیت Text حاوی دیتای جاری در کنترل TextBox است ؛ خاصیت Value حاوی دیتایی است که آخرین بار ذخیره شده .. زمان انتقال فوکس به کنترل دیگر داده کنترل به روز رسانی یا Update ، و پراپرتی Value به مقدار یا Value جدید تنظیم می شود.


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


اگر از کامند SaveRecord از طریق Docmd استفاده کنید و فوکس نگیرد یا فوکس انتقال نشود دو خاصیت Text و Value مشابه هم تنظیم خواهندشد.





تابع تبدیل عدد به حروف در اکسس



 قصد دارید عددی را به  حروف فارسی یا انگلیسی برگردانید بنده بعنوان یک مبتدی و در این سطح به شما دوست اکسسی عزیز عرض میکنم بنده در ذهن خودم تصور کردم اول می بایست تبدیل اعداد در همان سه رقم اول یعنی یکان دهگان و صدگان را انجام دهم سپس یک تابع جداکننده اعداد سه رقم سه رقم ایجاد کنم و در نهایت در تابعی بگویم برای سه رقم اول هیچ رشته ای  برای سه رقم دوم ،  هزار  سه رقم سوم میلیون و الی ..... در نظر بگیر که بعد از این سه رقم ها به رشته ای که میخواهید بسازید اضافه گردد. ( Public Function )









در بالا یونیک چارت وجود دارد بجای فارسی کردن پنجره Vba وچون اکسس یونیکد فارسی را ساپورت نمیکند بهتر است از یونیکد بالا در تابع Chrw برای نمایش معادل فارسی در تکست باکستون استفاده بنمائید...


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



S(0)=CHRW(1589)+Chrw(1601)+Chrw(1585)    صفر

S(1)=Chrw(1740)+Chrw(1705)   یک

.

.

.

S(10)=ده

S(20)=بیست

.

.

S(90)=نود

S(100)=یکصد

S(200)=دویست

.

.

S(900)=نهصد



در اینجا باید بین سه رقم لوپ بزنید و معادل فارسی هر عدد که در آرایه تنظیم کردید را برگرداند برای اینکار باید فرضا عدد شما 123 باشد می بایست این عدد به 100 20 و 3 تجزیه شده و این 3 عدد را در آرایه بیابد و معادلش را چاپ کند.


 



در تصویر بالا مشاهده می کنید که برای بدست آوردن 100، 20 و 3  از ترکیب دو تابع Left و Mid استفاده شده . از تابع Mid استفاده شد تا اعداد 1 ، 2  و 3 را جدا کند و به فرمت 000 در آورد


For i=1 To Len("123")

C=Len("123")

X=CVal(Left(Mid("123",i,1) & "000",C))

'Mid("123",i,1) : 

'Mid("123",1,1)=1 & "000"=100

'Mid("123",2,1)=2 & "000"=200

'Mid("123",2,1)=3 & "000"=300

'C=3 Then Left(100,3)=100

'C=2 Then Left(200,2)=20

'C=1 Then Left(300,1)=3

Ret=Ret & IIf(Ret="","",Chrw(1608)  &  S(X)

C=C-1

Next 

Function=Ret


فانکشن بالا ترجمه گرتون میشه که عدد سه رقمی رو تبدیل به حروفی میکنه که در آرایه ای ذخیره شده اند


حال باید تابع دیگری بنویسید که عددتون رو سه رقم سه رقم جدا بنماید.


اول دانستن کاربرد Back Slash در Vba


Dim MyValue

MyValue = 11 \ 4   ' Returns 2.

MyValue = 9 \ 3   ' Returns 3. 

MyValue = 100 \ 3   ' Returns 33.


تصویر زیر هم در نظر داشته باشید



با تابع String می توانید کاراکتر مورد نظرتون را به تعداد مورد نیاز چاپ کنید فرضا در تصویر بالا 8 بار کاراکتر صفر تکرارشده و با تابع فرمت گفته شده عدد دو در شکل و غالب صفرها نمایش داده شود ساده ترین راه اینه که اول مشخص کنید عددتون چند قسمت میشود فرضا عدد 1234 ... طولش 4 است 


4\3=1

4 Mod 3<>0  Then 1+1=2

n=2

پس 1234 شامل دو پارت میشود ( n ) یکی 1 و دیگری 234 


 بین یک تا عدد n لوپ زده شود For i=1 To n و قبل از آن با دو تابع تصویر بالا رشته "001234" حاصل می شود یعنی جای عدد 8 باید 2×3 قرار داده شود وبجای "2" رشته عددی "1234"، سپس با تابع Mid می توانید سه رقم سه رقم جدا کنید


چون n برابر 2 است پس دوبار حلقه تکرار می شود

آرگومان اول Mid همان نقطه شروع(Start) و بعدی طول (Length) است در لوپ اول از اولین کاراکتر شروع میکند و رشته ای با طول 3 را برمی گرداند در لوپ دوم یعنی n=2 نقطه شروع باید بشود 4 بخاطر همین از Start=Start+3 استفاده شده و طول ثابت است چون در هر لوپ رشته ای با طول ۳ مد نظر ما است اساتید بزرگ .


Start=1

For i=1 To n

K=Mid("001234",C,3)

'Mid("001234",1,3)=001

'Mid("001234",4,3)=234

Ret=Ret & IIf(Ret="","",",") & k

Start=Start+3

Next

Function=Ret


فرض کنید عدد 234 دارید 


3\3=1 AND 3 MOD 3=0 Then n=1

Mid("234",1,3)


عدد 23


2\3=0  AND 2 MOD 3<>0 Then   n=0+1

Mid("023",1,3)


عدد 12345678 : 


8\3=2 And 8 Mod 3<>0 Then n=2+1=3

Mid("012345678",1,3)=012

Mid("012345678",4,3)=345

Mid("012345678",7,3)=678


برای عدد 12345678 بالا با فرمت "012345678"  و n=3 توسط تابع Mid  و تکرار لوپ به تعداد n سه عدد جداگانه بدست آوردیم. کلیات این تابع میشود جدا کردن ارقام بصورت ۳ تایی و در نهایت در تابع اصلی استفاده میشود.



مرحله آخر تابع اصلی است که عدد از کاربر گرفته می شود فرضا تابع (GetValue(n As Long و عدد را داخل تابع جداکننده می گذارد و جواب آن که بصورت    "012,345,678" است را با تابع Split  جدا کرده و می گوئیم که یکی یکی در تابع ترجمه گر قرار دهد و  به حروف برگرداند حال در اینجا چیزی که مورد نیاز است حروف هزار ، میلیون ، میلیارد و .... 


درمثال بالا می توانید در همان تابع آرایه ای بسازید و حروف هزار ، میلیون ، میلیارد ، تریلیون و تریلیارد را ذخیره کنید و چون   i  در عملیات تابع Mid نقشی ندارد می توانید بنویسید FOR i=n To  1 ، در نتیجه اگر فرض کنیم تابع دیگری نسازیم می توانیم در تابع دوم بگوئیم 


Dim A(1 To 5 ) As String

A(1)=""

A(2)="هزار" USE CHRW !!!

A(3)="میلیون" USE CHRW

A(4)="میلیارد"


و اگر نام تابعی که سه رقم اعداد را به حروف بر می گردانیم (T(num باشد در تابع Mid باید گفت 


Ret=Ret &  IIf(Ret="",""," " & Chrw(1608)

 T(k) &  A(n) 


در شروع لوپ Ret جوابی ندارد توسط تابع IIF چک شده اگر جواب داشت از حرف "و" استفاده شود چک میکنیم 

String : 12345678

8\3=2 AND 8 Mod 3 <>0 Then n=(8\3)+1=3

n=3

Ret=""

A(3)="یک میلیون"

Ret="یک میلیون "

 n=2

Ret="یک میلیون" ' ( Ret <>"" )  Use "و"

A(2)="هزار"

Ret="یک میلیون (  و ) سیصد و چهل و پنج هزار "

n=1

Ret="یک میلیون و سیصد و چهل و پنج هزار " ' ( Ret<>"" )  "و"

A(1)=""

Ret=یک میلیون و سیصد و چهل و پنج هزار(  و ) ششصد و هفتاد و هشت

End Loop!!!

بسیار ساده به ساخت  توابعی برای تبدیل عدد به حروف فارسی پرداخته شد در صورت وجود مورد یا اشتباه لطفا در نظرات تصحیح شده درج گردد




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



ایجاد لینک جداول


زمانیکه شما جداول را از فرم ها و کوئری و سایر آبجکتها جدا یا Split کرده باشید برای لینک زدن به جداول در دیتابیسی حاوی جداول که پسورد گذاشته اید از کد زیر استفاده نمائید.


با OpenDatabase ، دیتابیس دارای پسورد را باز می کنید و سپس با TransferDatabase هم لینک به جداول دیتابیس حاوی جداول


strLinkedTablesArray آرایه ای حاوی جداولیست که میخواهید بصورت لینک شده در دیتابیسی که می خواهید Share کنید ایجاد شود 


Set db = CurrentDb
Set dblink = DBEngine.OpenDatabase(strDbFile, False, False, ";PWD=" & strP)
For Each strTable In strLinkedTablesArray
DoCmd.TransferDatabase acLink, "Microsoft Access", dblink.name, acTable, _
strTable, strTable
Next


کد بالا مطمئن تر از استفاده از TableDef.Connect است 


برای استفاده در Tabledef.Connet


strConnect = "MS Access;PWD=" & strPassword & _
";DATABASE=" & strDbFile"


باز کردن دیتا بیس اکسس :

Dim wsAccess As Workspace
Set wsAccess=Dbengine(0) 
 'Open a Microsoft Access database -shared -read-only
   Set dbAccess = wsAccess.OpenDatabase("C:\Temp\db1.accdb", False, True)






Fields.Count Property خاصیت کانت از کالکشن فیلدز



بدلیل اینکه اعضاء یک مجموعه با صفر شروع می شوند باید همیشه کدی که لوپ زده میشود از صفر شروع شده و به پراپرتی Count منهای یک ختم شود.اگر تمایل داشته باشید که بین اعضاء یک مجموعه لوپ بزنید بدون بررسی پراپرتی Count می توانید از کامند یا دستور FOR EACH .... NEXT استفاده کنید.


Fields یک کالکشن یا مجموعه ای از ذخایر فیلدهاست 


For i=0 To Rs.Fields.Count-1

For Each Fld In Rs.Fields



پراپرتی Count هیچوقت به Null تنظیم نمیشود اگر مقدارش صفر باشد یعنی  هیچ شی ای در مجموعه وجود ندارد.


برای ارجاع به شی Field در یک کالکشن توسط عدد ترتیبی آن یا با استفاده از خاصیت نام آن ( Name ) می توانید هر کدام از فرم های نوشتاری زیر را بکار ببرید.


Fields(0)

Fields("name")

Fields![name]

استفاده از خاصیت Name از کالکشن Fields ، همانطور که گفته شد نامبر کالکشن از صفر شروع میشود و با اعداد ترتیبی یعنی پشت سر هم 2 1 0  و .... در زیر نام شی فیلد از کالکشن فیلدز که عدد آن صفر است و منظور فیلد اول است نمایش داده میشود 


Msgbox Rs.Fields(0).Name


کد زیر : نمایش نام  فیلد صفر جدول 1 از کالکشن Tabledefs ( که مجموعه ایست برای ذخیره Tabledef یا مشخصات جداول ) از دیتابیس جاری

Msgbox currentdb.TableDefs("Table1").Fields(0).Name




acSysUpdateMeter




With Rs
If .Eof Then
Exit Sub
Else
Intret=SysCmd(acSysCmdInitmeter,strmsg,100)
End If
Do Until .Eof
If .PercentPosition<>0 Then
Intret=SysCmd( acSysCmdUpdateMeter, .PercentPosition)
End If 
.MoveNext
Loop
End With
intRet =SysCmd(acSysCmdRemoveMeter) rstEmployees.Close 


varReturn = Syscmd(acsysInitMeter,[ProgressBarName],[TotalCount])

varReturn = SysCmd(acsysUpdateMeter,[ProgressBarName], [CurrentCount])
varReturn = SysCmd(acsysClearStatus)


acsyscmdaction


کاربرد Move و عملکرد EOF و BOF


Recordset.Move


اگر Move را برای انتقال به رکورد قبل از First Record استفاده کنید به شروع فایل میرود . چنانچه رکوردست حاوی رکوردنباشد و خاصیت BOF آن True باشد استفاده از این متد برای برگشت به عقب باعث ارور میشود.


اگر Move را برای بعد از Last Record استفاده کنید نشانگر به انتهای فایل منتقل میشود چنانچه شامل هیچ رکوردی نباشد و EOF هم TRUE باشد قطعا خطا دریافت می کنید.


اگر هر کدام از خاصیت هایBOF یا EOF به TRUE تنظیم شده باشند و تلاش کنید از متد MOVE بدون Bookmark معتبر استفاده کنید خطا اتفاق خواهد افتاد


زمان ساخت یا باز کردن شی RecordSet هر کدام از رکوردها یک بوک مارک یونیک دارند و می توانید بوک مارک را برای رکورد جاری با اختصاص دادن مقدار بوک مارک به یک متغیر ذخیره کنید برای ارجاع سریع به آن رکورد در هر زمان بعد از انتقال به رکورد دیگر , خاصیت بوک مارک شی رکوردست را به مقدار آن متغیر تنظیم نمائید.











شمارش تعداد رکوردها در رکوردست




Forms!Orders.RecordsetClone.MoveLast 

MsgBox "My form contains " _ 

    & Forms!Orders.RecordsetClone.RecordCount _ 

    & " records.", vbInformation, "Record Count"


البته اول از MoveFirst استفاده کنید بعد MoveLast و در اینجا از پراپرتی RecordCount برای شمارش استفاده شده بکار ببر ید چنانچه  بکار بردن Dcount سخت تر یا دیر بازده است.


در مثال بالا به آخرین رکورد در مجموعه رکوردها که در فرم Orders است رفته و پیامی که حاوی تعداد رکوردها است را نمایش می دهد توسط باکس یا پنجره Msgbox



Dim rs as Dao.Recordset

Set rs=Me.RecordsetClone

With rs

.MoveFirst

.MoveLast

Msgbox .RecordCount

End With



Using a RecordsetClone is an easy way to manipulate records on a subform


 استفاده از RecordsetClone یک راه آسان برای جمع آوری رکوردها در سابفرم است دوستان .







شمارش تعداد رکوردهای یک فرم


می توانید از قالب Dcount استفاده نمائید.


Me.Text1 = DCount("[Pick a field]", Me.RecordSource)





تعیین و مشخص کردن بالاترین Row در Multiselection



You can use the SelTop property to specify or determine which row (record) is topmost in the current selection rectangle in a table, query, or form datasheet, or which selected record is topmost in a continuous 

form




با استفاده از خاصیت SelTop می توان بالاترین ردیف ( رکورد جاری ) را در یک مجموعه انتخابی مشخص کرد.این خاصیت عددی بین 1 و شماره رکوردها در Datasheet یا continuous form را بر می گرداند. 


پراپرتی های SelTop و SelLeft موقعیت گوشه چپ بالایی مستطیل انتخابی را مشخص میکند.


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


بیشتر زمانی استفاده میشود که بخواهند چند ردیف را انتخاب کنند و  یک Query روی آنها اجرا نمایند.


The SelHeight property returns a Long Integer value between 0 and the number of records in the datasheet or continuous form. The setting of this property specifies or returns the number of selected rows in the selection rectangle or the number of selected records in the continuous form.


پراپرتی SelHeight یک عدد صحیح از نوع لانگ بین صفر و تعداد رکوردها در فرم دیتاشیت یا کانتینیوس را برمی گرداند.تنظیم این خاصیت تعداد ردیف های انتخاب شده در مستطیل انتخابی یا تعداد رکوردهاب انتخاب شده در فرم کانتینیوس را برمی گرداند

RECORDSET.MOVE : 


موقعیت نشانگر رکورد جاری را انتقال می دهد


تلاش به انتقال به یک نقطه قبل از اولین رکورد به انتقال به رکورد قبل از اولین رکورد منجر میشود که BOF است .تلاش به انتقال به قبل از آخرین رکورد باعث میشود نشانگر رکورد به رکورد بعد از آخرین رکورد انتقال یابد که EOF است. در غیر از این مورد اگر متد MOVE برای انتقال به قبل از BOF  یا  EOF استفاده شود ارور ایجاد می کند.تست کنید در فرم Bound شده یعنی در پراپرتی  رکورد سورس نام جدولی باشد.

Private Sub cmd1_click()

Dim rs as Dao.Recordset

Set rs=me.recordset

Rs.MoveLast

Res.MoveNext

End Sub


مثال از SelTop و SelHeight : 

اگر از بالا به پائین ردیف سوم و چهارم را انتخاب کنید SelTop را 3 و SelHeight را 2 دریافت می کنیم اما اگر از پائین به بالا انتخاب کنید  عدد SelTop 4  و SelHeight همان 2 است

زمانیکه روی یک باتن کلیک کنید انتخاب از بین میرود و SelHeight هم صفر میشود پس اگر بخواهید آنرا داشته باشید باید ذخیره کنید می توانید در رویداد EXIT سابفرم آنرا در متغیری ذخیره کنید . فرضا Selh=Me.SelHeight .... اگر اینکار را انجام ندهید انتخاب Clear می شود و SelTop به رکورد انتخاب شده جاری که رکورد پائین است  تنظیم میشود ( زمانیکه انتخاب پائین به بالا باشد ) 

یادداشت : SelTop. و SelHeight. در یک فرم کانتینیوس کاربرد دارد در حالت Form View زمانیکه با Record Selector رکوردی را انتخاب می کنید.


دیتاشیتی که فوکس گرفته  ... تعداد ردیف های انتخاب شده با  SelHeight ... تعداد ستون های انتخاب شده با SelWidth .... بالاترین ردیف در مجموعه انتخاب شده با استفاده از SelTop و بستگی دارد که از بالا به پائین یا از پائین به بالا انتخاب می کنید. ( توضیحات ذیل )


' Datasheet that has the focus
Set frm = Screen.ActiveDatasheet
' Number of rows selected.
lngNumRows = frm.SelHeight

' Number of columns selected.
lngNumColumns = frm.SelWidth

' Topmost row selected.
lngTopRow = frm.SelTop

دو عمل زیر در Recordset ، اولی رفتن به اولین رکورد و دومی انتقال نشانگر رکورد به اولین رکورد انتخاب شده 

Rs.MoveFirst
' Move to the first selected record.
 Rs.Move mlngSelTop - 1
        '


Me.sfrmSomeSubForm.Form.SelWidth = CurrentDB.TableDefs(Me.sfrmSomeSubForm.Form.RecordSource).Fields.Count






تعیین



You can use the SelTop property to specify or determine which row (record) is topmost in the current selection rectangle in a table, query, or form datasheet, or which selected record is topmost in a continuous form