مهندسی آچار فرانسه!

دیگر توضیح ندارد!

مهندسی آچار فرانسه!

دیگر توضیح ندارد!

پویا کردن برنامه در اکسل! (RANK,INDIRECT)

از این که چندروزی به جهت مشغله های مختلف مطلبی نشد بذارم عذرخواهی می کنم.

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

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

همانند برنامه نویسی به زبان جاوا که شما می توانید در حین اجرای برنامه متغییرهای جدیدی را تعریف کنید و مقدار دهی نمایید، در اکسل نیز دستوری وجود دارد که این امر را برای شما ممکن می سازد. دستور Indirect. برای این که با طرز کار این دستور آشنا شوید، ابتدا دستور Rank را توضیح می دهم.

دستور رنک با گرفتن یک عدد و یک آرایه به شما رتبه ی عدد را در بین نمرات آرایه ی داده شده بازمی گرداند. اشکال این دستور این است که اگر بخواهیم یک نفر را به آرایه (لیست) خود اضافه کنیم، مجبور خواهیم بود دستور همه ی ستون ها را تغییر دهیم. به مثال زیر دقت کنید:

A B C
1 نمره رتبه فرمان داخل ستون رتبه
2 18 3 RANK(A2;A$1:A$6)
3 15 4 RANK(A3;A$1:A$6)
4 19 2 RANK(A4;A$1:A$6)
5 20 1 RANK(A5;A$1:A$6)
6 14 5 RANK(A6;A$1:A$6)

بدیهی است با اضافه کردن چند نمره نیاز به تغییر در همه ی دستورات ستون B می باشد:

A B C
1 نمره رتبه فرمان داخل ستون رتبه
2 18 3 RANK(A2;A$1:A$10)
3 15 4 RANK(A3;A$1:A$10)
4 19 2 RANK(A4;A$1:A$10)
5 20 1 RANK(A5;A$1:A$10)
6 14 6 RANK(A6;A$1:A$10)
7 12 9 RANK(A7;A$1:A$10)
8 13 8 RANK(A8;A$1:A$10)
9 14 6 RANK(A9;A$1:A$10)
10 15 4 RANK(A10;A$1:A$10)
نکته) استفاده از $ جهت تعمیم صحیح اطلاعات به ردیف های بعد است (به مطلب معجزه ی $ مراجعه کنید).
اما به نظر می رسد می توان عبارت رنج دستور رنک را با توجه به تعداد داده های ورودی به دست آورد، دستور CONCATENATE به منظور چسباندن چند عبارت به هم به کار می آید:
به مثال زیر دقت کنید:

A B C D E
1 نمره رتبه فرمان داخل ستون رتبه تعداد توابع ستون D
2 18 3 RANK(A2;A$1:A$6) 6 COUNT(A:A)-1
3 15 4 RANK(A3;A$1:A$6) A2:A6 CONCATENATE("A2:A";D2)
4 19 2 RANK(A4;A$1:A$6)

5 20 1 RANK(A5;A$1:A$6)

6 14 5 RANK(A6;A$1:A$6)

همانگونه که در ستون D می بینید، دستور CONCATENATE امکان اضافه کردن دو عبارت "A2:A" و محتوای سلول D2 را به ما داد، نکته ی حائز اهمیت این که سلول D2 متناسب با تعداد اطلاعات وارد شده در ستون A می باشد، از این رو با افزایش تعداد، عبارت لازم برای رنج رنک به دست می آید.
حال زمان آن رسیده تا پویایی در اکسل را بنگرید!
دستور INDIRECT با گرفتن یک عبارت متنی می تواند آن را به رنج (آرایه) واقعی تبدیل کند و به استفاده ی دیگر توابع برساند:

A B C D E
1 نمره رتبه فرمان داخل ستون رتبه تعداد توابع ستون D
2 18 3 RANK(A2;INDIRECT($D$3)) 6 COUNT(A:A)-1
3 15 4 RANK(A3;INDIRECT($D$3)) A2:A6 CONCATENATE("A2:A";D2)
4 19 2 RANK(A4;INDIRECT($D$3))

5 20 1 RANK(A5;INDIRECT($D$3))

6 14 5 RANK(A6;INDIRECT($D$3))

حال بدون تغییر در ردیف های قبل می توانیم تا هر تعداد که بخواهیم، به اضافه کردن ردیف بپردازیم و نمرات جدید را به لیست خود بیافزاییم:

A B C D E
1 نمره رتبه فرمان داخل ستون رتبه تعداد توابع ستون D
2 18 3 RANK(A2;INDIRECT($D$3)) 10 COUNT(A:A)-1
3 15 4 RANK(A3;INDIRECT($D$3)) A2:A10 CONCATENATE("A2:A";D2)
4 19 2 RANK(A4;INDIRECT($D$3))

5 20 1 RANK(A5;INDIRECT($D$3))

6 14 6 RANK(A6;INDIRECT($D$3))

7 12 9 RANK(A7;INDIRECT($D$3))

8 13 8 RANK(A8;INDIRECT($D$3))

9 14 6 RANK(A9;INDIRECT($D$3))

10 15 4 RANK(A10;INDIRECT($D$3))

اما هنوز به بهترین حالت نرسیدیم، چون قصد ما اینه که تنها با گرفتن اطلاعات، بدون تغییر در باقی موارد (نهایتا تنها با زدن دکمه ای به نام به روز رسانی) بتوانیم تغییرات لازم را دور از چشم کاربر اعمال کنیم و کاربر تنها خروجی مورد نیاز خود را ببیند. برای این منظور ....
بهتره کمی خودتون فکر کنید، تا پست بعدی (البته راه حل های خودتون رو می تونید تو قسمت نظرات بذارید).
ومن الله التوفیق
نظرات 2 + ارسال نظر
مسعود 6 دی 1387 ساعت 03:07

دوست من وبلاگ خوب و مفیدی داری باز هم ادامه بده امیدوارم همیشه در تمام زندگیت موفق باشی

کمال 21 آبان 1391 ساعت 08:47

جناب آقای میثاق باتشکر از اطلاعات مفید شما لطفا اگر امکان دارد برای من بگویید که اگر بخواهیم درمیان 30 نفر به گونه ای رتبه بندی کنیم که در صورت بودن مثلا 4 رتبه دوم رتبه بعد از آنها را ششم بزند تا در نهایت آخرین نفر طبق آمار سیوم شود. یعنی
18 اول
17 دوم
17 دوم
17 دوم
17 دوم
16.5 ششم
.
.
.
.
10 سیوم با تشکر کمال

سلام
همین دستور رنک این کار رو می کنه. در رنک اگه 2 تا یه رتبه داشته باشند، بعدی رو بعد از اون می زنه.

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد