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

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

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

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

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

انتخاب آبجکت

مثال زیر فرم را انتخاب می کند 


DoCmd.SelectObject acForm, "Customers", True


تغییر نام آبجکت ( فرم ، جدول ، کوئری )


Docmd.Rename NewName,ObjectType,OldName


از متد Rename برای تغییر نام شئ دیتابیس مشخص شده مثل جدول یا کوئری بهره ببرید


Use the Rename method to rename a specified database object.


اگر ObjectType و آرگومان OldName خالی بمانند ( پس با توجه به این گفته هر دو Optional یا انتخابی هستند و می توانند خالی رها شوند - پیش فرض acDefault است یعنی هر چی که انتخاب شده بود ) اکسس آبجکت یا شئ انتخاب شده در پنجره دیتابیس ( سمت چپ که لیست فرم و جداول و ... است ) را تغییر نام می دهد. برای انتخاب شئ می توانید از متد SelectObject استفاده بنمائید با بهره گیری از آرگومان InDataBaseWindow و تنظیم آن به Yes ( True )

If you leave the ObjectType and OldName arguments blank (the default constant, acDefault, is assumed for ObjectType), Access renames the object selected in the Database window. To select an object in the Database window, you can use the SelectObject method with the InDatabaseWindow argument set to Yes (True).


Docmd.SelectObject  ObjectTypeObjectNameInNavigationPane


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


DoCmd.Rename "Old Employees Table", acTable, "Employees"


Run-time error '7874':
Microsoft Access cant find the object 'Test'
مایکروسافت اکسس نمی تواند آبجکت اشاره شده را پیدا کند
یا تغییر نام دادید یا اصلا جدول یا کوئری یا فرم یا گزارش
در دیتابیس موجود نیستند.


گرفتن مقادیر انتخاب شده در سل ها ی دیتاشیت


با SelTop میشود مشخص کرد که کدام Row در بالاترین  مستطیل انتخابی در جدول ، کوئری ، دیتاشیت یا کانتینوس ف رم وجود دارد ( منظور اگر چند سل را انتخاب کرده باشید شماره ی مستطیل اول را بیان میکند بصورت  Long ) اگر کالمن انتخاب شود پراپرتی مربوطه را نمی توانید تغییر دهید.

درتصویر پائین رکوردها انتخاب شده میتوان با Me.SelHeight  تعداد انتخاب شده ها را گرفت توسط ایونت  MouseUpو ذخیره در متغیر عمومی و بعد برای نمایش مقادیر انتخاب شده

۱-ایجاد رکوردست با RecordSetClone

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

۳-تغییر موقعیت در رکوردست با پراپرتی Move که Rows آن SelTop میشود.

۴-ایجاد حلقه از یک تا جائی که به Sel برسد یا ممکنه حتی Sel-1 در این حلقه میتوان از پراپرتی Fields اون رکوردست استفاده کرد تا با MsgBox مقداراون فیلد را برگرداند .  

این روش ها درست است : فرضا اگر FLD1 کالمن اول رکوردست باشد منظور در جدول یا کوئری و از صفر شروع میشود.


("MsgBox RS.FIELDS("FLD1

( MsgBox RS(0

MsgBox RS!FLD1



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

بعبارتی گوشه ی راست پائینی مستطیل انتخابی را تعیین میکند

SelTop و SelLeft هم گوشه ی بالائی چپ مستطیل انتخاب شده میتواند چند مستطیل باشد 


برگشت تعداد رکوردهای متاثر از اکشن کوئری ها


مثل Delete یا Add 


استفاده از   متد Execute نه RunSql  و بعد پراپرتی  RecordsAffected  از CurrentDb



لیست چندی از پراپرتی های اکسس ،   پراپرتی  CurrentDb.Properties 

Name
Connect

Version
RecordsAffected  شمارش رکوردهای تحت تاثیر اکشن کوئری ها فرضا دیلیت یا اپند 
Connection
AccessVersion
StartUpForm در قسمت آپشن و این خصوصیت می توانید فرمی را برای بنمایش درآمدن در هنگام فعال کردن ماکروها اجرا کنید
StartUpShowDBWindow  منظور همان NavigationPane هست 
StartUpShowStatusBar نوار پائینی در آبجکت ها 
AllowShortcutMenus  برداشتن تیک در آپشن قسمت مربوطه یا کارنت دیتابیس یا کلاینت ستینگ باعث میشود که شورت کات هائی که در فرم یا گزارش وجود دارد و با کلیک راست اعمال می گردد غیرفعال شوند.
AllowFullMenus : فعال یا غیرفعال کردن منوهای اکسس منظور تب پیج های ریبون غیر از تب File که قابل حذف یا هاید کردن نیست
AllowBuiltInToolbars : در اکسس ۲۰۰۳ به پائین  کاربرد داشت که ToolBar شما اعمال میشد منظور منوهایی که جای ریبون موجود در ۲۰۰۳ به بالا وجود دارند.
AllowToolbarChanges
AllowSpecialKeys : فعال یا غیرفعال کردن کلید ترکیبی Alt و F11 
AppTitle   عنوان برای اپلیکیشن در TitleBar 
AppIcon  آیکون برای اپلیکیشن که روی تمام آبجکت ها اعمال خواهد شد 


بعضی از این پراپرتی ها با Docmd.SetOption قابل تنظیم است 

مطالعهhttps://docs.microsoft.com/en-us/office/vba/api/access.application.setoption

کار با رکوردست


لینکhttps://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/recordset-object-dao


از شی رکوردست برای دستکاری داده در دیتابیس در سطح رکورد استفاده میشود ( جدول یا کوئری ) 


چند تا تیپ داره یکیش SnapShot هست که ReadOnly است و قابل Edit نیست و بعدی Dynaset که Read و Write را دارد برای باز کردن رکوردست در دیتابیس جاری از متد OpenRecordset از CurrentDb استفاده میشود فرضا میخواهیم جدول یک را در رکوردست باز کنید 

***اول اظهار متغیری بعنوان رکوردست 

Dim Rs As DAO.Recordset ( اگر Object Library تیک نخورده باشد از Refrences ارور میدهد ).

***دوم ایجاد آن در بافر 

(Set Rs=CurrentDb.OpenRecordset("Table1",dbOpenDynaset

-برای دستکاری دیتا در رکورد : برای دیلیت از Rs.Delete  برای اضافه کردن از Rs.Add و برای ویرایش از Rs.Edit استفاده می کنیم و حتما باید بعد از اینها Rs.Update نوشته شود.

-برای رفتن به رکورد اول ، بعدی ، قبلی و آخر به ترتیب از

 MoveLast MovePrevious MoveNext MoveFirst استفاده می کنیم بیشتر برای لوپ زدن داخل رکوردست استفاده میشود.

***سوم  بعد از اتمام کار بستن رکوردست با Rs.Close و خالی کردن بافر از آن با Nothing

Rs.Eof  مقداری رو میده از نوع Boolean که آیا موقعیت رکورد جاری بعد از رکورد آخر هست یا خیر وقتی به آخرین رکورد برود و زمان رفتن به رکورد بعد از آن که چیزی نیست ارورمیدهد که به انتهای رکوردست رسیده  زمان خاتمه به حلقه هم از آن استفاده میشود مثل 

Do While Not Rs.Eof

("Debug.Print Rs.Field("FldName

Rs.MoveNext

Loop


-از Rs.Move برای انتقال پوزیشن رکورد جاری در شی رکوردست استفاده میشود که پارامتر اول آن Rows است 

-از Rs.AbsolutePosition برای گرفتن شماره رکورد در آن شی  رکوردست استفاده می شود.

-از Rs.FindFirst برای پیدا کردن مقدار یا عبارتی در رکوردست استفاد میشود و چک کردنش با پراپرتی بعدی یعنی NoMatch هست مثل 

     برای عدد Rs.FindFirst "FldName1=" & Me.txtValue

 برای تکست "'" & Rs.FindFirst "FldName1='" & Me.txt1


-از Rs.NoMatch برای تطابق داده ی پیدا شده با استفاده از  FindFirst استفاده میشود یعنی اگر توسط FindFirst پیدا شد چه عملی انجام دهد 

"'"  & Rs.FindFirst "FieldName='" & Me.TxtSearch 

If Rs.NoMatch=False Then 

 DO Something  ' 

End If 

- از Rs.RecordCount برای شمارش رکورد در رکوردست باز شده استفاده میکنیم البته اول باید به رکورد آخر برویم و بعد رکورداول و بعد رکوردکانت را استفاده کنیم تا درست عمل نماید.

- از Rs.BookMark بعنوان نشانگری  که به طور یونیک رکورد جاری را در شی رکوردست مشخص میکند استفاده میشود ... فرضا در ورد بعبارت ساده و قابل فهم  ، عباراتی را بعنوان بوک مارک در نظر می گیرید  ، زمان استفاده به آن صفحه ای که هست می رود . اینجا هم همینطور است فرضا در فرم رکوردی را اضافه میکنید و با استفاده از FindFirst و NoMatch و برابر قرار دادن BookMark فرم و BookMark  رکوردست میتوان به همان  رکورد در سابفرم رفت چون دیتای جدید بعد از رکورد آخر می آید 


برای ایجاد RowNumber یا LineNo  در فرم  کانتینیوس نه سینگل هم بوک مارک رکوردست با بوک مارک فرم برابر میشود و از AbsolutePosition باضافه ی یک استفاده میکنیم برای برگشت مقدار تابع فرضا 


(Function ROWNUM(FRM AS FORM

 اگر کارنت رکورد فرم مخالف رکوردکانت رکوردست بود بوک مارک رکوردست برابر بوک مارک فرم شود

ROWNUM=RS.ABSOLUTEPOSITION+1

END IF

END FUNCTION

درنظر داشته باشید شماره ی رکورد در دیتا شیت اکسس با رکوردست یکی نیست !!! 

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



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


۱-فوکس کردن روی کمبو 

۲-انجام عمل دارپ داون با کلیک کردن روی فلش پائین سمت چپ کمبو که با بازشدن لیست باکس همراه هست و تیک زدن با لفت ماوس فرضا که اگر انتخاب شده باشد برداشه و اگر نشده باشد دوباره انتخاب می شود 


روش کد نویسی 

۱-SetFocus

2-DropDown

لیست باکس آن پراپرتی ListCount دارد.

3-پراپرتی (Selected(index کمبو یا لیست باکس  برای تیک زدن یا برداشتن برابر True یا False


کمبو باکس از قسمت های زیر تشکیل شده : 

ادیت باکس ، دراپ داون و لیست باکس 


 (Me.F.Selected(i)=Not  Me.F.Selected(i

اضافه کردن ثانیه به ساعت


چون اکسس در بعضی سیستم ها ساعت را بصورت AmPm و نه حالت ۲۴ ساعته نشان می دهد بنابراین برای حل مشکل باید ماژولی نوشت که اگر Format اون Time جاری AM شد عدد ۱۲ به آن اضافه بنماید البته برای ساعات خیلی بالاتر باید ارور را رفع کرد بعد تبدیل ساعت و دقیقه به ثانیه و جمع کردن با خود ثانیه 

فرضا اضافه کردن 520 ثانیه  ( 8 دقیقه و 40 ثانیه ) به تایم زیر 


 1:14:20AM

Start ..... 131420

Dim H,M,S

(H=Mid(Start,1,2

(M=Mid(Start,3,2

(S=Mid(Start,5,2

 در اینجا 13 در 3600 و 14 در 60 ضرب شده وبا 20 جمع می گردد و با عدد 520 ثانیه در بالا جمع میشود که عدد 48180 بدست می آید برای تبدیل این عدد به ساعت دقیقه و ثانیه اول 48180 را به 3600 تقسیم می کنیم  که عدد 13 بدست می آید دوم  Remainder ( یا باقیمانده ی تقسیم  )  عدد 48180 بر 3600 را محاسبه می کنیم  وبر 60 تقسیم می کنیم  که عدد 23 میشود ( عدد دقیقه بدست آمد )  و ثانیه هم از Remainder عدد قبلی حاصل میشود یعنی  1380 منهای 22 در 60 : 0 


AMPMhttps://www.languagecentre.ir/english/vocabulary/difference-between-pm-am


ساعت ( 13) دقیقه (23) ثانیه (0)

گرفتن ولیوهای مالتیپل فیلد یا کمبوهای چک باکس دار


برای گرفتن ولیوهای داخل MultipleFieldValue باید از رکوردست ۲ استفاده کرد و پل زدن به آن فیلد و پراپرتی Value آن  فرضا فیلد  Rooz داریم و چند آیتم در آن وارد شده 



۱-باز کردن رکوردست ۱ ( جدول )

۲-تنظیم رکوردست ۲ به فیلد رکوردست ۱ ( Rooz ) و پراپرتی ولیو  (Value)


البته برای لیست شدن کلیه ی تیک خورده ها باید Loop زده شود و استفاده از MoveNext برای رفتن به رکورد بعدی در آن رکوردست 

پرینت داکیومنت یا پیج ها در اکسس


برای پرینت گرفتن ورد پی دی اف یا هر چیزی که قابلیت پرینت داشته باشد از طریق اکسس ارتباط با شل یا سا ختن آن   (Shell.Application)  است و استفاده از کامند ShellExecute که پارامتر اول آن نام و مسیر فایل است و پارامتر چهارم عبارت پرینت و آخری هم ویو است که فرضا VbHide یا VbNormalFocus و غیره است یا شماره ی آن که میشود در  Immidiate Window Ctrl+G  با علامت سوال قبل از آن ،  عدد مربوطه  رو گرفت 


پرینت  اوپن  و ادیت را میتوان اعمال کرد در ShellExecute

ساخت پراپرتی در اکسس


 (Database.CreateProperty method (DAO


پراپرتی هائی که در اکسس ایجاد نشده را میتوان از کالکشن DAO انتخاب و اضافه کرد جز کانکشن و ارورها مثل پراپرتی زیر برای بستن یا باز کردن شیفت True/False ، تا ایجاد نشن عمل نخواهند کرد و ارور هم داده خواهد شد پراپرتی نات فاوند اگر هم ایجاد بشه ارور قبلا ایجادشده را خواهد داد. 

تایپ هم مهمه مثل پراپرتی زیر که Boolean هست ولی چیزهائی که عبارتی به آن ملحق میشه از نوع dbText هست مثل AppTitle


 "Set Prp=CurrentDb.CreateProperty("AllowByPassKey

(dbBoolean,False,False,

CurrentDb.Properties.Append Prp

تبدیل میلادی به قمری


19 جولای سال 622  شروع تاریخ قمری است و مصادف با 27 تیر سال یک شمسی 

Dim D(12) As Long

D(1)=30 : D(2)=59 : D(3)=89 : D(4)=118 : D(5)=148  D(6)=177 : D(7)=207 : D(8)=236 : D(9)=266 : D(10)=295 : D(11)=325 : D(12)=354

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


در رایج‌ترین تقویم هجری قمری حسابی طی یک دوره سی ساله کبیسه منظم از قرار زیر محاسبه شده‌است:
بر اساس این کبیسه‌گیری، چنانچه باقی‌ماندهٔ حاصل تقسیم سال قمری به عدد ۳۰ یکی از اعداد (۲، ۵، ۷، ۱۰، ۱۳، ۱۶، ۱۸، ۲۱، ۲۴، ۲۶ و ۲۹) باشد، سال مذکور کبیسه و طول آن (۳۵۵ روزه) می‌باشد.


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


18 ژانویه سال 624 معادل 27 دی سال 2 ، اختلاف با تابع DateDiff اکسس بین  19 جولای 622 که شروع قمری است  تا تاریخ 18 ژانویه ی 624 موردتبدیل ما 549 روز است  که یک واحد به آن اضافه می کنیم .


در اینجا 550  از 354 بزرگتر است پس  D12 را از آن کم میکنیم میشود 195 و سال هم  بالطبع یک واحد بدان اضافه شده و 2 خواهد شد  ،  طبق آرایه ی بالا 195 بین D6 و D7 است پس کوچکتر از عدد 195 را انتخاب میکنیم  177-195 که میشود 18 ( روز )   و  عدد آرایه ی  177  6 است که آنرا باضافه ی یک می کنیم که ماه عدد 7 می شود


بنابراین سال شد 2 ماه  7 و روز هم 18 


2/4/14  -  6 جولای 623  و  28 ذی الحجه سال  ۱ قمری ، 352

2/4/15  -  7 جولای 623  و  29 ذی الحجه سال  ۱ قمری ، 353

2/4/16  -  8 جولای 623  و  1 محرم سال  2 قمری ، 354

2/4/17  -  9 جولای 623  و  2 محرم سال 2 قمری ، 355



۱۲ تیر سال ۵ شمسی معادل ۴ جولای ۶۲۶ و ۳۰ محرم (۱) سال ۵ ... اختلاف ۱۴۴۶ روز 

۷ تیر سال ۵ شمسی معادل ۲۹ جون ۶۲۶ و ۲۵ محرم (۱) سال ۵ ... اختلاف ۱۴۴۱


۲۷ تیر سال یک شمسی آغار سال قمری و ۱۹ جولای ۶۲۲ آغاز سال قمری اختلاف ها با DateDiff

                                     

1446=("Dif=DateDiff("n","7/19/622","7/4/626

Ret=Dif=1446+1=1447

 ( If 1447>354 (True

Y=2 Ret=1447-354=1093

 ( If 1093>354 (True

2=Kabiseh Y=3 Ret=1093-355=738

( If 738>354 (True

3=NoKabiseh Y=4 Ret=738-354=384

( If 384>354 (True

4=Nokabiseh Y=5 Ret=384-354=30

(If 30>354 (False

(If Ret=D(1) , M=۰ : Ret=D(1

If Ret<D(1) , M=۰ : Ret=D(1)-Ret

 ...   If

  ...   If

M=M+1

تا زمانی لوپ ادامه می یابد که Ret کوچکتر مساوی (D(M شود

Ret=30 , M=1

Year : 5  , M : 1 , D : 30 

۳۰ محرم سال ۵

تبدیل میلادی به قمری

باحسابhttps://www.bahesab.ir/time/conversion/


لینک بالا ۱۴۳۶ تا ۱۴۳۸ را کبیسه ی قمری نشان میدهد در حالیکه در تقویم های آنلاین دیگر ۱۴۳۶ کبیسه ولی ۱۴۳۷ کبیسه نیست  ؟؟!!!! ولی ما بر حسب همان رایج استفاده می کنیم که قابل اعتمادتر است . انشالله باحساب توضیح قانع کننده برای کبیسه بودن ۳ سال پشت سر هم در سایتش داشته باشد ..( ۲۰ رمضان )






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

اختلاف بین ۱/۱/۱ تا ۱/۱۲/۲۹ عدد ۳۶۴ است که در اینجا عدد ثابتیست 

عدد ۳۲۹ و ۳۱۵  کبیسه های از سال ۶۲۲ تا ۱۹۷۷ و ۱۹۲۰ هستند باید حتما با ۳۶۵ جمع شوند 


این دست نویس ها ارزشمند هستند در صورت صفر شدن باید تغییر رویه داد 


روزهای سپری شده از اول سال شمسی تا تاریخ موردنظر

مثال های زیر در ایجاد تقویم شمسی کمک خواهند کرد فقط با محاسبه ی روزهای سپری شده از جمعه ۱/۱/۱ 


از جمعه ۱/۱/۱  تا دوشنبه ۱۳۹۸/۲/۳۰   میشود ۵۱۰۳۰۳


510303 mod 7 = 3    

اگر مانده ی تقسیم صفرشد یعنی جمعه هست ... ۳ یعنی دوشنبه 

۱۳۷۸/۱۰/۱۱    :  ۵۰۳۲۲۴  

معادل شنبه یک ژانویه ی ۲۰۰۰

503224 mod 7 = 1

یک یعنی شنبه


۱۳۷۹/۱۰/۱۲ : ۵۰۳۵۹۰     

معادل دوشنبه ۱ ژانویه ۲۰۰۱

۵۰۳۵۹۰ mod ۷ = ۳

۳ یعنی دوشنبه


۱۳۵۷/۶/۲۰ : ۴۹۵۴۴۲

معادل  دوشنبه ۱۱ سپتامبر ۱۹۷۸ 

۴۹۵۴۴۲ mod ۷ = ۳

۳ یعنی دوشنبه


۱۲۹۸/۱۰/۱۰ : ۴۷۴۰۰۴

معادل پنج شنبه ۱ ژانویه ۱۹۲۰

۴۷۴۰۰۴ mod ۷ = ۶ 

۶ یعنی پنج شنبه


۱۳۹۸/۱/۱ : ۵۱۰۲۴۳

معادل پنج شنبه ۲۱ مارس ۲۰۱۹

۵۱۰۲۴۳ mod ۷ = ۶ 

۶ یعنی پنج شنبه


لینک محاسبه گر روز و اختلافhttps://www.bahesab.ir/time/age/ 


لینک مانده ی تقسیمhttps://www.omnicalculator.com/math/modulo  

WndProc



 :  WndProc

case WM_INITDIALOG

ShowWindow GetDlgItem(hDlg,IDOK),SW_HIDE

hBitmap1=CreateWindowEx(WS_EX_TRANSPARENT,"Button","Login", WS_VISIBLE Or WS_CHILD Or BS_BITMAP,60, 150,100, 25,hDlg,(HMENU)IDC_BUTTON2, NULL, NULL

(

(hdc = GetDC(hDlg

  (hMemDC = CreateCompatibleDC(hdc

(hBitmap = CreateCompatibleBitmap(hdc,120,25

  SelectObject hMemDC,hBitmap 

(SetDCBrushColor hMemDC,RGB(212,208,20

Dim r As RECT

r.left = 0
  r.right = 120
  r.top = 0
  r.bottom = 25

  (FillRect(hMemDC,r,GetStockObject(DC_BRUSH

  DeleteDC hMemDC

  ReleaseDC hDlg,hdc

بارکد 128C



Code 128C 

Data - 345678

Data Characters345678
Multiply each of the two digits with an increasing weight.
Weight*1*2*3
Sum :(34*1) + (56*2) + (78*3) = 380
For Code 128C, add an additional of 105 to the sum above
Total380 + 105 = 485
Modulo 103 Check Character:485 % 103 = 73 (which maps to the character 'i')

غیرفعال کردن کلوز باتن پنجره ی اکسس ( 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 


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


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