Screen.PreviousControl.Name
در کد زیر اگر کنترل تکست باکس یا کمبو باکس باشد و کنترل سورس آن خالی نباشد پراپرتی به False تنظیم میشود ( منظور پراپرتی Dirty ) ترتیب هم نزولی میشود.
زمانیکه رکوردی ذخیره میشود مایکروسافت اکسس پراپرتی Dirty را به False تنظیم میکند.زمانیکه کاربری تغییراتی را به رکوردی ایجاد میکند پراپرتی به True تنظیم می شود.
در رویه زیر در رویداد Current فرم نوشته شده ، کنترل هایی که در خاصیت یا پراپرتی Tag آنها حرف R قید شده باشد روئت نشوند
البته این کار فقط در نمای دیزاین امکانپذیر است یعنی باز کردن فرم در این نما اگر فایل به accde تبدیل شود چون به دیزاین دسترسی نیست عملیات انجام نخواهدشد !!!
در فرمی یک باتن تعبیه و کدهای زیر در آن نوشته شده قبلش یکسری Variable ها مثل frm باید تعریف شود سپس این کد فرمی بنام form2 را باز کرده و باتنی به تب با نام Page4 اضافه میکند البته فرم 2 را باید با OpenForm در نمای دیزاین باز نمائید.
در FORM2 یک TAB CONTROL قرار داده و نام یکی از تب ها را PAGE4
انتقال فوکس به تب مورد نظر :
فرض کنید در پراپرتی شیت تب کنترل خاصیت Style را به None تغییر داده ( که کلا تب ها مشخص نشود ) و کامند باتنی خارج از تب کنترل ایجاد کرده اید ، زمان کلیک کردن روی باتن CmdOrder فوکس به اولین پیج کنترل TabCtl0 میرود. ( تنظیم Style تب براب عدم ظاهر شدن تب ها و ایجاد باتن بخاطر این است که چپ چین است و خاصیت راست چین نداد )
Private Sub cmdOrder_Click()Me.TabCtl0.Pages(0).SetFocusEnd Sub
Tabcontrol.Style Properties :
ظاهر شدن باتن بجای تب با تنظیم کردن خاصیت Style به یک ، البته در برگه پرارتی تب کنترل ( Property Sheet آن ) می توان خاصیت را انتخاب و تنظیم نمود احتیاجی به کد نویسی نیست
Forms("Mailing List").Controls("TabCtl1").Style = 1
در تصویر زیر :
باتن Main نامش butMain است
تب کنترل نامش tabMenu است
Style مربوط به خاصیت تب کنترل است که Property Sheet آن در نمای دیزاین قابل دسترسی است
هرکدام از تب ها نامگذاری شده و هر کدام از پیج ها PageIndex دارد . Page1 در اینجا pageMain نامگذاری شده در رویه زیر که مربوط به باتن Main در تصویر است گفته شده به تب pageMain برود (Value=0 , PageIndex=0 ) طبق شکل تب pageMain که قبلا page1 نامیده شده در تب کنترل ولیوی صفر دارد و پیج ایندکس تب هم صفر است در نتیجه به تب صفر میرود که همان ابتدا است.
Private Sub ButMain_Click()
tabMenu.Value=pageMain.PageIndex
End Sub
پراپرتی Value یک TabControl حاوی شماره ایندکسی از آبجکت Page جاری است.یک آبجکت Page برای هر Tab در TabControl وجود دارد . اولین آبجکت Page همیشه ایندکس 0 دارد و دومی 1 و ادامه دارد ( عدد صحیح و ترتیبی )
پراپرتی PageIndex بین اعداد صحیح 0 و پراپرتی Count کالکشن Pages منهای یک تنظیم میشود.این پراپرتی در هر View می تواند تنظیم شود.تغییرمقدارپراپرتی PageIndex موقعیت آبجکت Page در کالکشن یا مجموعه Pages را تغییر و باعث تغییر آشکارا و قابل دید ترتیب پیج ها روی تب کنترل می شود.( منظور زمانیکه ست کنید از یک پیج به پیج دیگری منتقل یا Move می شوید !!!)
For i=0 To Tabctl0.Pages.Count-1
Msgbox Tabctl0.Pages(i).Name & Chr(34) _
Tabctl0.Pages(i).PageIndex
Next
مثال زیر پیج با نام Notes روی تب کنترل Information در فرم Order Entry را به اولین پیج انتقال میدهد
Forms("Order Entry").Controls("Information").Pages("Notes").PageIndex = 0
CommandButton.TabIndex Property :
تعیین موقعیت کنترل در Tab Order فرم ( محل چیدمان کنترل ها ) . عدد صحیحی است بین صفر تا تعداد کل کنترل ها منهای یک ! بطور مثال اگر فرمی سه کنترل که هر کدام دارای پراپرتی TabIndex است ، باشد مقادیر معتبر برای این پراپرتی 0 1 و 2
تنظیم پراپرتی TabIndex به عدد صحیحی کمتر از صفر خطایی را تولید می کند.
اگر اعداد پراپرتی TabIndex کنترل ها ( هر کنترلی که این خاصیت را دارد ) تغییر دهید ترتیب انتقال روی آنها وقتی کلید Tab را می فشرید تغییر میکند. امتحان بنمائید!!! و در نظرات بنویسید استفاده خواهند برد.
Control.Properties Property :
شئ مجموعه پراپرتی ها مجموعه ای از تمام پراپرتی های مرتبط به یک کنترل است که میتوان به اعضاء تکی مجموعه با استفاده از ایندکس شئ یا عبارت رشته ای که نام شئ عضو است ارجاع داد.
اولین شئ عضو در مجموعه مقدار ایندکس صفر و تعداد کل آن در مجموعه مقداری است از پراپرتی Count مجموعه پراپرتی ها منهای یک.
For i=0 To Controls("Button1").Properties.Count-1
Debug.Print Controls("Button1").Properties(i).Name
Next
اگر کد بالا اشتباه بود فرم و کنترل را تنظیم کنید به متغیری و
For Each Prp In Ctl.Properties
Debug.Print Prp.Name
Next
نمایش کنترل ها در فرم :
Function ShowControls()Dim frmCust as FormSet frmCust = Forms("Customer")Dim i as IntegerFor i = 0 To frmCust.Count - 1Debug.Print frmCust(i).ControlNameNextEnd Function
البته پراپرتی Count در فرم برای شمارش فرم های باز است .
صرفا جهت مطالعه :
intForms = Forms.Count ' Number of open forms.
If intForms > 0 Then
For intI = 0 To intForms - 1
Set frm = Forms(intI)
Debug.Print frm.Name
intControls = frm.Count
If intControls > 0 Then
For intJ = 0 To intControls - 1
Debug.Print vbTab; frm(intJ).Name
Next intJ
و بقیه را خودتان حدس بزنید !!!
CurrentProject.allforms.count
تماما از سایت های خارجی استخراج و کپی شده امتحان کنید چنانچه اشتباه بود اصلاح شده در نظرات قید گردد
refer-to-tab-control-objects-in-vba
انتخاب Tab موردنظر Tabctl.Value=1
در رویداد Onchange که زمان تغییر تب پیج ها اتفاق می افتد در کد زیر کپشن فرم به کپشن پیج تغییر می یابد و با Select Case و پراپرتی Name پیج چنانچه نام داخل Case بود کاری را انجام دهد .
Private Sub tabMain_Change()
On Error GoTo ErrHandler
'get a reference to the active page
Dim pg As Page
Set pg = tabMain.Pages(tabMain.Value)
'update the form's caption
Me.Caption = "Customer Orders - " & pg.Caption
'take action for specific pages
With pg
Select Case .Name
Case "Page1"
'do stuff
Case "Page2"
'do stuff
Case "Page3"
'do stuff
Case "Page4"
'do stuff
End Select
End With
ExitHere:
On Error Resume Next
Set pg = Nothing
Exit SubErrHandler:
Debug.Print Err, Err.Description
Resume ExitHere
End Sub
The Change event occurs when the contents of a text box or the text portion of a combo box changes. It also occurs when you move from one page to another page in a tab control.
With Your_Form
If !tabControl.Pages(!tabControl.Value).Tag = "Your tag" then
'Do Something
End if
End With
The .Value
property of a TabControl returns the index (zero-based) of the current page. So, if I have a TabControl named TabCtl14
that contains two pages, FirstPage
and SecondPage
, then the code...
Private Sub TabCtl14_Click() If Me.TabCtl14.Value = 1 Then MsgBox "SecondPage was clicked." End If End Sub
...displays the MsgBox whenever I click the "SecondPage" tab in the TabControl.
Private Sub Detail1_Print(Cancel As Integer, PrintCount As Integer)
Dim lngMaxHeight As Long
Dim i As Integer
lngMaxHeight = Me.Itm0.Height
For i = 1 To 3
If lngaMaxHeight < Me.Itm0.Height + Me("rptPREE" & i).Height Then
lngMaxHeight = Me.Itm0.Height + Me("rptPREE" & i).Height
End If
Next
Me.Line (Me.Width, 0)-(Me.Width, lngMaxHeight)
For i = 0 To 24
Me.Line (Me("Itm" & i).Left, 0)-(Me("Itm" & i).Left, lngMaxHeight)
Next
End Sub
Me.Line (Me("Itm" & i).Left, 0)-Step(10.5*1440, lngMaxHeight)
این پراپرتی فقط در قسمت هایی از فرم کاربرد دارد و عمل میکند
دیتیل ، هدر و فوتر و اثرش روی تمام کنترل های روی فرم غیر از Page Break است
.DisplayWhen=0
0 نمایش در حالت فرم ویو و زمانیکه پرینت میشود که دیفالت است.
1 در حالت فرم ویو پنهان است و فقط زمان چاپ مشاهده میشود.
2 در حالت فرم ویو نمایان شده ولی در چاپ مشاهده نمیشود.
کد زیر که از فروم خارجی سال 2008 استخراج شده را تست و کاربردش در نظرات را قید نمائید ( فقط ورود اعداد در تکست باکس مجاز باشد ... Input Mask را تنظیم نمائید )
Private Sub Text1_Change()
Text1 = Format(Text1, "#,###")Text1.SelStart = Len(Text1.Text)End Sub
فرمت های مرسوم برای تایپ Number و Currency
که می تواند یک تا چهار Section داشته باشد و با سمی کالن از هم جدا میشوند. هر قسمت شامل فرمت خاص برای نوعی از عدد است.
قسمت اول برای اعداد مثبت
قسمت دوم برای اعداد منفی
قسمت سوم برای مقادیر صفر
قسمت چهارم برای مقادیر Null
استفاده از سنبل های زیر برای هر نوع داده در Custom Formats :
Space : فضاهای خالی را بعنوان کارکتر واقعی نشان میدهد
"ABC" : نمایش داخل کوتیشن
! : چپ چین کردن
* : پر کردن فضای موجود با کاراکتر بعدی
\ : نمایش کاراکتر بعدی بعنوان کاراکتر واقعی .شما می توانید همچنین کاراکترهای واقعی را با قراردادن علائم کوتیشن اطراف آنها مشاهده نمائید.
[ Color ] : دیتای فرمت شده را رنگی نمایش میدهد ، رنگ بین براکت باشد!!! رنگ های موجود
Black , Blue , Green , Cyan , Red , Magneta , Yellow , White
تابع زیر در رویداد LostFocus تکست باکس Unbound به نام TaxRefund در صورتیکه مقداربعداز خروج از تکست باکس که ذخیره میشود عددی باشد ( با تابع IsNumeric چک می کند ) با فرمت Currency و اگر نباشد با فرمت Capital یا حروف بزرگ نمایش میدهد.( علامت بزرگتر)
Function FormatValue() As Integer
Dim varEnteredValue As Variant
varEnteredValue = Forms!Survey!TaxRefund.Value
If IsNumeric(varEnteredValue) = True Then
Forms!Survey!TaxRefund.Format = "Currency"
Else
Forms!Survey!TaxRefund.Format = ">"
End If
End Function
\ : مانند محصور کردن کاراکتر با علامت دابل کوتیشن است
< : تمام تکست UpperCase میشود ( حروف بزرگ )
> : تمام تکست LowerCase میشود ( حروف کوچک )
Custom Formats برای فیلدهای نوع تکست می تواند تا دو سکشن داشته باشد.هر سکشن حاوی فرمت خاصی برای داده متفاوت در یک فیلد می باشد.( دو سکشن با سمی کالن از هم جدا میشوند )
سکشن اول برای فیلدهای حاوی تکست
سکشن دوم برای فیلدهایی با رشته های Zero-Length و Null Values ( نمایش تکست مورد نظر در صورتیکه فیلد دارای طول صفر باشد یا Null )
For example, if you have a text boxcontrol in which you want the word "None" to appear when there is no string in the field, you could type the custom format @;"None" as the control's Format propert setting. The @ symbol in the first section causes the text from the field to be displayed and the second section causes the word "None" to appear when there is a zero-length string or Null value in the field.
پراپرتی ControlSource یا به فیلدی از جدول یا کوئری باند میشود یا حاوی عبارتی است که در کنترل تکست باکس تایپ می نمائید ولی چنانچه Expression باشد دیتا ذخیره نمیشود مگر اینکه کنترل سورس به فیلدی از جدول یا کوئری متصل باشد که در صورت تغییر و از دست دادن فوکس دیتای جدید جایگزین خواهد شد.
برای Reports این پراپرتی فقط در Group Level یا گروه بندی کاربرد دارد
فرم و گزارشات بعنوان یک پنجره در دیتا بیس عمل می کنند.منبع اولیه داده برای یک فرم یا گزارش توسط پراپرتی RecordSource خودش به جدول یا کوئری یا عبارت SQL تنظیم و سپس پراپرتی کنترل سورس به یک فیلد یا عبارتی تنظیم میشود.
اگر پراپرتی ControlSource به عبارتی تنظیم شود مقدارنمایش داده شده فقط خواندنیست یا Read-Only و در دیتابیس ذخیره نمیشود.
کد زیر زمانی استفاده میشود که شما بخواهید با حلقه ای کاراکترهای متنتون را تک به تک به تکست های دیگری که ساخته اید ببرید .
فرضا عبارت ABC1233D در تکست باکسی با نام Text1 تایپ میشود این عبارت حاوی چند کاراکتر است ؟ .... 8 کاراکتر !!!
me("C" & i).controlSource=Mid(Me.Text1,i,1)
فرضا 11 کنترل تکست باکس ایجاد یا Create می کنید و پراپرتی Name آنرا به C1 تا C11 تغییر می دهید.
Me منظور فرمیست که در آن کار می کنید
در کد زیر توسط تابع Mid کاراکترها یک به یک در تابع Asc قرار داده شده ، چنانچه جواب تابع Asc غیر کد های اسکی 48 تا 57 ( کد اسکی اعداد ) باشد در NumericString ذخیره میشود .
کدی که از فروم های خارجی استخراج شده
Function NumericString(strInput As String) As String 'Returns a string containing only the numeric characters of the input string Dim i As Integer Dim intAsc As Integer NumericString = "" i = 1 While i <= Len(strInput) intAsc = Asc(Mid(strInput, i, 1)) If (intAsc >= 48 And intAsc <= 57) Then 'character is Numeric NumericString = NumericString + Mid(strInput, i, 1) End If i = i + 1 Wend End Function
=NumericString("ABH234D") will return "ABHD"ASCII control characters non printable :
ASCII code 00 = NULL ( Null character )ASCII code 01 = SOH ( Start of Header )
ASCII code 02 = STX ( Start of Text )
ASCII code 08 = BS ( Backspace )
ASCII code 27 = ESC ( Escape )
ASCII code 28 = FS ( File separator )
ASCII code 127 = DEL ( Delete )
تنظیم خاصیت Cycle فرم به Current Record
چون Enter هم تاثیر دارد می توانید در تنظیمات خود اکسس Next Field را انتخاب کنید ( Move After Enter قسمت Client Setting ) در هر صورت کلید هایی هم وجود دارد که می توانند به رکورد بعد پرش کنند و رفتن به رکورد بعد یعنی ذخیره رکوردی که در آن بودید
تصویر زیر هم زمانیکه نمی خواهیم پیغام های اکشن کوئری ها و حذف یا تغییر دریافت کنید استفاده میشود با برداشتن تیک ها ... Client Setting و قسمت Confirm
پراپرتی Cycle در فرم فقط رفتار کلید Tab در فرم را کنترل می کند.اگر سابفرم در Tab Order باشه بعد از اینکه این کنترل فوکس دریافت می کندتنظیم این پراپرتی برای سابفرم تعیین می کند زمان فشردن کلید Tab چه اتفاقی می افتد!!!
برای انتقال فوکس به خارج سابفرم کلید ترکیبی Ctrl+Tab را بفشارید
زمانیکه Cycle را به CurrentRecord یا عدد یک تنظیم می کنیم رفتار Tab Key اینطور نوشته شده که بعد از آخرین کنترل فوکس به اولین کنترل در Tab Order می رود.ولی باز هم کلیدهایی وجود دارد که می تواند شما را به رکورد بعدی ببرد ... فوکس در Toggle Button به خودش میرود نه اجزا داخلیش
TextBox.TabStop
برای مشخص شدن جابجایی فوکس به یک کنترل استفاده میشود
و از نوع Boolean است ، Yes Or No
اگر به No تنظیم شود یا 0 باشد انتقال فوکس به کنترل با فشردن کلید Tab میسر نخواهدشد.
زمان ساختن کنترلی در فرم مایکروسافت اکسس بصورت خودکار موقعیتی را در Tab Order فرم اختصاص میدهد.هر کنترل جدید در آخر آن قرار می گیرد.اگر بخواهید از در دسترس بودن یک کنترل در فرم جلوگیری کنید خاصیت TabStop کنترل را به No تنظیم نمائید.یعنی کلید Tab در آن کار نمی کند.
در حالت Form View کنترل های غیر فعال و یا پنهان شده در Tab Order باقی می مانند اما زمان جابجایی در کنترل ها با فشردن کلید Tab از آن پرش می کند حتی اگر پراپرتی TabStop آن Yes شده باشد.
تا زمانیکه پراپرتی Enabled کنترل به Yes تنظیم شده می توان با کلیک یا استفاده از کلیدهای دسترسی روی آن انتخاب شود ، صرفنظر از تنظیم پراپرتی TabStop آن . بطور مثال شما می توانید پراپرتی کامند باتن را برای جلوگیری از انتخاب توسط کاربر به No تغییر دهید.هرچند آنها می توانند روی آن باتن کلیک کرده و آنرا انتخاب نمایند.
SelLength :
این پراپرتی تعداد کاراکترهای انتخابی در قسمت تکست باکس یک کمبو باکس را معین می نماید ، از نوع Integer و رنج آن از صفر تا تعداد کاراکترها است ( در قسمت تکست باکس کمبو !!! )
حتما فراموش نشود برای تنظیم یا برگشتی این پراپرتی کنترل باید فوکس داشته باشد پس در کدتون حتما متد SetFocus را بکار ببرید ( Onchange Event ) .
تنظیم این پراپرتی به عددی کمتر از صفر باعث بروز خطا می شود.
SelStart :
این پراپرتی نمایانگر شروع نقطه تکست انتخابی یا موقعیت نقطه درج در صورت عدم انتخاب است
Integer است و در رنج صفر تا تعداد کل کاراکترها است البته در قسمت تکست باکس کمبو باکس ) پس اینجا فهمیدید که کمبو باکس قسمت هایی دارد شامل تکست باکس ، دراپ باکس و لیست باکس )
مثل پراپرتی بالا حتما فوکس شود از متد SetFocus استفاده کنید
تغییر پراپرتی SelStart انتخاب را کنسل می کند ( همون در جا زدن که قبلا هم گفته شد ) یک نقطه درج در تکست قرار داده و پراپرتی را به صفر تنظیم میکند
فرضا رشته ای دارید که طولانی است و میخواهید با گرفتن ورودی با جعبه InputBox رشته دیگری را در آن بیابید و بعد از یافتن آنرا مشخص کند با SelLength ( مشخص کردن موقعیت رشته سرچ شده با Instr که عدد صحیحی را بر می گرداند که آنرا در SelStart می گذاریم )
--------------------------------
Me.Text1.SetFocus
Me.Text1.SelLength=0
Me.Text1.SelStart=Len(Me.Text1)
اگر در تکست باکس کمبو باکس قصد سرچ در لیست باکس آنرا را دارید با Me.Filter ، از خاصیت Text آبجکت TextBox بهره ببرید گفته شد زمانیکه فوکس از کنترل خارج شود یا بعبارتی فوکس از دست بدهد خاصیت Value آن تکست باکس مقدار پیدا میکند.
فرضا تکست باکسی دارید که دارای Vertical Scroll است با نوشتن کد زیر در رویداد Enter ، نقطه شروع می شود نقطه پایان آخرین کاراکتر درج شده ... بعبارتی کرسر به آخرین کاراکتر درج شده میرود .
Event : Enter
Me.Text1.SelStart=Me.Text1.SelLength
پراپرتی که متنی از یک عبارت رشته ای انتخابی را برمی گرداند.
اگر متنی انتخاب نشود این پراپرتی حاوی مقدار Null است.این پراپرتی از یک عبارت رشته ای که حاوی متن انتخابی است استفاده می کند. چنانچه زمان انتخاب متن این پراپرتی تنظیم شود متن انتخابی با تنظیم SelText جدید جایگزین میشود.
حتما باید با SetFocud کنترل فوکس بگیرد فراموش نشود!!!
در رویداد MouseDown کنترل تکست باکس کد زیر را بنویسید ، متنی بنویسید و Mouse را به سمت پائین فشار دهید در نظرات بنویسید چه اتفاقی رخ میدهد.
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
اضافه کردن آیتم جدید به لیست مقادیر داخل کنترل ComboBox مد نظر
نوشتاری :
expression.AddItem (Item, Index)
در آرگومان اول ( Item ) رشته ای که می خواهید نمایش دهید را قرار می دهید و آرگومان دوم ( Index ) شماره ردیفی ( از صفر شروع میشود ) است که می خواهید رشته نمایش داده شود آرگومان دوم Optional یا انتخابیست و اگر عددی انتخاب نشود رشته به انتهای لیست کنترل کمبو باکس اضافه خواهد شد.
تابع زیر آیتمی را به ابتدای لیست کنترل کمبوباس اضافه می نماید و در اولین ردیف ( صفراندیسی است برابر با اولین ردیف در لیست )
Function AddItemToBeginning(ctrlComboBox As ComboBox,ByVal strItem As String)
ctrlComboBox.AddItem Item:=strItem, Index:=0
End Function
تابع بالا را در Class Module کپی کنید و در کامند باتنی که در فرم حاوی کمبو باکس تعبیه کردید عبارت زیر را بنویسید
AddItemToBeginning(Combo1,"1234")
توضیحاتی که باید توجه شود :
خاصیت RowSourceType کنترل مشخص شده باید به Value List تنظیم شود.اگر Table/Query باشد به جدول اضافه نخواهدشد.
این متد فقط برای کنترل های ListBox و ComboBox در فرم معتبر است
اعداد آیتم در لیست از صفر شروع می شود اگر مقدار آرگومان آیتم با شماره آیتم موجود مرتبط نباشد خطا اتفاق می افتد
برای لیست های چند ستونی از Semicolons برای جداسازی رشته ها برای هر ستون استفاده بنمائید برای مثال "1010;red;large" برای سه ستون . اگر آرگومان آیتم حاوی رشته های زیادی باشد نسبت به تعداد ستونها ( ; استفاده کرده اید ) بقیه رشته ها اضافه نمی شوند ، اضافه شدن از سمت چپ انجام میگیرد
برای حذف آیتم از لیست مقادیر از متد RemoveItem استفاده بنمائید.
expression.Selected(lrow)
از این پراپرتی زمانی استفاده میشود که بخواهید انتخابی از کمبو باکس داشته باشید و از صفر شروع می شود
مثال زیر : انتخاب پنجمین مورد یا ( Row ) در لیست
Me!Combobox.Selected(4) = True
استفاده از خاصیت Selected در ویژوال بیسیک برای تعیین اینکه آیتمی در کمبو باکس انتخاب شده باشد
زمانیکه کنترل فوکس دارد پراپرتی یا خاصیت Text حاوی دیتای جاری در کنترل TextBox است ؛ خاصیت Value حاوی دیتایی است که آخرین بار ذخیره شده .. زمان انتقال فوکس به کنترل دیگر داده کنترل به روز رسانی یا Update ، و پراپرتی Value به مقدار یا Value جدید تنظیم می شود.
تا زمانیکه کنترل دوباره فوکس نگیرد خاصیت Text در دسترس نیست
اگر از کامند SaveRecord از طریق Docmd استفاده کنید و فوکس نگیرد یا فوکس انتقال نشود دو خاصیت Text و Value مشابه هم تنظیم خواهندشد.
قصد دارید عددی را به حروف فارسی یا انگلیسی برگردانید بنده بعنوان یک مبتدی و در این سطح به شما دوست اکسسی عزیز عرض میکنم بنده در ذهن خودم تصور کردم اول می بایست تبدیل اعداد در همان سه رقم اول یعنی یکان دهگان و صدگان را انجام دهم سپس یک تابع جداکننده اعداد سه رقم سه رقم ایجاد کنم و در نهایت در تابعی بگویم برای سه رقم اول هیچ رشته ای برای سه رقم دوم ، هزار سه رقم سوم میلیون و الی ..... در نظر بگیر که بعد از این سه رقم ها به رشته ای که میخواهید بسازید اضافه گردد. ( Public Function )
در بالا یونیک چارت وجود دارد بجای فارسی کردن پنجره Vba وچون اکسس یونیکد فارسی را ساپورت نمیکند بهتر است از یونیکد بالا در تابع Chrw برای نمایش معادل فارسی در تکست باکستون استفاده بنمائید...
در مرحله اول شما می توانید تابعی برای تبدیل حروفی اعداد بصورت ۳ تایی بسازید و از آرایه کمک بگیرید و طبق گفته بالا برای حروف از یونیکد فارسی آن استفاده کنید
S(0)=CHRW(1589)+Chrw(1601)+Chrw(1585) صفر
S(1)=Chrw(1740)+Chrw(1705) یک
.
.
.
S(10)=ده
S(20)=بیست
.
.
S(90)=نود
S(100)=یکصد
S(200)=دویست
.
.
S(900)=نهصد
در اینجا باید بین سه رقم لوپ بزنید و معادل فارسی هر عدد که در آرایه تنظیم کردید را برگرداند برای اینکار باید فرضا عدد شما 123 باشد می بایست این عدد به 100 20 و 3 تجزیه شده و این 3 عدد را در آرایه بیابد و معادلش را چاپ کند.
در تصویر بالا مشاهده می کنید که برای بدست آوردن 100، 20 و 3 از ترکیب دو تابع Left و Mid استفاده شده . از تابع Mid استفاده شد تا اعداد 1 ، 2 و 3 را جدا کند و به فرمت 000 در آورد
For i=1 To Len("123")
C=Len("123")
X=CVal(Left(Mid("123",i,1) & "000",C))
'Mid("123",i,1) :
'Mid("123",1,1)=1 & "000"=100
'Mid("123",2,1)=2 & "000"=200
'Mid("123",2,1)=3 & "000"=300
'C=3 Then Left(100,3)=100
'C=2 Then Left(200,2)=20
'C=1 Then Left(300,1)=3
Ret=Ret & IIf(Ret="","",Chrw(1608) & S(X)
C=C-1
Next
Function=Ret
فانکشن بالا ترجمه گرتون میشه که عدد سه رقمی رو تبدیل به حروفی میکنه که در آرایه ای ذخیره شده اند
حال باید تابع دیگری بنویسید که عددتون رو سه رقم سه رقم جدا بنماید.
اول دانستن کاربرد Back Slash در Vba
Dim MyValue
MyValue = 11 \ 4 ' Returns 2.
MyValue = 9 \ 3 ' Returns 3.
MyValue = 100 \ 3 ' Returns 33.
تصویر زیر هم در نظر داشته باشید
با تابع String می توانید کاراکتر مورد نظرتون را به تعداد مورد نیاز چاپ کنید فرضا در تصویر بالا 8 بار کاراکتر صفر تکرارشده و با تابع فرمت گفته شده عدد دو در شکل و غالب صفرها نمایش داده شود ساده ترین راه اینه که اول مشخص کنید عددتون چند قسمت میشود فرضا عدد 1234 ... طولش 4 است
4\3=1
4 Mod 3<>0 Then 1+1=2
n=2
پس 1234 شامل دو پارت میشود ( n ) یکی 1 و دیگری 234
بین یک تا عدد n لوپ زده شود For i=1 To n و قبل از آن با دو تابع تصویر بالا رشته "001234" حاصل می شود یعنی جای عدد 8 باید 2×3 قرار داده شود وبجای "2" رشته عددی "1234"، سپس با تابع Mid می توانید سه رقم سه رقم جدا کنید
چون n برابر 2 است پس دوبار حلقه تکرار می شود
آرگومان اول Mid همان نقطه شروع(Start) و بعدی طول (Length) است در لوپ اول از اولین کاراکتر شروع میکند و رشته ای با طول 3 را برمی گرداند در لوپ دوم یعنی n=2 نقطه شروع باید بشود 4 بخاطر همین از Start=Start+3 استفاده شده و طول ثابت است چون در هر لوپ رشته ای با طول ۳ مد نظر ما است اساتید بزرگ .
Start=1
For i=1 To n
K=Mid("001234",C,3)
'Mid("001234",1,3)=001
'Mid("001234",4,3)=234
Ret=Ret & IIf(Ret="","",",") & k
Start=Start+3
Next
Function=Ret
فرض کنید عدد 234 دارید
3\3=1 AND 3 MOD 3=0 Then n=1
Mid("234",1,3)
عدد 23
2\3=0 AND 2 MOD 3<>0 Then n=0+1
Mid("023",1,3)
عدد 12345678 :
8\3=2 And 8 Mod 3<>0 Then n=2+1=3
Mid("012345678",1,3)=012
Mid("012345678",4,3)=345
Mid("012345678",7,3)=678
برای عدد 12345678 بالا با فرمت "012345678" و n=3 توسط تابع Mid و تکرار لوپ به تعداد n سه عدد جداگانه بدست آوردیم. کلیات این تابع میشود جدا کردن ارقام بصورت ۳ تایی و در نهایت در تابع اصلی استفاده میشود.
مرحله آخر تابع اصلی است که عدد از کاربر گرفته می شود فرضا تابع (GetValue(n As Long و عدد را داخل تابع جداکننده می گذارد و جواب آن که بصورت "012,345,678" است را با تابع Split جدا کرده و می گوئیم که یکی یکی در تابع ترجمه گر قرار دهد و به حروف برگرداند حال در اینجا چیزی که مورد نیاز است حروف هزار ، میلیون ، میلیارد و ....
درمثال بالا می توانید در همان تابع آرایه ای بسازید و حروف هزار ، میلیون ، میلیارد ، تریلیون و تریلیارد را ذخیره کنید و چون i در عملیات تابع Mid نقشی ندارد می توانید بنویسید FOR i=n To 1 ، در نتیجه اگر فرض کنیم تابع دیگری نسازیم می توانیم در تابع دوم بگوئیم
Dim A(1 To 5 ) As String
A(1)=""
A(2)="هزار" USE CHRW !!!
A(3)="میلیون" USE CHRW
A(4)="میلیارد"
و اگر نام تابعی که سه رقم اعداد را به حروف بر می گردانیم (T(num باشد در تابع Mid باید گفت
Ret=Ret & IIf(Ret="",""," " & Chrw(1608)
T(k) & A(n)
در شروع لوپ Ret جوابی ندارد توسط تابع IIF چک شده اگر جواب داشت از حرف "و" استفاده شود چک میکنیم
String : 12345678
8\3=2 AND 8 Mod 3 <>0 Then n=(8\3)+1=3
n=3
Ret=""
A(3)="یک میلیون"
Ret="یک میلیون "
n=2
Ret="یک میلیون" ' ( Ret <>"" ) Use "و"
A(2)="هزار"
Ret="یک میلیون ( و ) سیصد و چهل و پنج هزار "
n=1
Ret="یک میلیون و سیصد و چهل و پنج هزار " ' ( Ret<>"" ) "و"
A(1)=""
Ret=یک میلیون و سیصد و چهل و پنج هزار( و ) ششصد و هفتاد و هشت
End Loop!!!
بسیار ساده به ساخت توابعی برای تبدیل عدد به حروف فارسی پرداخته شد در صورت وجود مورد یا اشتباه لطفا در نظرات تصحیح شده درج گردد
تصویر بالا هم احتیاجی به ذخیره حروف فارسی در آرایه نداره و کلا اعداد ۳ رقم ۳ رقم جدا شده و فقط بین آنها از عبارت هزار استفاده شده و جای کمتری هم گرفته.
زمانیکه شما جداول را از فرم ها و کوئری و سایر آبجکتها جدا یا Split کرده باشید برای لینک زدن به جداول در دیتابیسی حاوی جداول که پسورد گذاشته اید از کد زیر استفاده نمائید.
با OpenDatabase ، دیتابیس دارای پسورد را باز می کنید و سپس با TransferDatabase هم لینک به جداول دیتابیس حاوی جداول
strLinkedTablesArray آرایه ای حاوی جداولیست که میخواهید بصورت لینک شده در دیتابیسی که می خواهید Share کنید ایجاد شود
Set db = CurrentDbSet dblink = DBEngine.OpenDatabase(strDbFile, False, False, ";PWD=" & strP)
For Each strTable In strLinkedTablesArray DoCmd.TransferDatabase acLink, "Microsoft Access", dblink.name, acTable, _ strTable, strTableNext
کد بالا مطمئن تر از استفاده از TableDef.Connect است
برای استفاده در Tabledef.Connet
strConnect = "MS Access;PWD=" & strPassword & _ ";DATABASE=" & strDbFile"
باز کردن دیتا بیس اکسس :
Dim wsAccess As Workspace
Set wsAccess=Dbengine(0)
'Open a Microsoft Access database -shared -read-only
Set dbAccess = wsAccess.OpenDatabase("C:\Temp\db1.accdb", False, True)
بدلیل اینکه اعضاء یک مجموعه با صفر شروع می شوند باید همیشه کدی که لوپ زده میشود از صفر شروع شده و به پراپرتی Count منهای یک ختم شود.اگر تمایل داشته باشید که بین اعضاء یک مجموعه لوپ بزنید بدون بررسی پراپرتی Count می توانید از کامند یا دستور FOR EACH .... NEXT استفاده کنید.
Fields یک کالکشن یا مجموعه ای از ذخایر فیلدهاست
For i=0 To Rs.Fields.Count-1
For Each Fld In Rs.Fields
پراپرتی Count هیچوقت به Null تنظیم نمیشود اگر مقدارش صفر باشد یعنی هیچ شی ای در مجموعه وجود ندارد.
برای ارجاع به شی Field در یک کالکشن توسط عدد ترتیبی آن یا با استفاده از خاصیت نام آن ( Name ) می توانید هر کدام از فرم های نوشتاری زیر را بکار ببرید.
Fields(0)
Fields("name")
Fields![name]
استفاده از خاصیت Name از کالکشن Fields ، همانطور که گفته شد نامبر کالکشن از صفر شروع میشود و با اعداد ترتیبی یعنی پشت سر هم 2 1 0 و .... در زیر نام شی فیلد از کالکشن فیلدز که عدد آن صفر است و منظور فیلد اول است نمایش داده میشود
Msgbox Rs.Fields(0).Name
کد زیر : نمایش نام فیلد صفر جدول 1 از کالکشن Tabledefs ( که مجموعه ایست برای ذخیره Tabledef یا مشخصات جداول ) از دیتابیس جاری
Msgbox currentdb.TableDefs("Table1").Fields(0).Name
varReturn = Syscmd(acsysInitMeter,[ProgressBarName],[TotalCount])
varReturn = SysCmd(acsysUpdateMeter,[ProgressBarName], [CurrentCount])
varReturn = SysCmd(acsysClearStatus)
acsyscmdaction
Recordset.Move
اگر Move را برای انتقال به رکورد قبل از First Record استفاده کنید به شروع فایل میرود . چنانچه رکوردست حاوی رکوردنباشد و خاصیت BOF آن True باشد استفاده از این متد برای برگشت به عقب باعث ارور میشود.
اگر Move را برای بعد از Last Record استفاده کنید نشانگر به انتهای فایل منتقل میشود چنانچه شامل هیچ رکوردی نباشد و EOF هم TRUE باشد قطعا خطا دریافت می کنید.
اگر هر کدام از خاصیت هایBOF یا EOF به TRUE تنظیم شده باشند و تلاش کنید از متد MOVE بدون Bookmark معتبر استفاده کنید خطا اتفاق خواهد افتاد
زمان ساخت یا باز کردن شی RecordSet هر کدام از رکوردها یک بوک مارک یونیک دارند و می توانید بوک مارک را برای رکورد جاری با اختصاص دادن مقدار بوک مارک به یک متغیر ذخیره کنید برای ارجاع سریع به آن رکورد در هر زمان بعد از انتقال به رکورد دیگر , خاصیت بوک مارک شی رکوردست را به مقدار آن متغیر تنظیم نمائید.
Forms!Orders.RecordsetClone.MoveLast
MsgBox "My form contains " _
& Forms!Orders.RecordsetClone.RecordCount _
& " records.", vbInformation, "Record Count"
البته اول از MoveFirst استفاده کنید بعد MoveLast و در اینجا از پراپرتی RecordCount برای شمارش استفاده شده بکار ببر ید چنانچه بکار بردن Dcount سخت تر یا دیر بازده است.
در مثال بالا به آخرین رکورد در مجموعه رکوردها که در فرم Orders است رفته و پیامی که حاوی تعداد رکوردها است را نمایش می دهد توسط باکس یا پنجره Msgbox
Dim rs as Dao.Recordset
Set rs=Me.RecordsetClone
With rs
.MoveFirst
.MoveLast
Msgbox .RecordCount
End With
Using a RecordsetClone is an easy way to manipulate records on a subform
استفاده از RecordsetClone یک راه آسان برای جمع آوری رکوردها در سابفرم است دوستان .
می توانید از قالب Dcount استفاده نمائید.
Me.Text1 = DCount("[Pick a field]", Me.RecordSource)
You can use the SelTop property to specify or determine which row (record) is topmost in the current selection rectangle in a table, query, or form datasheet, or which selected record is topmost in a continuous
form
با استفاده از خاصیت SelTop می توان بالاترین ردیف ( رکورد جاری ) را در یک مجموعه انتخابی مشخص کرد.این خاصیت عددی بین 1 و شماره رکوردها در Datasheet یا continuous form را بر می گرداند.
پراپرتی های SelTop و SelLeft موقعیت گوشه چپ بالایی مستطیل انتخابی را مشخص میکند.
پراپرتی های SelHeight و SelWidth موقعیت گوشه سمت راست پایینی مستطیل انتخابی را مشخص میکند.
بیشتر زمانی استفاده میشود که بخواهند چند ردیف را انتخاب کنند و یک Query روی آنها اجرا نمایند.
The SelHeight property returns a Long Integer value between 0 and the number of records in the datasheet or continuous form. The setting of this property specifies or returns the number of selected rows in the selection rectangle or the number of selected records in the continuous form.
پراپرتی SelHeight یک عدد صحیح از نوع لانگ بین صفر و تعداد رکوردها در فرم دیتاشیت یا کانتینیوس را برمی گرداند.تنظیم این خاصیت تعداد ردیف های انتخاب شده در مستطیل انتخابی یا تعداد رکوردهاب انتخاب شده در فرم کانتینیوس را برمی گرداند
RECORDSET.MOVE :
موقعیت نشانگر رکورد جاری را انتقال می دهد
تلاش به انتقال به یک نقطه قبل از اولین رکورد به انتقال به رکورد قبل از اولین رکورد منجر میشود که BOF است .تلاش به انتقال به قبل از آخرین رکورد باعث میشود نشانگر رکورد به رکورد بعد از آخرین رکورد انتقال یابد که EOF است. در غیر از این مورد اگر متد MOVE برای انتقال به قبل از BOF یا EOF استفاده شود ارور ایجاد می کند.تست کنید در فرم Bound شده یعنی در پراپرتی رکورد سورس نام جدولی باشد.
Private Sub cmd1_click()
Dim rs as Dao.Recordset
Set rs=me.recordset
Rs.MoveLast
Res.MoveNext
End Sub
مثال از SelTop و SelHeight :
اگر از بالا به پائین ردیف سوم و چهارم را انتخاب کنید SelTop را 3 و SelHeight را 2 دریافت می کنیم اما اگر از پائین به بالا انتخاب کنید عدد SelTop 4 و SelHeight همان 2 است
زمانیکه روی یک باتن کلیک کنید انتخاب از بین میرود و SelHeight هم صفر میشود پس اگر بخواهید آنرا داشته باشید باید ذخیره کنید می توانید در رویداد EXIT سابفرم آنرا در متغیری ذخیره کنید . فرضا Selh=Me.SelHeight .... اگر اینکار را انجام ندهید انتخاب Clear می شود و SelTop به رکورد انتخاب شده جاری که رکورد پائین است تنظیم میشود ( زمانیکه انتخاب پائین به بالا باشد )
یادداشت : SelTop. و SelHeight. در یک فرم کانتینیوس کاربرد دارد در حالت Form View زمانیکه با Record Selector رکوردی را انتخاب می کنید.
دیتاشیتی که فوکس گرفته ... تعداد ردیف های انتخاب شده با SelHeight ... تعداد ستون های انتخاب شده با SelWidth .... بالاترین ردیف در مجموعه انتخاب شده با استفاده از SelTop و بستگی دارد که از بالا به پائین یا از پائین به بالا انتخاب می کنید. ( توضیحات ذیل )
' Datasheet that has the focus
Set frm = Screen.ActiveDatasheet
' Number of rows selected.
lngNumRows = frm.SelHeight
' Number of columns selected.
lngNumColumns = frm.SelWidth
' Topmost row selected.
lngTopRow = frm.SelTop
دو عمل زیر در Recordset ، اولی رفتن به اولین رکورد و دومی انتقال نشانگر رکورد به اولین رکورد انتخاب شده
Rs.MoveFirst
' Move to the first selected record.
Rs.Move mlngSelTop - 1
'
You can use the SelTop property to specify or determine which row (record) is topmost in the current selection rectangle in a table, query, or form datasheet, or which selected record is topmost in a continuous form