ش | ی | د | س | چ | پ | ج |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
کد زیر از 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