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

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

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

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

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

تبادل داده در Vba و ماکروها با آبجکت Tempvar


-روش مناسب برای تبادل دیتا بین Vba و ماکروها .


-TempVars کلا ۲۵۵ آیتم را ذخیره می کند اگر با Remove حذف نشود در حافظه باقی می ماند تا زمانیکه دیتابیس بسته شود( منظور اگر تعداد بیش از ۲۵۵ باشد چرا چون جایگزین نمیشود  )


 فرض کنید میخواهید نام یوزر را در زمان باز بودن دیتابیس در Vba یا ماکروها ( SetTempVars) استفاده کنید ، در فرم لاگین پس از معتبر بودن پسورد می توانید نام یوزر که در اینجا بنام User هست را در txtUser ذخیره کنید که در حافظه باقی بماند و در طول برنامه هر جائی که لازم بود فراخوانش کنید روش بصورت زیر است آن را Add می کنیم 

TempVars.Add "txtUser",Me.User

برای حذف متغیر تخصیص شده به اسم txtUser کافیست از متد  Remove بجای  Add استفاده کنیم 

آپشن باتن ( رادیو باتن ، چک باکس )


فرض کنید فیلد جنسیت ( کمبوباکس شامل مرد و زن )  را در فرم میخواهید بصورت باتن  های انتخابی در فریم  نمایش دهید  ، کاری که می بایست انجام دهید اینست که کنترل فریم  از تب دیزاین  و گروه کنترلز (  Controls ) را انتخاب کرده و به روی فرم بکشید و رها کنید اگر ویزارد یا همان عصای جادوئی فعال باشد از شما نام آیتم ها و بعد نوع باتن ( چک باکس یا رادیو باتن ) را میخواهد بعد از اتمام ( دستی هم میشود پراپرتی ها ی هر کدام را تغییر داد منظور کپشن باتن ها )  روی فریم در حالت دیزاین فرم کلیک کرده پنجره ی پراپرتی را باز بنمائید در تب Data پراپرتی  ControlSource را نام فیلد جدول جنسیت قرار بدهید بعد از انجام می بینید که بعد از انتخاب در جدول بجای رکورد های مرد یا زن در آن فیلد آپشن ولیوی آن قرار گرفته .

 درزمان باز کردن فرم ( سینگل !!!) و جابجاشدن در رکوردها اتومات جنسیت طبق چیزی که در آن  رکورد درج شده در آن فریم نمایش داده خواهد شد .    OptionValue 

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


ListBox.Properties


 :   ListCount

شمارش ردیف های داخل لیست باکس

  :  ListIndex

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

   : ItemData

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

(ListBox.ItemData(Listbox.ListIndex

 : (Selected(lRow

چک میکند آیا انتخاب شده یا خیر ، فرضا بخواهید ردیف موردنظر انتخاب شود (  lRow از صفر شروع می شود مهندسان عزیز!!!)

ListBox.Selected(4)=True

: ItemSelected

برای فعال کردن حالت چند انتخابی ردیف ها ی یک لیست باکس  ، از پنجره ی پراپرتی خود کنترل ، پراپرتی MultiSelect را به حالت Simple یا Extended تنظیم بنمائید.

این پراپرتی خودش دو تا پراپرتی دارد به نام های Count و Item و متدی ندارد.

مثال برای شمارش آیتم های سلکت شده : (محدودیت ر دیف های ایجادشده حدودتقریبی ۶۴۰۰۰ ردیف )

 Dim C As Long

۱-C=ListBox.ItemSelected.Count

برای گرفتن آیتم های سلکت شده هم میتوان توسط تابع  For...Next و لوپ زدن در کانت آن که به متغیر C ارسال شده  اقدام نمود ...  گرفتن دیتای آیتم  : (LISTBOX.ITEMDATA(LISTBOX.LISTINDEX که در پراپرتی مربوطه بدان اشاره گردید.

 : (Column(Index,IRow

برای ارجاع به کالمن مشخص شده  که هر دو از صفر شروع میشوند تاکانت Index یا IRow منهای یک 

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

(LISTBOX.COLUMN(1,4

: ColumnCount

برای شمارش کالمن های لیست باکس یا لیست باکس کمبو استفاده میشود ( کانت منهای یک !!! )

فرضا برای گرفتن دیتاهای کل کالمن ها در ردیف مورد نظر در کانت کالمن منهای یک لوپ ایجاد شده و طبق پراپرتی کالمن آیتم ها نمایش یا پرینت خواهد شد.

: ColumnOrder

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

: BoundColumn

دیتای کالمنی که باید در جدول اعمال شود فرضا سه ستون دارید میخواهید اطلاعات کالمن ۳  و ردیف انتخاب شده در جدول ثبت شود باند را روی ۳ میگذارید که در حصر کالمن ۳ فقط باشد برای عدم نمایش کالمن های دیگر پراپرتی ColumnWidth است که میتوانید آنرا صفر کنید فرضا اگر ۳ ستون داشته باشید و فقط بخواهید ستون سوم را ببینید در پنجره ی پراپرتی لیست باکس و پراپرتی ColumnWidth  تایپ کنید   1;0;0   .. یک منظور کالمن آخر ۱ اینچ باشد .

: ColumnHeads

برای نمایش هدر لیست باکس ( تیتر ، عنوان ستون ها  فقط در یک ردیف ) در لیست باکس یا لیست باکس کمبو استفاده میشود 

مدیریت دستگاه های تصویری متصل به کامپیوتر


باید با CreateObject انجام شود 


("CreateObject("Wia.DeviceManager


Properties




Deviceinfos Properties 






Set DevMgr = New WIA.DeviceManager
    For ii = 1 To DevMgr.DeviceInfos().Count
        Debug.Print "DevMgr.DeviceInfos(" & ii & ").Properties!Name.Value = " & DevMgr.DeviceInfos(ii).Properties!Name.Value
        If DevMgr.DeviceInfos(ii).Properties!Name.Value = MyScanner Then Set DevInfo = DevMgr.DeviceInfos(ii)
    Next ii
    
    ' ---
    Set dev = DevInfo.Connect
        
    ' ---
    Set img = dev.Items(1).Transfer(ImageFormat)
 


اقساط وام


تخصیص اقساط وام مشتری بمبلغ 3,800,000 بمدت 36 ماه در جدول LoanDetail ( جزئیات وام دریافتی توسط اشخاص )



105,555.555=36÷3,800,000


105555=36\3,800,000

      باقیمانده ی تقسیم یا  مود با فاصله    !!!     3,800,000Mod36=20


   105000=1000×(1000\(36\3,800,000))

555=1000×(1000\((36\3,800,000)))-(36\3,800,000)


125000=36×1-105000+20+555

3,675,000=35×2-105000


طبق عملیات بالا قسط اول میشود 125000 و قسط دوم تا 36میشود 105000 و بنابراین در جدول LOANDETAIL که شامل CUSTOMERID LOANID LOANNUM LOANDT AMOUNT هست طبق زیر اپند را انجام می دهیم فرم ورود اطلاعات ایجاد اقساط وام FRM_LOAN هست .


 زمان ایجاد اقساط وقتی طبق آیدی مشتری و آیدی وام  که در جدول واسط ایجاد شده در جدول LOANDETAIL رکوردی ثبت نشده و تابع DLOOKUP نال ولیو ( NULL ) را برمی گرداند نتیجتا قسمت دوم در تابع DLOOKUP که FALSE است اجرا شده و قسط اول 125000 اپند میشود و زمان اپند کردن قسط دوم به آخر چون رکورد ایجادشده و دیگر NULL نیست قسمت TRUE اجرا خواهد شد که همان 105000 می باشد اپند در بین حلقه ی FOR.... NEXT قرار می گیرد فرضا اگر کوئری اپند APP_LOANDETAIL باشد میشود : 


DIM I AS INTEGER

FOR I=1 TO ME.PERIOD

DOCMD.SETWARNINGS FALSE

"DOCMD.OPENQUERY "APP_LOANDETAIL

DOCMD.SETWARNINGS TRUE

NEXT


اکسپرژن مربوط به اضاف کردن مبلغ هر قسط در جدول دیتیل اقساط ...  محدودیت تعداد  کاراکتر در اکسپرژن ،  ۱۰۲۴ کاراکتر است .



(IIf ( expr , truepart , falsepart

)Iif

Dlookup("Amount","LoanDetail","CustomerId & LoanId=" & 

(forms!loan!CustomerId & forms!loan!LoanId

,

 (forms!loan!Amount\forms!loan!period)\1000)×1000))

, 

(forms!loan!Amount\forms!loan!period)\1000)×1000))

forms!loan!period×((forms!loan!Amount\formd!loan!period)+

-(forms!loan!Amount\formd!loan!period)\1000)

forms!loan!Amount Mod forms!loan!period+

(




با پیش پرداخت 50,000 



برای AddMonth بدون درنظر گرفتن کانتریا سال کبیسه کافیه توسط  تابعی سال ماه و روز را گرفته و به ماه یک عدد اضافه کنیم در خط بعد اگر ماه از ۱۲ بزرگتر شد ماه یک میشود و سال یکی بدان اضافه خواهد شد روز هم همان در نظر گرفته میشود فقط تنها مشکل اینه که اگر فرضا سالی کبیسه نباشد و کسی ۳۰ بهمن وام گرفته باشد با توجه به تابع بالا قسط اول ۳۰ اسفند میشود درصورتیکه اسفندماه ۲۹ روز ه هست پس سعی کنید بازه ی وام بین ۱ تا ۲۹ آن ماه باشد حتی فرض کنید کسی وامی را ۳۱ شهریور گرفته باشد در اینصورت طبق روش بالا میتوانیم برای رفع این مشکل بگوئیم اگر ماه بزرگتر از ۶ شد و اگر روز بزرگتر از ۳۰ بود همان ۳۰را درنظر بگیرد 

گرفتن پنجره ی فعال ( API )

ویندوز یوزر Windows User  کامپوننتی است که توابعی را بر ای ایجاد رابط کاربری User Interface  فراهم میسازد فرضا ایجاد پنجره ی جدید یا تغییر استایل پنجره یا برداشتن منوهای سیستمی و ارسال مسیج ها به آن و ایجاد کنترل ها  ... یا بعبارت دیگر اتصال به سایر اپلیکشن ها .

64Bit'

Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr

ارسال کامند به Device ( دوربین )

 متد (Device.ExecuteCommand(CommandID



برای گرفتن عکس توسط دوربین اول انتخاب Device با متد ShowSelectDevice و بعد ارسال کامند به آن دستگاه 


 : CommandID

wiaCommandTakePicture


ppResult = .ShowSelectDevice( _
  [ ByVal DeviceType As WiaDeviceType ], _
  [ ByVal AlwaysSelectDevice As VARIANT_BOOL ], _
  [ ByVal CancelError As VARIANT_BOOL ] _
) As HRESULT

Boolean منظور استفاده از True یا False

: WiaDeviceType
   UnspecifiedDeviceType  0 
ScannerDeviceType      1 
CameraDeviceType       2 
VideoDeviceType        3 


اسکنر کار با WIA در رفرنس اکسس (یوزر اینترفیس )


CommonDialog Object


محتوی تمام متدهایی است که UI ( رابط کاربری یا  User Interface ) را نشان میدهد و باید  "WIA.CommonDialog" با CreateObject ساخته شود یا CommonDialog در فرم آورده شود.


Methods


ShowAcquireImage

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

ShowAcquisitionWizard

ویزارد اسکنر و دوربین را فعال می کند ( نمایش )

ShowDeviceProperties

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

ShowItemProperties

نمایش آیتم های دیالوگ باکس دستگاه یا Device مربوطه 


باز شدن پنجره ی  اسکنر  


Dim Img 

Dim CommonDialog1

Set CommonDialog1=CreateObject("Wia.CommonDialog

Set Img = CommonDialog1.ShowAcquire

(Img.SaveFile (Img


میشود لوپ زد و پراپرتی های مربوطه رو گرفت   For Each Prp In


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


objImage.SaveFile strPath ' save into temporary file
' Insert in Word Document
Selection.InlineShapes.AddPicture 

strPath



'Requires a reference to Microsoft Windows Image Acquisition Object Library




Dim Img 'As ImageFile _ )Set Img=CommonDialog1.ShowAcquireImage

_ ,UnspecifiedDeviceType

_ ,TextIntent

_ ,MaximizeQuality

( wiaFormatGIaf




(ScanDev=CommonDialog1.ShowSelectDevice(1,False,False

("Set img=CreateObject("Wia.ImageFile

      (ScanDev.Items(1).Transfer(WiaFormatBMP


چیدمان کالمن ها در دیتاشیت با ColumnOrder


طبق مثال زیر البته در حالت دیزاین هم در ریبون در تب Order میشود Rearrange را انجام داد.


Me.Student_ID.ColumnOrder = 1
Me.Family_Name.ColumnOrder = 2
Me.Preferred_Name.ColumnOrder = 3


Start  Module----

Set frm =Screen.ActiveDatasheet.Form


index=1

لوپ در داخل فیلدهای کوئری                    Start  Loop '

       (Set ctl = frm.Controls(fld.name
ctl.ColumnOrder = index

index=index+1

      End Loop '

End Module----



   (Private Sub Id_DblClick(Cancel As Intege

Me.Id.ColumnOrder = 1
Me.OrderID.ColumnOrder = 2
Me.ProductID.ColumnOrder = 3
Me.UnitPrice.ColumnOrder = 4
Me.Quantity.ColumnOrder = 5
End Sub

چیدمان کالمن ها در دیتاشیت با ColumnOrder


طبق مثال زیر البته در حالت دیزاین هم در ریبون در تب Order میشود Rearrange را انجام داد.


Me.Student_ID.ColumnOrder = 1
Me.Family_Name.ColumnOrder = 2

Me.Preferred_Name.ColumnOrder = 3



(Set ctl = frm.Controls(fld.name
        ctl.ColumnOrder = index

کپی کردن رکوردست در شیت اکسل ( بازیابی اطلاعات Extract )



برای کپی کردن محتویات شی رکوردست  (ADO یا DAO ) در گوشه ی بالائی سمت چپ رنج مشخص شده در شیت اکسل استفاده میشود 


public int CopyFromRecordset (object Data, object MaxRows, object

MaxColumns);


که Data همان متغیر نسبت داده شده بعنوان رکوردست است ، MaxRows ماکزیمم ردیف هایی که باید داخل شیت کپی شود و MaxColumns ماکزیمم تعداد فیلدهایی که میخواهیم در شیت اکسل کپی شود.


فرضا


Dim Rs As RecordSet

Dim Sql As String

("Sql="Select * From Query1

(Set Rs=CurrentDb.OpenRecordset(Sql


درقسمت پائین اول باید آبجکت Excel.Application ساخته شود بعد اضافه کردن WorkBook به اپلیکیشن و استفاده از پراپرتی های مربوطه مثل Range یا Cell


Dim Wk As Object

Set Wk=XlObj.WorkBook.Add

Wk.Sheets(1).Range("A3").CopyFromRecordset Rs


برای کپی کردن فیلدها هم میشود در همان ماژول اگر جدول یا کوئری پراپرتی کپشن داشته باشد و فارسی آن فیلد را درآن ذخیره کرده باشیم با یک لوپ زدن داخل فیلدهای رکوردست (Rs.Fields ) به Cell مربوطه در آن شیت اکسل کپی کرد مثل 


Dim Fld As Fields

.

("Wk.Sheets(1).Cells(2,i)=Fld.Properties("Caption

.



نمونه هائی از پراپرتی های مورد استفاده

xlsh.UsedRange.Borders.Weight = 2

xlApp.Application.Columns.AutoFit

xlApp.displayalerts = False

xlwk.saveas "D:\" & Me.Name & ".xlsx"

xlApp.Quit


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



Recordset.GetRows


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


(varRecords(intField, intRecord


طبق تصویر پائین دومی Start و سومی شماره ی ردیف

 است


(array= recordset.GetRows(Rows, Start, Field




"strSQL="SELECT FirstName,LastName,Title FROM Employees
(Set rstEmployees=CurrentDb.OpenRecordset(strSQL,dbOpenSnapshot
(varRecords = rstEmployees.GetRows(3
intNumReturned = UBound(varRecords, 2) + 1
intNumColumns = UBound(varRecords, 1) + 1



-یا کد زیر را در نظر بگیرید که رکوردها را داخل آرایه می ریزد.
Dim Values As Variant
Values=Rs.GetRows

مثال زیری باز کردن رکوردست به اسم recSales و استفاده از Ubound برای گرفتن
بالاترین عدد آرایه هم تعداد فیلدها هم تعداد ردیف ها

(2)varValues = recSales.GetRows
    (intFieldCount = UBound(varValues, 1
   (intRowCount = UBound(varValues, 2
گام بعدی ایجاد لوپ در RowCount و دوباره ایجاد لوپ در FieldCount و گرفتن دیتاهای رکورد 

خروجی به فرمت های Excel Pdf Rtf



ObjectTypeObjectNameOutputFormatOutputFileAutoStart

                                                                               


                                                         نوع آبجکت  :  ObjectType

acOutputQuery

       acOutputTable

acOutputForm

             acOutputReport

               

      نام آبجکت : فرم کوئری فرم یا گزارش : ObjectName

  

    فرمت خروجی  : OutputFormat 

acFormatRTF
acFormatPDF
acFormatTXT
acFormatXLS
acFormatXLSX
acFormatXLSB

  نام فایل یا مسیر ونام فایل  : OutputFile


خروجی جدول Employees  به فرمت ( rtf ( Rich Text  و True هم که بعد از ایجاد فایل rtf بنام Employee.rtf باعث نمایش آن در اپلیکیشن می شود .


 _ , "DoCmd.OutputTo acOutputTable, "Employees

 acFormatRTF, "Employee.rtf", True


مثال بعدی : خروجی کوئری به اکسل ۲۰۰۷ که فرمت xls هست و بعد نمایش آن  .. در صورت خالی گذاشتن مسیر کامل فایل خود اکسس برای نام و مسیر آن سوال می کند.


 _ ,"DoCmd.OutputTo acOutputQuery,"YourQueryName

                                                                                          acFormatXLS,,True



تغییر مقادیر پراپرتی های کنترل در فرم یا گزارش با ControlType


استفاده از   ControlType Propert 


در مثال زیر در کنترل های فرم  لوپ زده میشود فقط مورد Lable که با acLabel مشخص شده  و پراپرتی SpecialEffect و BorderStyle را عوض میکند ... کد را کپی نکنید اول خط به خط یاد بگیرید بعد مستفیذ شوید 


For Each ctl in frm.Controls
With ctl
انتخاب موارد تیپ کنترل Select Case .ControlTpye

مورد لیبل Case acLabel

اگر پراپرتی اسپشیال افکت برابر ثابت Shadow بود

If .SpecialEffect = acEffectShadow Then

اسپشیال افکت لیبلی که Shadow بود به نرمال تبدیل میشود

SpecialEffect = acEffectNormal

بوردر لیب هم فرضا اگر ثابت Transparent بود به Solid تغییر می یابد
BorderStyle=1
Else
End if
End Select
Next







ConstantControl
acBoundObjectFrameBound object frame
acCheckBoxCheck box
acComboBoxCombo box
acCommandButtonCommand button
acCustomControlActiveX (custom) control
acImageImage
acLabelLabel
acLineLine
acListBoxList box
acObjectFrameUnbound object frame or chart
acOptionButtonOption button
acOptionGroupOption group
acPagePage
acPageBreakPage break
acRectangleRectangle
acSubformSubform/subreport
acTabCtlTab
acTextBoxText box

ساخت دیتابیس جدید


(DBEngine.CreateDatabase method (DAO


اسم دیتابیس نهایتا ۲۵۵ کاراکتر است حتی Space و اگر آدرس در شبکه باشد باید طبق مدل زیرعملنمود.

"Server1\loc1\db1.accdb\\"
()Private Sub cmdCreate_Click
Dim db As DAO.Database
(Set db = CreateDatabase("Exercise.accdb", dbLangGeneral
End Sub
در مثال بالا اگر بخواهید پسورد دار بسازید باید بعد از زبان جنرال از فرمت زیر استفاده کرد . در قسمت آخر این متد که Option هست میتوان از متغیرهای ثابت مثل dbVersion120   یعنی file format 12.0 یا dbEncrypt که معرف ساخت دیتابیس Encrypt شده استفاده کرد

"dbLangGeneral & ";pwd=NewPassword

البته با  Access.Application و NewCurrentDatabase هم میتوان بلنک دیتابیس ساخت 

(NewCurrentDatabase ("D:\dbs1.accdb",acNewDatabaseFormatAccess12.  

مقدار Constant فرمت Accdb در اکسس ۱۲ هست 

رفرنسی که باید تیک بخورد برای استفاده از متد DAO   طبق شکل زیر Microsoft Access Object Library  است.

اکسپورت آبجکت ذخیره شده به فایل Txt


برای اکسپورت از متد Docmd.TransferText استفاده می کنیم 


DoCmd.TransferText acExportDelim,"Standard Output   "External Report", "C:\Txtfiles\April.doc,"


مثال بالا جدول External Report  از دیتابیس اکسس که با نام Standard Output با Docmd.RunSavedImporExport ذخیره شده است را به فایل April  اکسپورت میکند با جداکننده.


البته مثل تصویر بالا حتما Import یا Export را بصورت قرار دادی مشخص کنید تا اشتباه نگیرید 



acExportDelim2Export Delimited
acExportFixed3Export Fixed Width
acExportHTML8Export HTML
acExportMerge4Export Microsot Word Merge
acImportDelim0Import Delimited
acImportFixed1Import Fixed Width
acImportHTML7Import HTML
acLinkDelim5Link Delimited
acLinkFixed6Link Fixed Width
acLinkHTML9Link HTML

                                                                        
              

حذف فیلتر/اعمال فیلتر



برای حذف فیلترهای اعمال شده در جدول ، کوئری یا مجموعه ای از رکوردها در فرم یا سابفرم از متد زیر استفاده می شود.



DoCmd.ShowAllRecords





برای فیلتر کردن فرضا مجموعه ای از رکوردها در سابفرم یا کانتینیوس فرم از متد زیر استفاده خواهیم کرد . در کل برای رکوردهای جدول کوئری فرم فعال و فوکس شده . زمان لود شدن آبجکت بصورت اتومات اعمال میشوند بنابراین پراپرتی FilterOnLoad را برابر True قرار دهید.      


کد زیر آبجکت فعال را فیلتر می کند تا اینکه فقط رکوردهایی را نمایش دهد که با NWTB شروع شوند .

_  " Docmd.SetFilter , "[Product Code] Like
"""*NTWB"

از Docmd.ApplyFilter هم میتوان بهره برد.

اعتبارسنجی تاریخ شمسی


Function CheckValidShamsiDate(Dt) As Boolean 

اگر فرمت بدین شکل باشد و / در فیلد ذخیره شود و سال هم چهار رقمی باشد               0000/00/00

 

((Y=Val(Mid(Dt,1,4

((M=val(Mid(Dt,6,2

((D=Val(Mid(Dt,9,2


If Y<1 And Y>2500 Then

CheckValidShamsiDate=False

End if


Select Case M 

     Case 1 To 6 

        If D>31 And D<1 Then 

         CheckValidShamsiDate=False

       End if 

      Case 7 To 11

      If D>30 And D<1 Then 

        CheckValidShamsiDate=False

      End if

     Case 12 

     If KabisehShamsi(Y)=True Then

    If D>30 And D<1 Then CheckValidShamsiDate=False  

Else if KabisehShamsi(Y)=False 

    If D>29 Abd D<1 Then CheckValidShamsiDate=False  

        End if

End Select


تابع بالا را میتوان در رویداد Exit تکست باکس نوشت که اگر False شد Cancel برابر True شود. چک کردن سال کبیسه ی شمسی هم مفصل در جای دیگر بحث شده.

بلنک رکورد یا لاین خالی در گزارش ( حقه )



برامون پیش اومده که وقتی فاکتور صادر می کنیم میخواهیم  یه چیزی شبیه فاکتور باشه یا مثل اکسل ردیف ها را تا آخر در پرینت ببینیم ... فرض کنید شما تو فاکتورتون ۳ آیتم داریم ولی خط و خطوط باید تا پائین صفحه ی گزارش رسم بشه اگر نخواهید کنترل ها را بصورت Grow استفاده کنید ( منظور اگر شرح بیشتر شد از عرض کنترل اون کنترل  تعریض یا اکسپند میشه تا محتویاتش رو راحت ببینیم )  می تونید امتحان کنید که در ارتفاع دیتیل در گزارش چقدر لاین جا می گیره به نسبتش یه کوئری ایجاد می کنید با آیدی از فرضا 1 تا ۴۰ و فیلدی  که تماما خالیه بعد زمان باز شدن گزارش می گید که اون منبع گزارشتون با کوئری ساخته شده تجمیع بشه Union و بعد در شرط کوئری که ساختید و در یونیون استفاده می کنید می نویسید که  آیدی  هایی رو لیست کنه که کانت منبع گزارش ( با استفاده از تابع Dcount )  


فرض مثال جدول  فاکتور شامل فیلدهای زیر باشد 

FactorNo PartNo Desc Qty UnitPrice Totals 

ایجاد جدول بصورت  بنام BlankFactor شامل فیلدهای 

BlankId BlnkDesc 

در یونیون حتما باید تعداد فیلدهای جدول یکی باشن اسامی فیلدها مهم نیست فقط دیتا تایپشون مغایرت نداشته باشه !!!


Select * From tblFactor 

                      Union All

در سلکت زیر چون بایدتعداد فیلدها با تعداد فیلدهای سلکت بالائی یکی شود به تعداد باقیمانده از دابل کوتیشن استفاده کردیم 

 "","","","","",Select BlankDesc

Where BlankId>Dcount("*","tblFactor,"FactorID=" & tblFactor.FactorNo  


در مثال فوق اگر شماره ی فاکتور را از باکسی در فرم بگیرد باید در شرط جای tblFactor.FactorNo آدرس کنترل در فرم یا سابفرم اعمال شود در اینجا شماره فاکتور ، دیتا تایپ  نامبر گرفته شده که سرعت بالاتری در سرچ نسبت به دیتا تایپ تکست دارد 


Forms!Form1!txtFactorNo

پراپرتی نمایش بلنک رکورد در گزارش


Report.NextRecord Property


Property NextRecord مشخص می کند که آیا سکشن مربوطه باید به رکورد بعدی پیش برود یا خیر که بصورت Boolean هست و در رویداد OnFormat قرار داده می شود .


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


فرض کنید هر ۱۰ خط یا Line را در گزارش ( پرینت پرویو ) می خواهید جدا کنید ( توضیح واضح تر بعد از هر رکورد یک جای خالی باقی بگذارد یعنی به رکورد بعدی پیش نرود و بعد از آن لاین خالی دوباره رکوردها نمایش یابند ) یک کانتر در رویداد OnPrint دیتیل آن درست می کنید که اگر اون کانتر Mod ده برابر صفر شد NextRecord ترو شود PrintSection را هم می توانید ترو کنید ... برای ریست شدن کانتر از رویداد Format سکشن Header استفاده کنید که کانتر را صفر کند.


  البته در مورد بالا باید یک نشانگر قرار دهید که اگر آن نشانگر برابر False شد آن سکشن رکوردها را طبق کانتر نمایش دهد و در صورتیکه به ۱۰ رسید به رکورد بعدی نرود و جای خالی بیاندازد یا بعبارتی  رکورد بعد از لاین ۱۰ در خط بعد از آن جای خالی قرار گیرند. (   وقتی امتحان کنید لاین  بعدی که نباید رکورد بعد از ده قرار گیرد همان  تکرار رکورد ۱۰ است )

ایجاد کوئری در اکسس QueryDef


شی QueryDef یک تعریف ذخیره شده ای از کوئری در موتور دیتابیس اکسس هست که ازآن برای ساخت کوئری استفاده خواهد کرد . ( و حتی مقداردهی پارامتر ) 


Dim Qry As QueryDef

Set Qry=CurrentDb.CreateQueryDefs("Select * From

("Table1 Where Id>=14

استفاده از پارامتر 

Dim qdf As QueryDef

("Set qdf = dbs.QueryDefs("myActionQuery

                            Set the value of the QueryDef's parameter'

تنظیم مقدار یا مقداردهی پارامتر

_ =qdf.Parameters("Organization").Value

"Microsoft"

کامندهای اجرائی در اکسس RunCommand

....Docmd.Runcommand acCmd


acCmdZoom100

acCmdUndo

acCmdSelectRecord

acCmdSelectAll

acCmdSaveRecord

acCmdRowHeight

acCmdRemoveAllFilters

acCmdRefresh

acCmdRedo

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

acCmdRecordsGoToFirst

acCmdRecordsGoToLast

acCmdRecordsGoToNew

acCmdRecordsGoToNext

acCmdQueryTotals

acCmdPrintPreview

acCmdPrint

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

acCmdCopy

acCmdCut

acCmdPaste

acCmdDelete

acCmdLayoutView

acCmdFind    باکس Search Find 

acCmdExportText

acCmdExportAccess

acCmdDesignView

acCmdDeleteRecord

acCmdDeleteRows

acCmdDataEntry

acCmdControlMarginsNarrow

acCmdCloseDatabase

acCmdCloseWindow

acCmdCloseAll

acCmdClearAll

acCmdChangeToComboBox

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

acCmdAppMaximize

acCmdAppMinimize

acCmdAppMove

acCmdAppRestore

ساخت شورتکات منو در اکسس ۲۰۱۶



شورتکات : 

سه تا کامند باتن در کامندباربصورت MsoPopup برای پرینت ، رفرش و بستن فرم ContactList




اسم ماکروی بالا mcrAddShortcutMenu را در قسمت پراپرتی ShortCutMenu تایپ می شود با AddMenu در Add-In ریبون قابل مشاهده هست.



کامند باتن در CommandBar و ساب منو بهمراه کامند ها



بصورت زیر نمایان خواهد شد. برای ایجاد ساب منو در تصویر بالا  از AddMenu استفاده شده و یک ماکروی با نام SubMenuCommands با فرمان ساب ماکرو داخلش ساخته شده و در MacroName اظهارشده .



 در باکس ادیت  SubMacro می توان  از کلیدهایی برای انجام کارهائی استفاده کرد یا عملکرد آنها را غیر فعال کرد  فرضا     p^ منظور Ctrl+p هست  فرضا شما می خواهید فرمان انجام نشود در نتیجه در خط بعدی CancelEvent را می توانید انتخاب و ماکرو را با عنوان AutoKeys ( فقط به این نام ) ذخیره کنید.


در سطح پیشرفته تر یعنی استفاده از Commandar.Controls Properties باید حتما از رفرنس Microsoft Object Library انتخاب شود تا بتوانید از  پراپرتیهای آن استفاده نمائید.


https://docs.microsoft.com/en-us/office/vba/api/office.commandbar.controls


سطح دسترسی User Level

نمونه ای از سطح دسترسی 



()Private Sub Form_Load
Dim sPermit As String
Dim iAccess As Integer
Dim Ctl As Access.Control
("Me.txtUser = Environ("username
If IsNothing(Me.txtUser) The
"sPermit = "ReadOnly
Else
"sPermit = "ReadOnly
Select Case sPermit
(sPermit = GetPermission(Me.txtUser
End If
iAccess = 3
"Case "Edit
iAccess = 2
"Case "Admin
Me.txtLevel = iAccess
Case Else
iAccess = 1
End Sub
End Select


()Private Sub Form_Load
If Forms!frmMenu!txtLevel < 11 Then
Me.AllowEdits = False
Else
Me.AllowEdits = True
End If
End Sub
(Private Function GetPermission(sUser As String
_ & "'= If (IsNothing(DLookup("Permissions", "tblStaff", "Login
Forms!frmmenu!txtUser & "'"))) Then
"GetPermission = "ReadOnly
Else
_ & "'=GetPermission = DLookup("Permissions","tblStaff","Login
"'" & Forms!frmmenu!txtUser
End if
End Function


نمونه ی تصویری



جستجو ( DlookUp )در جدول یا کوئری

مثال زیر از متغیر intSearch برای گرفتن مقدار ( عددی ) استفاده می کند که بعنوان integer یعنی حدود ۵ رقم نهایتا تعریف میشود اگر عدد بزرگتر باشد از Long استفاده کنید 

نکته : در پنجره ی immediate window وقتی میخواهید عددی را در عدد دیگری ضرب کنید چون پیش فرض integer می گیرد پیغام Overflow را نمایش می دهد که باید آنرا به Long تبدیل یا Convert کنید فرضا      200 *(Clng(1356 ?


Dim intSearch As Integer
Dim varX As Variant
intSearch = 1
_ ,"varX = DLookup("[CompanyName]", "Shippers
("[ShipperID] = " & intSearch]"

در مورد بالا نام کمپانی را از جدول/ کوئری Shippers درصورتیکه مقدار ShipperID آن برابر متغیر اظهارشده بود( یعنی یک ) بازیابی میکند اگر Null باشد ارور Null را بر می گرداند پس صحیح است که بعد ازآن به نمونه روش ذیل عمل کنیم

If IsNull(Varx) =False Or Varx<>"" Then
End if

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

"'=Dlookup("CompanyName","Query1","FamilyName
"'" & Me.TxtSearch &
در مثال فوق اسم شرکت از کوئری یک را بازیابی می کند زمانیکه مقدار txtSearch که تکست هست با فیلد FamilyName برابر باشد. اگر txtSearch در سابفرم باشد باید به آن ارجاع داد فرضا فرم اصلی را MainForm و اسم سابفرمی که txtSearch در آن وجود دارد Sub1 درنظر بگیرید .

& "'=FamilyName"
"'" & Forms!MainForm!Sub1.Form!TxtSearch

بعد از Sub1 از Form استفاده کردیم چرا ؟ چون سابفرم خودش از دو لایه تشکیل شده لایه ی اول پراپرتی های مربوط به خود سابفرم است مثل LinkMaster یا LinkChild و شامل کنترهای مربوط به فرم نیست و بعدی مربوط به فرم که شامل سکشن ها منظور دیتیل و هدر و کنترل هاست
  • Byte — For integers that range from 0 to 255. Storage requirement is a single byte.

  • Integer — For integers that range from -32,768 to +32,767. Storage requirement is two bytes.

  • Long Integer — For integers that range from -2,147,483,648 to +2,147,483,647. Storage requirement is four bytes.