مشکل در استفاده از redim در ویژوال بیسیک

zhm

New Member
سوال ویژوال بیسیک

سلام .بازم پیشاپیش از هر عزیزی که لطف کنه و کمکم کنه ممنونم.تا اینجا هم از آقای the king خیلی خیلی ممنونم.
یه ماتریس دارم به اسم newmat.این ماتریس در ابتدای برنامه از نوع variant تعریف شده.یکبار در اوایل برنامه ابعاد ماتریس بصورت زیر مشخص شده:
(redim preserve newmat(1 to i,1 to j
که i وj اعداد مشخصی اند.برای بار دوم که در طول برنامه از redim preserve newmat استفاده کردم برنامه موقع اجرا خطا میده!(subscript out of range) مشکل چی میتونه باشه؟
 

saalek110

Well-Known Member
visual basic+"subscript out of range"+redim
را سرچ کنید.
اولین سایت اینه:
http://www.xtremevbtalk.com/showthread.php?t=49496

سایت بالا و بقیه سایتها را ببینید. شاید مشکل شما هم همین باشد.
معمولا وقتی خطایی دریافت می کنید با سرچ خطا می توانید خیلی اوقات سریع به جواب برسید. چون حتما فرد دیگر هم با این خطا قبلا روبرو شده.
 
  • Like
Reactions: zhm

the_king

مدیرکل انجمن
سلام .بازم پیشاپیش از هر عزیزی که لطف کنه و کمکم کنه ممنونم.تا اینجا هم از آقای the king خیلی خیلی ممنونم.
یه ماتریس دارم به اسم newmat.این ماتریس در ابتدای برنامه از نوع variant تعریف شده.یکبار در اوایل برنامه ابعاد ماتریس بصورت زیر مشخص شده:
(redim preserve newmat(1 to i,1 to j​
که i وj اعداد مشخصی اند.برای بار دوم که در طول برنامه از redim preserve newmat استفاده کردم برنامه موقع اجرا خطا میده!(subscript out of range) مشکل چی میتونه باشه؟​
طبیعتا زمانی که قصد حفظ محتویات قبلی آرایه را دارید از Preserve استفاده می کنید، اما Preserve محدودیت های
خاص خودش را دارد.

Preserve صرفا برای تعویض اندیس بالایی آخرین مولفه آرایه کاربرد داره. مثلا اگر مولفه اول آرایه دو بعدی 1 الی 4 باشه
و مولفه دوم 2 الی 10 باشه، شما صرفا می توانید مقدار 10 را به عدد دیگری تغییر دهید. تلاش برای تغییر مولفه پایینی
مولفه دوم (عدد 2) و یا تغییر در مولفه اول (1 الی 4) باعث بروز خطا خواهد شد.

شما بایستی ابتدا آرایه را در یک آرایه دیگر کپی بگیرید، آرایه را بدون استفاده از Preserve تغییر ابعاد دهید و مجددا مقادیر
را از آرایه کپی شده در آرایه اصلی بازنویسی کنید.

تابع زیر این عمل را انجام می دهد، از آن بجای Redim Preserve استفاده کنید، پارامتر اول، نام آرایه و پارامتر های دوم و سوم
اندیس های پایینی و بالایی مولفه اول و پارامتر های چهارم و پنجم، اندیس های پایینی و بالایی مولفه دوم هستند ، این تابع
صرفا با آرایه های دو بعدی کار می کند و پیش از اجرای تابع، بایستی آرایه غیر تهی باشد :

کد:
Private Function [B]RedimPreserveArray[/B](ByRef VarArray As Variant, ByVal X1 As Long, ByVal X2 As Long, ByVal Y1 As Long, ByVal Y2 As Long) As Variant
    Dim TempArray As Variant
    Dim X As Long, Y As Long
    ReDim TempArray(X1 To X2, Y1 To Y2)
    X1 = IIf(X1 >= LBound(VarArray, 1), X1, LBound(VarArray, 1))
    X2 = IIf(X2 <= UBound(VarArray, 1), X2, UBound(VarArray, 1))
    Y1 = IIf(Y1 >= LBound(VarArray, 2), Y1, LBound(VarArray, 2))
    Y2 = IIf(Y2 <= UBound(VarArray, 2), Y2, UBound(VarArray, 2))
    For X = X1 To X2
        For Y = Y1 To Y2
            TempArray(X, Y) = VarArray(X, Y)
        Next
    Next
    RedimPreserveArray = TempArray
End Function

تابع فوق آرایه تغییر اندازه داده شده را به عنوان مقدار خروجی برمی گرداند.

مثلا کد زیر ابعاد آرایه A را از 5x10 به 6x20 تغییر می دهد :
کد:
    Dim A() As Variant
    ReDim A(1 To 5, 1 To 10) As Variant
    A = [B]RedimPreserveArray[/B](A, 1, 6, 1, 20)

مثال زیر اندیس پایینی مولفه های آرایه A را از 1 به 3 تغییر می دهد و در B ذخیره می کند :
کد:
    Dim A(1 To 10, 1 To 20) As Variant
    Dim B() As Variant
    B = [B]RedimPreserveArray[/B](A, 3, 10, 3, 20)
 

zhm

New Member
بازم مثله همیشه جوابتون کامل و عالی بود و طبق معمول جز تشکر چیزی نمیتونم بگم.یه دنیا ممنونتونم....از آقای سالک هم بابت جوابشون ممنونم:) بخاطر جوابای کاملتونه که به هر مشکلی میخورم اولین راه حلی که به ذهنم میرسه کمک گرفتن از شماست.بازم ممنون:)
 

جدیدترین ارسال ها

بالا