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

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

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

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

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

مخفی کردن پنجره ی اکسس ( Hide Access Window )


استفاده از توابع ویندوز API 

در اکسس تابعی برای این موضوع در نظر گرفته نشده ولی میشود با این توابع و هندل کردن ویندو پنجره ای را بست کامند باتن هایی که در Title Bar هست را برداشت مثل خاصیت MinMax Button =No در پراپرتی شیت فرم اکسس  ، یا تغییر پوزیشن نمایش Msgbox  سیستمی  و یا Icon را در Title Bar فرم انداخت ویا پوزیشن پنجره را تغییر داد و خیلی کارهای دیگر یا حتی گرفتن تکست در Title Bar که همان Caption هست و یا تغییر 


Declare Function ShowWindow Lib "User32" ( Byval Hwnd As Long , Byval ncmdShow As Long ) As Long 



نحوه ی نگارش تابع در ( Win64 و Win32 )  فرق میکند و باید  در Win64 قبل از فانکشن Ptrsafe را قرار داد و کل دیتا تایپ Long در تابع به LongPtr تبدیل  شوند  اگر باید در هر دو 32 بیت و 64 کار کند باید از if Win64 Then # و Else .. End If استفاده کرد که قبل از Else با PtrSafe و LongPtr طبق روش بالا و برای بعد از  Else همان تابع بدون PtrSafe و Long قرار می گیرد 


Hwnd نام کنترل مثلا  فرم یا اپلیکیشن اکسس ؛ مثلا در اکسس  


 نکته : قبل از گذاشتن تابع زیر جهت مخفی شدن پنجره ی اصلی اکسس حواستان باشد در رویداد کلوز فرم حتما دستور خروج از اپلیکیشن که Quit هست با Docmd را بدهید وگرنه برای بستن باید از Task Manager ویندوز استفاده کنید چون برنامه ی شما هنوز باز است و ویندوز تنها با دریافت مسیج حاصل از زدن دکمه ی کلوز پنجره ی اصلی اپلیکیشن اکسس را خواهد بست !!!


ShowWindow Application.hWndaccessApp , 0 


Hide  0 

Normal 1

Minimized 2

Maximized 3 


نمایش رکوردها درپرینت پرویوی گزارش و چاپ به تعداد دلخواه Force New Page using vba

قراردادن کنترل Page Break زیر تکست باکس و درنظر گرفتن تکست باکس برای کانتر یا شمارشگر 


Me.pagebreakctl.Visible = (Me.txtLineCounter Mod 14=0

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


مثال زیر اکتیو کنترل را به متغیر ctlCurrentControl تخصیص میدهد و اعمال خاصی را بسته به  Value ی خاصیت Name  کنترل  فوکس داده شده انجام میدهد.


 Dim ctlCurrentControl As Control

Set ctlCurrentControl=Screen.ActiveControl

If ctlCurrentControl.Name="txtCustomerId" Then

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

"ElseIf ctlCurrentControl.Name="btnCustomerDetail

 Then 

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

End If


تذکر :  اگر فوکس  به کنترلی انجام نشود در حال استفاده از   ActiveControl یا  اگر تمام کنترل های فرم هاید یا  غیرفعال  شوند  خطا اتفاق می افتد 

فیلتر کردن محتویات داخل لیست باکس در زمان تایپ کردن در تکست باکس Filter Contents Of ListBox While Typing The TextBox

استفاده از رویداد OnChange تکست باکس موردنظربنام فیلتر بای  ... اسم لیست باکس در این مثال List0 هست .

سورس لیست باکس از جدول بنام Table1 حاوی فیلدهای نام و نام خانوادگی  .... در مثال پائین s برداشته شود ( انتهای متن sql )

()Private Sub FilterBy_Change
Dim Sql As String 
  Sql="Select  Fnam,Lnam From Table1 Where Fnam 
 Lnam Like '" & Me.FilterBy.Text & "*'"  s  & 
Me.List0.RowSource=Sql
End Sub 



گرفتن مقادیر انتخاب شده در لیست باکس Get List Of Selected Items In List Box


ControlName : List0

اگر خاصیت MultiSelect  از پراپرتی خود لیست باکس انتخاب شود ( Simple Or Extended )  با متد زیر مقادیر Bound Column لیست باکس صفر در پنجره ی Immediate Windo w محیط VBE لیست خواهد گردید. 


If Me.List0.ItemsSelected.Count>0 Then 

Dim VarItem As Variant

For Each VarItem In List0.ItemsSelected 

(Debug.Print List0.ItemData(VarItem

Next

End If

چنانچه لیست باکس چند ستونه باشد و بخواهید مقادیر  Column ها با توجه به Row انتخابی را بدست آورید باید بطریق ذیل عمل بنمائید 


 (Debug.Print   List0.Column(0,2 


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


 برای تعداد ردیف یا Row   

List0.ListCount            

Dim i 

For i=0 To List0.Listcount-1      

برای ستون یا Column

List0.ColumnCount


INDEX : یک  Long Integer که محدوده میتونه از صفر باشه تا ColumnCount منهای یک 

ROW : یک  Integer که محدوده میتونه از صفر باشه تا ListCount منهای یک 


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

صفر را برای ارجاع به ردیف اول بکار میبرید یک برای ردیف دو م و ....


(FORMS!CONTACTS!COSTUMERS.COLUMN(1,4


مثال بالا ارجاع میکند به کالمن یا ستون دوم و راو یا ردیف پنجم 



باز کردن فرم بر اساس شرط خاص Open Form Using Where Condition

"'DoCmd.OpenForm "Employees", , ,"LastName = 'King


فرم Employee رو باز میکنه و رکوردهائی را نمایش میدهد که  LastName آن برابر King باشد دقت شود چون ولیوی آن نامبر نیست داخل تک کوتیشن یا بین '  '  گذاشته شده اگربجای LastName از آیدی یا کد پرسنلی استفاده شود قسمت آخر باید 
"ID=10" باشد اگر 10 عددی نباشد  باید   "'ID='10"  نوشته شود 

نمونه ی زیرین  دررویداد کلیک باتن  cmdShowOrders که  frmOrder را باز میکند و آنهائی را نمایش میدهد که کاستمرآیدی  آنها برابر کاستمرآیدی در فرم جاری ( Me  ) باشد و کاستمرآیدی در جدول Number است 

()Private Sub cmdShowOrders_Click
If Not Me.NewRecord Then
_ ,"DoCmd.OpenForm "frmOrder WhereCondition:="CustomerID=" & Me.txtCustomerID End If End Sub

حرکت بین رکوردها در رکوردست ( Move Between Records )


Docmd.GotoRecod , , acNext

Docmd.GotoRecod , , acFirs

Docmd.GoroRecord , , acPrevious

Docmd.GotoRecord , , acLast

رفتن به رکورد بعدی 

رفتن به رکورد اول 

رفتن به رکوردقبلی

رفتن به رکوردآخر 


Docmd.Runcommand accmdRecordsGoToNext 

استفاده از کامندهایی که در نوار منو در اکسس ۲۰۰۲ وقبل تر بود


زمانیکه روی رکورد اول هستید و باتن رفتن به رکورد قبلی  یا باصطلاح Previous را می فشارید اروری رایز میشود که برای جلوگیری از آن میتوان قبل از کد رفتن یه رکورد On Resume Next را نوشت یا گفت زمانیکه رکورد جاری بزرگتر از یک شد acPrevious انجام شود .

 

رفتن به رکورد خاص



DoCmd.SearchForRecord acDataForm, "frmOrders", acFirst, "[OrderID] = " & Me!txtOrderID

این متد قدرتمند تر از متد FindRecord هست که عملگرهای منطقی نظیر  >  <  And Or و Between رو ساپورت میکند ( ویژگی مهم ) 

اگر در سابفرم اشاره شود باید به آن فوکس شود با متد SetFocus 

Form_SubFormName.SetFocud 

گرفتن تعداد رکوردها در سابفرم Get RecordCount In Subform



Me.RecordsetClone.MoveFirst

Me.RecordsetClone.MoveLast

Msgbox Me.RecordsetClone.RecordCount


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

رفتن به رکورد آخر 

مشاهده ی باکس پیام حاوی تعداد رکوردها 


نشان دادن رکورد جاری  Me.CurrentRecord  از تعداد کل رکوردها در رکوردست سابفرم با استفاده از ایونت Current فرم



Text0=Me.CurrentRecord & "Of" & Me.RecordsetClone.RecordCount




خالی کردن تکست باکس های داخل فرم ( سینگل )


Dim  Ctl

For Each Ctl In Me.Controls 

If Ctl.ControlType=acTextBox Then      

Ctl=Null             

End If     

Next


126 - acAttachment
   
'108 - acBoundObjectFrame
   
'106 - acCheckBox
   
'111 - acComboBox
   
'104 - acCommandButton
   
'119 - acCustomControl
   
'103 - acImage
   
'100 - acLabel
   
'102 - acLine
   
'110 - acListBox
   
'114 - acObjectFrame
   
'105 - acOptionButton
   
'107 - acOptionGroup
   
'124 - acPage
   
'118 - acPageBreak
   
'101 - acRectangle
   
'112 - acSubform
   
'123 - acTabCtl
   
'109 - acTextBox
   
'122 - acToggleButton
Go to the top of the page
 

شمردن کاراکتر خاص در طول یک رشته

مثال  شمارش تعداد ro در رشته ی  x 

"X="Roturzrxro

اول در آوردن فاصله در طول رشته ی x اگر وجود داشته باشد 

  (""," ",Replace(x=


راه حل خیلی ساده استفاده از توابع Replace و Len 

(" ","Len(x)-Len(Replace(x,"ro

طول رشته ی X میشود 10 و طول رشته در تابع Replace (جایگزینی فاصله بجای ro ) میشود 8  

در نتیجه تفاضل آنها 2 میشود یعنی دو تا ro در رشته ی x وجود دارد.



ذخیره کردن مقدار و استفاده در کنترل فرم دیگر که پراپرتی دیفالت ولیو دارد


در فرم اول  در رویداد افترآپدیت تکست باکس 

Tempvars.Add "Var1",Me!Text0 

دستور باز شدن فرم دوم با 

Docmd.OpenForm "Form2"

قراردادن در دیفالت ولیوی فرم دوم بعد از Open شدن 

  نوشتن در رویداد Open فرم 

Me!Text0.DefaultValue=TempVars!Var1 




ریست کردن شماره ی ردیف در فرم سینگل


اگر AutoNumber باشد که باید فیلد حذف و دوباره اضافه شود 



عدم نمایش پیغام اکشن کوئری 

Docmd.SetWarnings False

ریست کردن ردیف در سینگل فرم 

Docmd.RunSql " Update Tbl Set Row=Row-1 Where  Row>" & Me!Row 

  Docmd.SetWarnings True