تعالی الله یکی بی مثل و مانند
که خوانندش خداوندان "خداوند"
مقدمه 1
از جمله توابع زیر مجموعه List یکی همین List.Contains و دو تا از اعوان و انصارش است . همین شش مثال را که از سایت مایکروسافت آوردم برای آشنائی اولیه کفایت می کند . در خصوص List.Contains می بینید که پارامتر اولش یک لیست است و پارامتر دوم چیزی از جنس همان اعضاء لیست اول ،ولی نه یک لیست . اما در مورد دو تابع بعدی هر دو پارامتر لیست هستند . یافتن فرق توابع از روی مثال ها آسان است
List.Contains ( { 1 , 2 ,3 , 4 , 5 ,6 } , 4 ) →true
List.Contains ( { "َA" , "B" , "C" , "D" } , "F" ) →false
List.ContainsAll ( { 1 , 2 ,3 , 4 , 5 ,6 } , { 4 , 6 } ) →true
List.ContainsAll ( { 1 , 2 ,3 , 4 , 5 ,6 } , { 4 , 7 } ) →false
List.ContainsAny ( { 1 , 2 ,3 , 4 , 5 ,6 } , { 4 , 7 } ) →true
List.ContainsAll ( { 1 , 2 ,3 , 4 , 5 ,6 } , { 0 , 7 } ) →false
مقدمه 2
پیش از ورود به بحث اصلی فرض کنید در پاور کوئری ستونی از اعداد داریم و می خواهیم حاصلضرب ستون اول را در دو ضرب و در یک ستون جدید جایگزین کنیم . برای این کار عبارت زیر را در یک Custom Column می نویسیم
[Column1]*2
یعنی آقای پاور کوئری لطفا هر سلول را از ستونی بنام [Column1] در دو ضرب کن و حاصلضرب را در ستون جدید درج کن . اینکار – درست یا غلط - مرا یاد حلقه FOR در VBA می اندازد . انگار در هر لحظه یک سلول از ستون Column1 بجای [Column1] نشسته باشد و در دو ضرب شود و حاصل در سلول متناظرش در ستون دوم بنشیند.
بحث اصلی
حالا فرض کنید ستونی از حروف داریم قرار است یک ستون Custom درست کنیم . به این شرط که اگر هر سلول در ستون اول یکی از حروف A یا F یا I یا S بود پاور کوئری برایمان در ستون Custom ، Yes را و در غیر اینصورت No را درج کند .
راه اول
یک راه ساده اینست که اولا جدول تک ستونی آبی رنگ را به محیط پاور کوئری منتقل کنیم و سپس یک ستونی Custom ی Add کنیم و کد زیر را در آن بنویسیم . فقط برای خواناتر شدن چنین نوشتم وگرنه .....
If
[Category]="A" or [Category]="F" or [Category]="I" or [Category]="S"
Then
"yes"
else
"no"
جدول سبز رنگ شکل یک حاصل استفاده از ساده ترین زبان برای رسیدن به مقصود است (اگر کوئری را در اکسل بارگذاری کنیم )
راه دوم
از تابعی که در مقدمه معرفی شد کمک بگیریم و این بار در پنجرهء Custom Column کد زیر را بنویسیم
if List.Contains( {"A" , "F" , "I" , "S" } , [Category] ) = true
then
"Yes"
else
"No"
پارامتر اول تابع ، چنانکه انتظار می رفت لیستی است با چهار عضو . حالا مقدمهء دوم را بخاطر آورید در هر لحظه یکی از سلولهای ستون Categoryبجای [Category] می نشیند و تابع چک می کند آیا محتویات سلول برابر یکی از اعضاء لیست اول هست یا نه ؟ اگر نتیجه true بود که متناظرآن سلول در ستون دوم Yes و در غیر اینصورت No را می نشاند .
سوال : آیا همیشه لیست موجود در پارامتر اول چهار یا پنج تا حرف است یا ممکن است چهل عضو داشته باشد ؟ سوال : آیا بهتر نبود کاربر این اختیار را داشت که هم خود اعضاء لیست و هم تعداد شان را تغییر دهد و به اصطلاح اعضای لیست کاملاً داینامیک باشند ؟ . تصور امکان استفاده از دو روش بالا با فرض داینامیک بودن ِ لیستِ اول محال نیست ؟
مسلما در مثالهای واقعی به این سادگی نیست .
راه سوم
لیست پارامتر اول تابع List.Contains را در یک Table داخل اکسل سامان دادم . ببینید تا صدق گفتارم را دریابید (شیت دوم فایل ضمیمه)
این Table را به ادیتور پاور کوئری منتقل کردم . آن را چنان که می دانید و می بینید به یک لیست تغییر دادم . حالا نامش OuerList است . کد زیر را در پنجرهء Custom Column مرقوم بفرمائید . یک کد شُسته رُفته و ُ کارا .
if List.Contains( OuerList , [Category] ) = true
then
"Yes"
Else
"No
محکم بنشینید و در صفحه اکسل (شیت دو ِ فایل پیوست) یک حرف به جدول MyList اضافه کنید سپس روی جدول سبز رنگ که خروجی کوئری professional است کلیک راست کرده دکمه Refresh را محترمانه بفشارید .
شما را با حس ذوق زدگی رها نمی کنم برایتان یک سورپرایز دیگر دارم . آن را بهمراه کوئریهای مربوط به این مقاله در فایل ضمیمه ببینید .
ندیده های گرامی! شما را به خدا می سپارم .
به عنوان اولین نفر، تجربه یا دیدگاه خود را بنویسید!