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

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

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

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

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

اکسپورت به اکسل


کپی رکوردست 




AutoFit  : 


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






فیلتر پیشرفته ( شرط کوئری )


فرض کنید کنترل چک باکسی در فرم ساخته اید به نام Check2 که در فرم اصلی با نام Form3 قرار گرفته میخواهید آن چک باکس را به رکوردسورس فرم وصل کنید به این منظور که هر زمان باتنی با نام فیلتر را فشردید بر حسب تگ آن چک باکس فیلتر در دیتیل  اعمال گردد. 


در تگ چک باکس  مقدار را وارد کنید (  فرض می کنیم میخواهیم فیلد تحصیلات در دیتیل با مقدار چک باکس فیلترشود  پس مقدار تگ را  دیپلم قرار می دهیم )  سپس به دیزاین فرم رفته و در رکورد سورس به کوئری بیلدر می رویم  ( با زدن سه نقطه کنار باکس رکوردسورس) . 


در قسمت Criteria فیلد Education  تایپ میکنیم 

Forms!Form3!Check2.Tag

حتما  در رویداد باتن فیلتر منبع فرم را ریکوئری کنید 

Me.Requery 

زمانیکه فرم باز شود دیتیل فرم طبق مقداری که در  پراپرتی تگ (  Tag ) چک باکس گذاشتید فیلتر میشود و امکان حذف فیلتر را ندارید. (مگر ساخت باتن دیگر و نوشتن Me.FilterOn=False )


اگر بخواهید زمان بازشدن فرم کل رکوردها نمایش داده شود و زمانیکه بر روی باتن فیلتر فشردیدآنوقت فیلترانجام شودباید دریک ستون دیگرفیلدEducation را انتخاب و توتالزرا Where کنید و سپس در کریتریای آن بنویسید 

(iif(Forms!Form3!Check2=True,Forms!Form3!Check2.Tag,False

موردبالا بعد از برداشتن تیک دیتیل را خالی نمایش میدهد که برای اینکار از Is Null آن چک باکس و  false در iff ذکرشده استفاده می کنیم.


فیلتر کردن تاریخ : 

-  دو تکست باکس به نام های Text12 و Text14در فرم دارید و می خواهید رکوردهای بین دو تاریخ درج شده در دو تکست باکس فیلترشود در همان کوئری بیلدر در شرط فیلد تاریخ می نویسید 

Between Forms!Form3!Text12 And 

Forms!Form3!Text14


*** Null معادل هیچ مقداری نیست  جمع مقادیر با Null همان Null میشود پس برای فیلد رکوردی که Null است یا کنترلی که Null است باید صفر در نظرگرفته شود تا جواب جمع Null نشود و ارور دریافت نکنید !!!

اگر یکی از تکست باکس ها یا جفت خالی باشند چه اتفاقی خواهد افتاد به رفتار عملگرها مراجعه کنید )  ؟!!!

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


Between True And Null=Null 

Between Null And True=Null

Between Null And Null=Null


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

رعایت شود )


نکته !!!   اگر در تکست باکسها  الگوی ورودی یا Input Mask استفاده کردید برای تاریخ حتما باید مثل Input Mask فیلد تاریخ باشد یعنی اگر در فیلد تاریخ جدول  از 0 ;0000/00/00  استفادا کردید که اسلش ها هم درنظر گرفته میشود اگر Inpust Mask تکست باکس ها را فقط 0000/00/00 در نظر بگیرید چون مچ نمی شود خالی نمایش میدهد  و یا اگر اینپوت ماسک شما در جدول بصورت 0000/00/00 ( که اسلش ها در نظر گرفته نمی شود ) باشد و در تکست باکس از اینپوت ماسک استفاده نکرده باشید و خودتان تاریخ را با اسلش تایپ کنید باز هم مچ نمیشود چون در جدول فرضا 13980120 ثبت شده ولی شما در تکست باکس 1398/01/20 وارد کرده اید . ( پس خالی بودن دیتیل فرم بدین معنیست که مچ نشده چه تاریخ مورد نظر در مقدار فیلد جدول نباشد یا اینکه الگوی شما با تکست باکس نخواند )


پس اول چک کنید که الگوها یکی باشند !!! بعد از تطبیق دادن اگر شما یکی از تکست باکس ها را خالی رها کنید زمانیکه باتن فیلتر را کلیک می کنید باز هم دیتیل را خالی نمایش می دهد برای اینکه اگر یکی از آنها خالی بود از حالت فیلتر خارج شود کافیست با آن آدرس تکست باکس عبارت Is Null را بکار ببرید  ( بافاصله !!! ). اشتباه نکنید در محیط وی بی تابع  IsNull  وجود دارد.



Between (Forms!Form3!Text12 Or Forms!Form3!Text12 is Null) And

 (Forms!Form3!Text14 Or Forms!Form3!Text14 is Null)


برای درک عبارت بالا  بهتر است حتما عملکرد عملگرها را بدانیم 


Boolean Operation

  • not NULL = NULL

  • NULL or false = NULL

  • NULL or true = true

  • NULL or NULL = NULL

  • NULL and false = false

  • NULL and true = NULL

  • NULL and NULL = NULL




The Microsoft Access IsNull function returns TRUE if the expression is a null value. Otherwise, it returns FALSE.


فرضا در Text12 هیچ مقداری وجود ندارد ( Null )  یعنی  Null است و is Null برابر True ( چون  در اینجا تکست 12 Null است پس True را بر می گرداند ) پس طبق  بالا داریم   


Null Or True=True

AβAND(&&)OR(| |)NOT(exclA)
FALSEFALSEFALSEFALSETRUE
FALSETRUEFALSETRUETRUE
TRUEFALSEFALSETRUEFALSE
TRUETRUETRUETRUEFALSE
حال طبق جدول عملگرهای  منطقی بالا اگر تکست ۱۲ نال باشد مقدار پرانتز اول True هست ( طبق Operation Boolean ) و مقدار پرانتز دوم که True Or False هست هم میشود True و True And True نتیجتا True میشود 

در عملگر And اگر دو مقدار بولین فالز باشد فالز را بر می گرداند ولی اگر جفت ترو باشد ترو را

-داکیومنت برای  مقدار Boolean  :

Type Conversions

When Visual Basic converts numeric data type values to Boolean, 0 becomes False and all other values become True. When Visual Basic converts Boolean values to numeric types, False becomes 0 and True becomes -1.

در مورد Between...And : 

If exprvalue1, or value2 is Null, Between...Andreturns a Null value.



برای شرط تاریخ میتوان با Iif شرطی نوشت که اگر تکست باکس  شروع خالی بودبرای عملگر بزرگتر ( برای تکست باکس شروع ) First یا Min ( بهتر است استفاده شود ) فیلد تاریخ اعمال شود و برای عملگر کوچکتر ( برای  تکست باکس خاتمه ) اگر تکست باکس خاتمه خالی بود Last یا Max فیلد تاریخ ( که بهتر است )  

غیرفعال کردن کلوز باتن پنجره ی اکسس ( Disable Close In Access Window )

User31.dll


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


WM_SYSCOMMAND message


یک پنجره وقتی که یوزر کامند را از پنجره ی منو انتخاب میکند این پیام را دریافت میکند 


 

SC_CLOSE=&HF060&  ' Close The Window

SC_MAXIMIZE=&HF030&  ' Maximize The Window 

SC_MINIMIZE=&HF020& ' Minimize The Window

MF_BYCOMMAND=&H0&      ' Indicates that the uPositi

parameter gives the identifier of the menu item

غیرفعال کردن آیتم منو و خاکستری کردن آن بطوریکه نشود انتخاب کرد 

MF_GRAYED=&H1&   ' Disables the menu item and grays it so that it cannot be selected.


Window Styles

WS_MAXIMIZEBOX=&10000

WS_MINIMIZEBOX=&20000

پنجره در نوار عنوان منودارد که میتوان با این آیتم آنرا برداشت هم کلوز هم باکس Min و Max

WS_SYSMENU=&80000  ' The window has a windomenu

on its title bar.

WS_BORDER=&800000


GetSystemMenu hWnd(A handle to the window that

will own a copy of the window menu.),bRevet(it can be 

modified. If this parameter is TRUE)


تابع بالا برنامه را برای دسترسی به منوی پنجره (همچنین به عنوان منوی سیستم یا منوی کنترل) برای کپی کردن و اصلاح، فعال می کند.

  نام فرم یا اپلیکیشن اکسس  =hWnd

تابع بالا= hMenu


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


EnableMenuItem hMenu,uIDEnableItem(The menu

item to be enabled, disabled, or grayed : Like )

(SC_CLOSE),uEnable(MF_GRAYED)



FORM.hWnd

شما می توانید از ویژگی hWnd برای تعیین دسته (یک مقدار Integer Long Integrated) که مایکروسافت ویندوز را به پنجره فعلی اختصاص داده است، استفاده کنید.


مثال زیر از ویژگی hWnd با عملکرد API و تابع IsZoomed برای تعیین اینکه آیا یک پنجره Maximize می شود استفاده می شود.


Declare Function IsZoomed Lib "user32" (ByVal hWnd

As Long) As Long


()Sub Form_Activate

Dim intWindowHandle As Long

intWindowHandle = Screen.ActiveForm.hWnd

If Not IsZoomed(intWindowHandle) Then DoCmd.Maximize 
End If 
End Sub


تغییر رنگ پس زمینه رکوردهای اکسس ( Alternate Back Color )


باز کردن فرم یا گزارش در نمای دیزاین باز کردن پراپرتی سکشن Detail رفتن به تب Format و انتخاب گزینه های انتخابی  خاصیت  AlterNate Back Color  که اگر None شود رنگ پیش زمینه برداشته میشود .


راهنمای انجام کار سایت آفیس به آدرس ذیل  .... و سطرهای آخر


 https://support.office.com/en-us/article/change-the-appearance-of-a-control-by-using-conditional-formatting-6ba9e9fa-4347-4183-b335-44e43b05e22ff

مخفی کردن پنجره ی اکسس ( 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 


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



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

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

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

Form_SubFormName.SetFocud 

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


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 وجود دارد.



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


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



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

Docmd.SetWarnings False

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

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

  Docmd.SetWarnings True