-روش مناسب برای تبادل دیتا بین 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 بدون درنظر گرفتن کانتریا سال کبیسه کافیه توسط تابعی سال ماه و روز را گرفته و به ماه یک عدد اضافه کنیم در خط بعد اگر ماه از ۱۲ بزرگتر شد ماه یک میشود و سال یکی بدان اضافه خواهد شد روز هم همان در نظر گرفته میشود فقط تنها مشکل اینه که اگر فرضا سالی کبیسه نباشد و کسی ۳۰ بهمن وام گرفته باشد با توجه به تابع بالا قسط اول ۳۰ اسفند میشود درصورتیکه اسفندماه ۲۹ روز ه هست پس سعی کنید بازه ی وام بین ۱ تا ۲۹ آن ماه باشد حتی فرض کنید کسی وامی را ۳۱ شهریور گرفته باشد در اینصورت طبق روش بالا میتوانیم برای رفع این مشکل بگوئیم اگر ماه بزرگتر از ۶ شد و اگر روز بزرگتر از ۳۰ بود همان ۳۰را درنظر بگیرد
ویندوز یوزر Windows User کامپوننتی است که توابعی را بر ای ایجاد رابط کاربری User Interface فراهم میسازد فرضا ایجاد پنجره ی جدید یا تغییر استایل پنجره یا برداشتن منوهای سیستمی و ارسال مسیج ها به آن و ایجاد کنترل ها ... یا بعبارت دیگر اتصال به سایر اپلیکشن ها .
64Bit'
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
متد (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
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
طبق مثال زیر البته در حالت دیزاین هم در ریبون در تب 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 '
index=index+1
End Loop '
End Module----
(Private Sub Id_DblClick(Cancel As Intege
طبق مثال زیر البته در حالت دیزاین هم در ریبون در تب 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
برای کپی کردن محتویات شی رکوردست (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
(2)varValues = recSales.GetRows (intFieldCount = UBound(varValues, 1 (intRowCount = UBound(varValues, 2
گام بعدی ایجاد لوپ در RowCount و دوباره ایجاد لوپ در FieldCount و گرفتن دیتاهای رکورد
ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart
نوع آبجکت : ObjectType
acOutputQuery
acOutputTable
acOutputForm
acOutputReport
نام آبجکت : فرم کوئری فرم یا گزارش : ObjectName
فرمت خروجی : OutputFormat
خروجی جدول Employees به فرمت ( rtf ( Rich Text و True هم که بعد از ایجاد فایل rtf بنام Employee.rtf باعث نمایش آن در اپلیکیشن می شود .
_ , "DoCmd.OutputTo acOutputTable, "Employees
acFormatRTF, "Employee.rtf", True
مثال بعدی : خروجی کوئری به اکسل ۲۰۰۷ که فرمت xls هست و بعد نمایش آن .. در صورت خالی گذاشتن مسیر کامل فایل خود اکسس برای نام و مسیر آن سوال می کند.
_ ,"DoCmd.OutputTo acOutputQuery,"YourQueryName
acFormatXLS,,True
استفاده از ControlType Propert
در مثال زیر در کنترل های فرم لوپ زده میشود فقط مورد Lable که با acLabel مشخص شده و پراپرتی SpecialEffect و BorderStyle را عوض میکند ... کد را کپی نکنید اول خط به خط یاد بگیرید بعد مستفیذ شوید
مورد لیبل Case acLabel
اگر پراپرتی اسپشیال افکت برابر ثابت Shadow بود
If .SpecialEffect = acEffectShadow Then
اسپشیال افکت لیبلی که Shadow بود به نرمال تبدیل میشود
SpecialEffect = acEffectNormal
Constant | Control |
---|---|
acBoundObjectFrame | Bound object frame |
acCheckBox | Check box |
acComboBox | Combo box |
acCommandButton | Command button |
acCustomControl | ActiveX (custom) control |
acImage | Image |
acLabel | Label |
acLine | Line |
acListBox | List box |
acObjectFrame | Unbound object frame or chart |
acOptionButton | Option button |
acOptionGroup | Option group |
acPage | Page |
acPageBreak | Page break |
acRectangle | Rectangle |
acSubform | Subform/subreport |
acTabCtl | Tab |
acTextBox | Text box |
()Private Sub cmdCreate_ClickDim db As DAO.Database(Set db = CreateDatabase("Exercise.accdb", dbLangGeneralEnd Sub
برای اکسپورت از متد Docmd.TransferText استفاده می کنیم
DoCmd.TransferText acExportDelim,"Standard Output "External Report", "C:\Txtfiles\April.doc,"
مثال بالا جدول External Report از دیتابیس اکسس که با نام Standard Output با Docmd.RunSavedImporExport ذخیره شده است را به فایل April اکسپورت میکند با جداکننده.
البته مثل تصویر بالا حتما Import یا Export را بصورت قرار دادی مشخص کنید تا اشتباه نگیرید
acExportDelim | 2 | Export Delimited |
acExportFixed | 3 | Export Fixed Width |
acExportHTML | 8 | Export HTML |
acExportMerge | 4 | Export Microsot Word Merge |
acImportDelim | 0 | Import Delimited |
acImportFixed | 1 | Import Fixed Width |
acImportHTML | 7 | Import HTML |
acLinkDelim | 5 | Link Delimited |
acLinkFixed | 6 | Link Fixed Width |
acLinkHTML | 9 | Link HTML |
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 یک تعریف ذخیره شده ای از کوئری در موتور دیتابیس اکسس هست که ازآن برای ساخت کوئری استفاده خواهد کرد . ( و حتی مقداردهی پارامتر )
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"
....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
نمونه ای از سطح دسترسی
()Private Sub Form_LoadDim sPermit As StringDim iAccess As IntegerDim Ctl As Access.Control("Me.txtUser = Environ("usernameIf IsNothing(Me.txtUser) The"sPermit = "ReadOnlyElse"sPermit = "ReadOnlySelect Case sPermit(sPermit = GetPermission(Me.txtUserEnd IfiAccess = 3"Case "EditiAccess = 2"Case "AdminMe.txtLevel = iAccessCase ElseiAccess = 1End SubEnd Select()Private Sub Form_LoadIf Forms!frmMenu!txtLevel < 11 ThenMe.AllowEdits = FalseElseMe.AllowEdits = TrueEnd IfEnd Sub(Private Function GetPermission(sUser As String_ & "'= If (IsNothing(DLookup("Permissions", "tblStaff", "LoginForms!frmmenu!txtUser & "'"))) Then"GetPermission = "ReadOnlyElse_ & "'=GetPermission = DLookup("Permissions","tblStaff","Login"'" & Forms!frmmenu!txtUserEnd ifEnd Functionنمونه ی تصویری
مثال زیر از متغیر intSearch برای گرفتن مقدار ( عددی ) استفاده می کند که بعنوان integer یعنی حدود ۵ رقم نهایتا تعریف میشود اگر عدد بزرگتر باشد از Long استفاده کنید
نکته : در پنجره ی immediate window وقتی میخواهید عددی را در عدد دیگری ضرب کنید چون پیش فرض integer می گیرد پیغام Overflow را نمایش می دهد که باید آنرا به Long تبدیل یا Convert کنید فرضا 200 *(Clng(1356 ?
Dim intSearch As IntegerDim varX As VariantintSearch = 1_ ,"varX = DLookup("[CompanyName]", "Shippers("[ShipperID] = " & intSearch]"در مورد بالا نام کمپانی را از جدول/ کوئری Shippers درصورتیکه مقدار ShipperID آن برابر متغیر اظهارشده بود( یعنی یک ) بازیابی میکند اگر Null باشد ارور Null را بر می گرداند پس صحیح است که بعد ازآن به نمونه روش ذیل عمل کنیمIf IsNull(Varx) =False Or Varx<>"" ThenEnd 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.