دستور ReDim | تغییر اندازه و ابعاد آرایه پویا در ویژوال بیسیک

دستور ReDim در سطح روال برای تخصیص دوباره فضای حافظه به یک متغیر آرایه پویا (dynamic array variables) کاربرد دارد.

Syntax


ReDim [ Preserve ] varname ( subscripts ) [ As type ], [ varname ( subscripts ) [ As type ]] . . .

دستور ReDim از قسمت های زیر تشکیل شده است:

قسمت

توضیحات

Preserve

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

varname

اجباری. نام متغیر؛ می بایست طبق استاندارد نامگذاری متغیر تعیین شود.

subscripts

اجباری. ابعاد یک آرایه می باشد. حداکثر ۶۰ بعد می تواند اعلان شود. آرگومان subscripts طبق قاعده زبانی زیر بکار گرفته می شود:

[ lower To ] upper [ , [ lower To ] upper ] . . .

وقتی lower مشخص نشده باشد، کران پایین آرایه توسط دستور Option Base کنترل می گردد. اگر دستور Option Base استفاده نشده باشد، صفر بصورت پیش فرض کران پایین خواهد بود.

type

اختیاری. نوع داده متغیر می باشد. ممکن است Byte، Boolean، Integer، Long، Currency، Single، Double، Decimal (در حال حاضر پشتیبانی نمی شود)، Date، String (برای String با طول متغیر)، String length (برای String با طول ثابت)، Object، Variant، یک نوع داده تعریف شده توسط کاربر و یا یک object type باشد.

بند As type را برای هر متغیر که اعلان می نمایید جداگانه استفاده نمایید.

آیا می‌دانید:

با یادگیری VBA در اکسل، می‌توانید فرآیندهای تکراری را به‌طور خودکار انجام دهید و زمان بیشتری برای تحلیل داده‌ها صرف کنید. این زبان قدرتمند به شما امکان می‌دهد تا ماکروهای سفارشی ایجاد کنید و وظایف پیچیده را به‌سادگی مدیریت کنید.

ملاحظات:

دستور ReDim برای تعیین یا تغییر اندازه یک آرایه پویا ( dynamic array ) که قبلاً رسما توسط دستور Private، دستور Public، یا دستور Dim با پرانتزهای خالی اعلان شده باشد کاربرد دارد (بدون اندیس ها).

می توانید از دستور ReDim بارها و بارها برای تغییر تعداد اجزاء و ابعاد یک آرایه استفاده نمایید. بنابراین، نمی توانید یک آرایه با یک نوع داده اعلان نمایید و سپس با ReDim نوع داده آرایه را تغییر دهید، مگر اینکه آرایه در یک Variant وجود یافته باشد. اگر آرایه در یک Variant موجود شود، نوع داده عناصر می تواند با استفاده از بند As type تغییر یابد، مگر اینکه کلمه کلیدی Preserve را استفاده کرده باشید که در این صورت هیچگونه تغییر داده ای مجاز نمی باشد.

اگر از کلمه کلیدی Preserve بعد از دستور ReDim استفاده نمایید، فقط می توانید اندازه آخرین بعد آرایه را تغییر دهید و نمی توانید تعداد ابعاد را به هیچ وجه تغییر دهید. برای مثال، اگر آرایه تان فقط یک بعد داشته باشد، می توانید اندازه آن بعد را تغییر دهید چرا که همان آخرین و تنهاترین بعد می باشد. بنابراین، اگر آرایه شما دو بعد یا بیشتر داشته باشد، فقط می توانید اندازه آخرین بعد را تغییر دهید و همزمان محتویات آرایه را حفظ نمایید.

مثال زیر نشان می دهد که شما چگونه می توانید اندازه آخرین بعد یک آرایه پویا را بدون پاک کردن محتویات آن افزایش دهید.


ReDim X(10, 10, 10) 
. . . 
ReDim Preserve X(10, 10, 15)

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

اگر اندازه یک آرایه را کوچکتر نمایید، داده های عناصری که حذف شده اند از دست خواهد رفت.

وقتی متغیرها مقدار دهی اولیه می شوند (پس از اعلان متغیرها، VBA بصورت پیش فرض متغیرها را مقداردهی اولیه می نماید. توجه داشته باشد امکان مقداردهی توسط کاربر خارج از روال در زبان برنامه نویسی VBA وجود ندارد) متغیر عددی به صفر، متغیر string با طول متغیر به یک رشته خالی (“”)، متغیر string با طول ثابت با صفر پر میشود (بعنوان مثال اگر طول رشته ۳ باشد 000 مقداردهی اولیه می باشد). متغیرهای Variant به تهی (Empty) مقداردهی اولیه می شوند. هر عنصر از یک نوع متغیر کاربر با این فرض که هر یک از عناصر یک متغیر جداگانه هستند مقدار دهی اولیه خواهد شد.

یک متغیر که به یک شیء اشاره دارد قبل از اینکه قابل استفاده باشد، باید با استفاده از دستور Set یک شیء موجود به آن اختصاص یابد. متغیر شیء اعلان شده تا وقتی که یک شیء به آن اختصاص یابد، مقدار خاص Nothing را دارد، که به این معناست که این متغیر نمونه ای از هیچ شیء خاصی نمی باشد.

اگر متغیر ( varname ) از قبل در سطح ماژول یا سطح روال اعلان نشده باشد، دستور ReDim بعنوان یک دستور اعلان عمل می نماید. اگر متغیر هم نام دیگری حتی با میدان دید وسیع تر بعداً ایجاد شده باشد، ReDim به متغیر آخری ارجاع خواهد داشت و حتی با وجود تنظیم Option Explicit هم لزوماً خطای حین کامپایل ایجاد نخواهد گردید. برای اجتناب از این گونه تضادها، ReDim نباید کاربرد اعلان داشته و فقط برای تغییر اندازه آرایه ها بکار رود.

نکته
برای تغییر اندازه آرایه ای که توسط یک متغیر Variant حمل می شود، می بایست متغیر Variant از قبل به صراحت اعلان شده باشد تا بتوان اندازه آرایه آن را تغییر داد.

مثال

این مثال از دستور ReDim برای اختصاص و تجدید اختصاص فضای حافظه برای متغیرهای آرایه پویا استفاده می نماید. فرض بر این است که Option Base یک می باشد.


Dim MyArray() As Integer ' اعلان آرایه پویا.
Redim MyArray(5) ' اختصاص ۵ عنصر
For I = 1 To 5 ' تکرار به اندازه ۵ مرتبه
	MyArray(I) = I ' مقداردهی اولیه به هر عنصر
Next I 

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


Redim MyArray(10) ' تغییر اندازه به ۱۰ عنصر
For I = 1 To 10 ' تکرار برای ۱۰ مرتبه
	MyArray(I) = I ' مقداردهی به آرایه
Next I 

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


Redim Preserve MyArray(15) ' تغییر عناصر به ۱۵ عدد

منبع

ReDim statement

دیدگاهتان را بنویسید