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

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

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

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

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

کار با آرایه های مشخص و مقدار معین ( Parameter arrays )



ParamArray : 


نوشتن تابع AddMultipleArgs برای گرفتن تعداد کلی داخل پرانتز 


Function AddMultipleArgs(ParamArray myNumbers() As Variant)

Dim mySum As Single

 Dim myValue As Variant

 For Each myValue In myNumbers

 mySum = mySum + myValue

 Next

 AddMultipleArgs = mySum

End Function


?AddMultipleArgs(1, 23.24, 3, 24, 8, 34)















According to international research led by the Complutense University of Madrid (UCM), the surface of ice when in contact with a solid object melts and creates a self-perpetuating lubricant layer. This lubricant layer makes the ice slipperier, and therefore more likely to cause accidents involving skating or cars.















آرایه در اکسس



کد زیر از Access vba programming کپی شده   که به تفسیر ساده تر آن پرداختیم.



Sub modArray_StatesInAnArray()

بارگزاری فهرستی از ایالات از جدول Customers داخل آرایه ای با اندازه مشخص ... با سایز ۲۰

 Const lngArraySize = 20

 Dim lngCounter As Long

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

 Dim varAState As Variant 

 Dim strState(lngArraySize) As String

 Dim db As Database

 Set db = CurrentDb

 lngCounter = 0

 Dim rst As Recordset

متغیری که به Object یا شئ ای اشاره می کند ( بعنوان نشانگر ) را با Set  اظهار می کنند ... در کد زیر رکوردستی در حافظه موقت ایجاد شده و  درون آن داده های ستونِ [State/Province]  از جدول مشتریان ( بدون تکرار ) قرار می گیرد با شرط پر بودن این فیلد یعنی بدون Null ها .

 Set rst = db.OpenRecordset("SELECT DISTINCT [State/Province] " & _

 " FROM Customers WHERE [State/Province] IS NOT NULL", _

 dbOpenDynaset)

در کد زیر لوپی زده شده در رکوردست ( مجموعه داده )

 Do While Not rst.EOF

در اینجا بعلت جلوگیری از خطا (  بعلت اینکه تعداد داده های فیلد از سایز یا اندازه ۲۰ [تعداد ردیف ها ] بیشتر است یا ممکن است کمتر باشد )  از یک شرط استفاده شده.

 If lngCounter > lngArraySize Then

 'this would cause a problem

 Stop

 End If

در اینجا و با توجه به لوپ آرایه با داده های فیلد پر می شوند.

 strState(lngCounter) = rst![State/Province]

یک شمارشگر قرار داده تا در شرط بالا یعنی if بکار برده شود.... از DOEVENTS می توانید در اول کدها استفاده کنید تا اگر کدها را اشتباه نوشتید ( مثلا لوپ درجا بزند و پایانی نداشته باشد ) سیستم هنگ نکند

 lngCounter = lngCounter + 1

این خط ( MoveNext ) برای انتقال به رکورد بعد ( ردیف ) در رکوردست لازم است وگرنه همان داده اولین ردیف را پر می کند.

 rst.MoveNext

 Loop

در کد زیر لوپی میزند در آرایه strState و مقادیر را در صفحه immediate window نمایش میدهد ( Debug.Print ) که می توانید در صفحه ویژوال آنرا مشاهده کنید.

 For Each varAState In strState

 If varAState <> "" Then

چاپ در Debug که با Ctrl+G می توانید به صفحه مورد نظر ببرید.

 Debug.Print varAState

 End If

 Next

 Debug.Print "Lower bound : " & LBound(strState)

 Debug.Print "Upper Bound : " & UBound(strState)

حتما بعد از استفاده رکوردست را باید ببندید تا در حافظه جایی که اشغال کرده را آزاد کند.

 rst.Close

 Set rst = Nothing

 db.Close

 Set db = Nothing

End Sub



تمام آرایه ها در اکسس پایه صفر دارند یعنی از صفر شروع می شوند.

Dim Arr(2) As Variant

Arr(0)="A"

Arr(1)="123"

Arr(2)="01/08/1999"

?Arr(1)

123


امکانپذیراست ، آرایه ای داشته باشیدکه بتوان انداره و تعداد ابعادش را با استفاده از عبارت Redim تغییر داد.

Dim strState() As String

 lngArraySize = 8

 ReDim strState(lngArraySize)

این آرایه ها همچنین می توانند داده های موجود را هنگام تغییر اندازه با استفاده از کلمه کلیدی Preserve حفظ کنند.



عبارت Redim Preserve یک آرایه جدید ایجاد میکند و اجزاء آرایه قدیمی داخل آرایه جدید کپی می شوند... لذا فقط بعد یا اندازه تغییر کرده و منجر به از دست رفتن داده ها نخواهد شد .


For lcount = 0 To 5000000
        ReDim Preserve myText(lcount)
        myText(lcount) = lcount
    Next lcount


البته اگردر لوپ بجای lcount همان عدد 5 میلیون استفاده شود سرعتش بیشتر از زمانیست که از خود متغیر lcount استفاده کردیم.


در وهله اول به متغیر آرایه ای strState یک بعد میدهیم فرضا ۵۰ 

Do While Not rst.EOF

 strState(lngCounter) = rst![State/Province]

 lngCounter = lngCounter + 1

 rst.MoveNext

 Loop
















 

















Property Set statement


نام ، آرگومان ها و کدی که بدنه یک رویه پراپرتی را تشکیل میدهد ، اعلام می کند که یک مرجع را به یک شئ تنظیم می کند.


نوشتار عبارت Property Set قسمت هایی را دارد : 


Optional : انتخابی است ،  نشان میدهد که آرگومان می تواند یا نمی تواند توسط 

Caller تامین شود.


Public : انتخابی است ، نشان میدهد که رویه Property Set قابل دسترسی است به تمام دیگر رویه ها در تمام ماژول ها (Modules) . اگر در ماژولی که حاوی عبارت Option Private است بکار برده شود رویه در خارج از پروژه ( Project ) موجود نیست. 


Private : انتخابی است ، نشان میدهد که رویه Property Set قابل دسترسی است فقط به سایر رویه ها در ماژولی که اعلام می گردد یا بیان میشود.


Static : انتخابی است ، نشان میدهد که متغیرهای لوکال رویه Property Set  بین Call ها رزرو شده اند .  Static atteibute روی متغیرهایی که خارج از رویه Property Set اعلام سا اظهار شده تاثیری ندارد ، حتی اگر آنها در رویه بکار برده شوند.


Name :  اجباریاست و انتخابی نیست !!! نام رویه Property Set 

arglist : اجباریست ، لیست متغیرهای رزرو شده که پاس داده میشوند به رویه Property Set وقتی Call  یا فراخوانی میشود.آرگومان های چندتایی با کاما جدا می شوند 


نوشتاری و قسمت های arglist : 


[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]


OPTIONAL : مشخص میکند که آرگومان اجباری نیست اگر استفاده شود تمام آرگومان های بعدی هم باید با OPTIONAL ذکر شوند.

BYVAL : اختیاریست ، نشان میدهد که آرگومان VALUE یا عددی است 

BYREF : اختیاریست ، نشان میدهد که آرگومان توسط یک رفرنس PASS داده میشود و BYREF در ویژوال بیسیک DEFAULT  است یعنی شما استفاده نکنید BYREF در نظر میگیرد.

PARRAMARRAY : اختیاریست ، بعنوان آخرین آرگومان در ARGLIST استفاده میشود و نشان میدهد که آرگومان نهایی یک آرایه انتخابی از اجزاء VARIANT است کلمه PARAMARRAY به شما این اجازه را میدهد که یک شماره اختیاری از آرگومان ها را فراهم کنید و نمی تواند با BYVAL ، BYREF یا OPTIONAL بکار رود.

VARNAME : اجباریست و نام متغیراست 

TYPE : انتخابیست ، DATA TYPE است که بین رویه ها استفاده میشود  مثل BYTE BOOLEAN SINGLE DOUBLE STRING 


یادداشت : 

هر عبارت PROPERTY SET بایستی با یک آرگومان مشخص شود 


یک parameter array می تواند برای  عبور یا پاس دادن آرایه ای از آرگومان ها استفاد شود . شما نباید تعداد اجزاء در آرایه را بدانید زمانیکه رویه را تعیین می کنید 

استفاد کلمه ParamArray برای مشخص کردن کردن یک parameter array . آرایه می بایست بعنوان آرایه ای از دیتا تایپ Variant اعلام شود , و می بایست در آخرین آرگومان در رویه مشخص گردد.

مثال زیر نمایش میدهد که چگونه یک رویه با parameter array تعیین می گردد .

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer 

 Debug.Print strName; " Scores" 

' Use UBound function to determine upper limit of array. For intI = 0 To UBound(intScores()) 

 Debug.Print " "; intScores(intI) 

Next intI 

End Sub


ومثال زیر هم مشخص میکند که چطور رویه را call یا فراخوانی بنمائید.


AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16 
 
AnyNumberArgs "Kelly", "High", "Low", "Average", "High" 

ParamArray : 


کلمه ParamArray اجازه میدهد به شما که تعداد داینامیک یا پو یایی از آرگومانها را قبول یا پذیرش کنید

کلمه ParamArray اختصار parameter array است

بجای بکارگیری تعدادزیادی از پارامترهای انتخابی  استفاده از parameter array می تواند کمک خوبی باشد.

می تواند در انتهای یک رویه یا تابع استفاده شود.

با ByValue و ByRef نمی تواند همراه باشد!

باید با دیتا تایپ Variant اعلام و اظهار گردد

پایه آن Zero است یعنی از صفر شروع میشود intl در مثال بالا

 Parameter array می تواند حاوی دیتا تایپ های مختلفی باشد 

array of array

Public Sub Procedure_Five(ByVal iConstant As Integer, _
ParamArray aArgumentsArray() As Variant)
Dim icount As Integer
Dim vArg As Variant
   For icount = 0 To UBound(aArgumentsArray(0))
      vArg = aArgumentsArray(0)(icount)
      Debug.Print vArg
   Next icount
End Sub

Public Sub RunThis_Five()
    Call Procedure_Five(100, Array("one","two"))
End Sub



Public Function MySUM(ParamArray args())
    For Each arg In args
        MySUM = MySUM + arg
    Next arg
End Function



در کد زیر از paramarray استفاده شده اگر پارامترهای داخل آن Null نباشد جواب یا برگشتی تابع خواهد بود 


Public Function Coalesce(ParamArray arguments()) As Variant
Dim retVal As Variant
Dim i As Long
retVal = Null For i = LBound(arguments) To UBound(arguments) 
If Not IsNull(arguments(i)) Then 
retVal = arguments(i) 
Exit For
End If
Next i 
Coalesce = retVal
End Function

Public Sub testCoalesce()
Dim dummy As Variant
dummy = Coalesce(Null, Null, "ABC")
dummy = Coalesce(Null, Null, "ABC", 123)
dummy = Coalesce(Null, Null, "ABC", 123, 42.23)
dummy = Coalesce(Null, Null, "ABC", 123, 42.23, #12/15/2018#)
End Sub


Property Let : مقدار پراپرتی را تنظیم میکند
A procedure that sets the value of a property.
Property Get : مقدار پراپرتی را بر می گرداند
A procedure that returns the value a property.
Property Set :رفرنسی به یک شئ را تنظیم می نماید
A procedure that sets a reference to an object.


Public Property Get NewEmployee() As Variant

NewEmployee = employee

End Property

Public Property Set NewEmployee(ByVal vNewValue As Employee)

employee = vNewValue

End Property



Dim CurrentColor As Integer 

Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3 

 

' Returns the current color of the pen as a string. 

Property Get PenColor() As String 

 Select Case CurrentColor 

 Case RED 

 PenColor = "Red" 

 Case GREEN 

 PenColor = "Green" 

 Case BLUE 

 PenColor = "Blue" 

 End Select 

End Property 


' The following code gets the color of the pen 

' calling the Property Get procedure. 

ColorName = PenColor