اگر چند سال است با Excel کار میکنید، احتمالاً این قانون نانوشته را آنقدر رعایت کردهاید که دیگر به آن فکر نمیکنید: هر سلول فقط یک مقدار. برای ثبت سه منطقه فروش یک بازاریاب، یا باید سه ستون میساختیم، یا سه ردیف، یا هر سه را با ویرگول پشت سر هم در یک سلول تایپ میکردیم و بعد با TEXTSPLIT، SEARCH و Power Query به جانش میافتادیم تا دوباره از هم جدایشان کنیم.
Microsoft حالا قدم بزرگی برداشته است. در نسخههای Beta اکسل، یک سلول میتواند یک List واقعی یا یک Array کامل را در خود نگه دارد، بهطوری که Excel هر عضو را یک مقدار مستقل بشناسد، نه تکهای از یک متن طولانی. این یعنی میتوانید بپرسید «آیا این مشتری سم خریده است؟» و Excel بدون ترفندهای متنی، دقیق و بدون خطای «تطبیق جزئی» جواب بدهد.
در این مقاله، قدمبهقدم و با مثالهایی که به کار روزمره حسابداران، فروشندگان، مدیران پروژه و شرکتهای بازرگانی نزدیک است، یاد میگیریم List چیست، چه تفاوتی با یک متن ساده یا یک Drop-down دارد، توابع جدید HAS، HASANY، HASALL و FLATTEN چطور کار میکنند، و چرا با وجود همه این جذابیتها، این قابلیت جایگزین جدول نرمالشده، Power Query و Power BI نیست.
۱از «یک سلول، یک مقدار» تا «یک سلول، چند مقدار»
Excel از روز اول بر پایه یک مدل ساده ساخته شد: One Cell = One Value. هر سلول یک عدد، یک متن، یک تاریخ یا یک مقدار منطقی را نگه میداشت. این سادگی دلیل اصلی محبوبیت Excel بود، اما در دنیای واقعی خیلی از دادهها ذاتاً «چندتایی» هستند:
- یک فروشنده چند منطقه فروش دارد.
- یک مشتری چند گروه کالا خریداری میکند.
- یک پروژه چند عضو تیم و چند مرکز هزینه دارد.
- یک سفارش از چند قلم کالا تشکیل شده است.
- یک پروژه عمرانی چند مرحله با مدتزمانهای متفاوت دارد.
تا امروز برای نگهداری این دادهها سه راه داشتیم و هر کدام دردسر خودش را داشت. راه اول ساختن ستونهای «منطقه ۱»، «منطقه ۲»، «منطقه ۳» بود که با اضافه شدن منطقه چهارم، ساختار جدول را به هم میریخت. راه دوم ثبت هر منطقه در یک ردیف جداگانه بود که از نظر تحلیلی درست است، اما برای نمایش خلاصه، جدول را طولانی و نامرتب میکند. راه سوم که از همه رایجتر است، تایپ همه مقادیر در یک سلول با ویرگول بود. ظاهرش مرتب بود، اما Excel آن را فقط یک رشته متنی میدید.
قابلیت جدید دقیقاً همین راه سوم را «هوشمند» میکند. شما همچنان همه مقادیر را در یک سلول میبینید، اما Excel این بار میداند که آن سلول شامل چند عضو مستقل است. به این ساختار سه نام مرتبط داده شده که در ادامه با هر سه آشنا میشویم:
| مفهوم | تعریف ساده | مثال |
|---|---|---|
| List in Cell | چند مقدار تایپشده یا Pasteشده که در یک سلول، بهصورت اعضای مستقل نگهداری میشوند. | تهران,کرج,قزوین |
| List members | تکتک مقادیر داخل یک List. هر عضو یک مقدار کامل و مستقل است. | «تهران» یکی از اعضا است |
| Array in Cell | خروجی یک فرمول آرایهای که بهجای Spill شدن در چند سلول، داخل یک سلول باقی میماند. | ={SORT(A2:A10)} |
| Nested Array | آرایهای که اعضای آن خودشان آرایه هستند. مثلاً ستونی از پروژهها که هر کدام فهرستی از مراحل دارند. | پروژه A ← 12,15,20 |
| Dynamic Array / Spill | رفتار آشنای Excel 365: فرمولی که چند نتیجه برمیگرداند و نتایج را در سلولهای مجاور «میریزد». | =SORT(A2:A10) |
Spill یعنی «نتایج را در سلولهای کناری پهن کن». Array in Cell یعنی «نتایج را بستهبندی کن و همه را در همین یک سلول نگه دار». List هم همان بسته است، با این تفاوت که اعضایش را خودتان تایپ کردهاید، نه یک فرمول.
۲وضعیت فعلی قابلیت و پیشنیازها
قبل از هیجانزده شدن، باید بدانیم این قابلیت در چه مرحلهای است. طبق اعلام رسمی Microsoft در وبلاگ Microsoft 365 Insider (مهر ۱۴۰۵ / سپتامبر ۲۰۲۶)، Lists، Arrays in Cells و Nested Arrays در حال حاضر فقط برای کاربران Beta Channel در برنامه Microsoft 365 Insiders منتشر شدهاند.
Build 20520.20000+
Build 26092111+
- انتشار تدریجی: حتی اگر Build شما با شرایط بالا مطابقت دارد، ممکن است قابلیت هنوز برایتان فعال نشده باشد. Microsoft این قابلیتها را مرحلهای منتشر میکند تا کیفیت و کارایی را زیر نظر داشته باشد.
- پلتفرمها: اعلام رسمی فقط Windows و Mac را پوشش میدهد. درباره Excel برای وب، iOS و Android تاکنون اطلاعات رسمی منتشر نشده است.
- احتمال تغییر: چون قابلیت در مرحله Beta است، رفتار، نام توابع و آرگومانها ممکن است تا انتشار عمومی بر اساس بازخورد کاربران تغییر کند.
Compatibility Version 3 چیست؟
Excel برای اینکه تغییر در موتور محاسبه، فایلهای قدیمی را خراب نکند، از تنظیمی به نام Compatibility Version استفاده میکند. Microsoft اعلام کرده که بیشتر محاسبات Nested Array به Compatibility Version 3 نیاز دارند. این تنظیم از مسیر زیر در دسترس است:
Formulas › Calculation Options › Compatibility Version › 3
Microsoft صریحاً گفته که برخی فرمولهای موجود ممکن است در Compatibility Version 3 نتیجه متفاوتی برگردانند، اما فهرست دقیق این فرمولها را منتشر نکرده است. منطقیترین حالت این است که فرمولهایی که قبلاً به خطای #CALC! یا نتیجه ناقص میرسیدند، حالا نتیجه کامل تودرتو برگردانند و این تغییر روی سلولهای وابسته اثر بگذارد. اگر به مشکل خوردید، میتوانید به نسخه 1 یا 2 برگردید.
تا زمانی که این قابلیت به انتشار عمومی نرسیده، آن را روی Workbookهای حساس مثل لیست حقوق، صورتهای مالی، فایلهای اظهارنامه یا گزارشهای مدیریتی اصلی پیاده نکنید. یک نسخه کپی بسازید و تمرین را روی آن انجام دهید.
۳جداکننده List: مهمترین نکته قبل از شروع
وقتی یک List میسازید، اعضا را با یک کاراکتر جداکننده از هم جدا میکنید. نکتهای که بسیاری از آموزشها از آن میگذرند این است که این جداکننده برای همه کاربران یکسان نیست. Excel جداکننده List را از تنظیمات Regional ویندوز (یا تنظیمات زبان و منطقه در Mac) و تنظیمات خود Excel میگیرد. در سیستمهایی که ممیز اعشار نقطه است، معمولاً ویرگول انگلیسی (,) جداکننده است و در سیستمهایی که ممیز اعشار ویرگول است، معمولاً نقطهویرگول.
چطور جداکننده سیستم خودم را پیدا کنم؟
سادهترین روش این است که به یک فرمول معمولی در Excel خودتان نگاه کنید. همان کاراکتری که آرگومانهای توابع را از هم جدا میکند، جداکننده List شما هم هست.
اگر فرمولهای شما این شکلی است:
=IF(A1>10,100,0)
جداکننده سیستم شما ویرگول است:
,
اگر فرمولهای شما این شکلی است:
=IF(A1>10;100;0)
جداکننده سیستم شما نقطهویرگول است:
;
جداکننده اعضای List = جداکننده آرگومانهای فرمول در Excel شما. اگر این دو را یکی بدانید، هیچوقت در ساخت List اشتباه نمیکنید. اگر مثالهای این مقاله را روی سیستمی با جداکننده متفاوت امتحان میکنید، کافی است هر ویرگولِ جداکننده را با جداکننده سیستم خودتان جایگزین کنید.
سیستمی که این مقاله بر اساس آن نوشته شده، از ویرگول (,) استفاده میکند. بنابراین از اینجا به بعد، همه Listها، همه فرمولها و همه تصاویر آموزشی فقط با , نوشته شدهاند و دیگر به جداکننده دوم اشاره نمیکنیم.
۴ساخت اولین List در یک سلول
بیایید با مثال فروش شروع کنیم. آقای احمدی، کارشناس فروش یک شرکت پخش، سه منطقه فروش دارد: تهران، کرج و قزوین. میخواهیم این سه منطقه را در یک سلول نگه داریم، اما به شکل List واقعی.
روش اول: میانبر Ctrl+J
- در سلول
B2بنویسید:تهران,کرج,قزوین - Enter بزنید و دوباره سلول را انتخاب کنید.
- کلید Ctrl + J را بزنید.
Excel متن را بر اساس جداکننده میشکند و هر بخش را به یک عضو مستقل تبدیل میکند. یک آیکون کوچک List در گوشه سلول ظاهر میشود که نشان میدهد این سلول دیگر یک متن ساده نیست. Ctrl + J یک کلید Toggle است. اگر دوباره آن را بزنید، List به متن ساده برمیگردد.
روش دوم: از Ribbon
سلول را انتخاب کنید و از تب Insert گزینه List را بزنید. سپس اعضا را تایپ یا Paste کنید.
ویرایش اعضای List
برای افزودن، حذف یا اصلاح اعضا، روی سلول دابلکلیک کنید یا F2 را بزنید. برای دیدن اعضا بهصورت فهرست، روی آیکون List داخل سلول کلیک کنید.
تهران,کرج,قزوین| A | B | C | |
|---|---|---|---|
| 1 | فروشنده | مناطق فروش | وضعیت |
| 2 | احمدی | تهران,کرج,قزوین | List (3 عضو) |
| 3 | رضایی | تهران,قم | هنوز متن ساده |
| 4 |
تهران,کرج,قزوین| A | B | C | D | |
|---|---|---|---|---|
| 1 | فروشنده | مناطق فروش | ||
| 2 | احمدی | تهران,کرج,قزوین
اعضای List تهران1 کرج2 قزوین3 | ||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 |
ارجاع به یک List چه نتیجهای میدهد؟
یکی از رفتارهای جالب این است که اگر در سلول دیگری فقط به List ارجاع دهید، مثلاً بنویسید =B2، اعضای List در سلولهای زیرین Spill میشوند. یعنی List مثل یک آرایه رفتار میکند و میتوانید روی اعضایش محاسبه انجام دهید.
=B2
۵آیا «تهران,کرج,قم» واقعاً یک List است یا فقط متن؟
این مهمترین مفهومی است که باید در این مقاله جا بیفتد. دو سلول ممکن است در نگاه اول دقیقاً یکسان به نظر برسند، اما Excel آنها را کاملاً متفاوت ببیند.
Text معمولی
Excel کل محتوا را یک رشته ۱۲ کاراکتری میبیند. «تهران» فقط بخشی از این رشته است. برای پیدا کردنش باید از SEARCH یا FIND استفاده کنید که خطر «تطبیق جزئی» دارند. مثلاً جستجوی «رشت» در متنی که «رشتخوار» دارد، به اشتباه نتیجه مثبت میدهد.
List واقعی
Excel سه مقدار مستقل میبیند: «تهران»، «کرج» و «قم». تابع HAS فقط عضو کامل را مقایسه میکند، پس «رشت» هیچوقت با «رشتخوار» اشتباه گرفته نمیشود. COUNTA هم تعداد اعضا را برمیگرداند، نه ۱.
=COUNTA(B3)| A | B | C | D | |
|---|---|---|---|---|
| 1 | نوع | محتوا | COUNTA | HAS «قم» |
| 2 | Text | تهران,کرج,قم | 1 | FALSE* |
| 3 | List | تهران,کرج,قم | 3 | TRUE |
| ویژگی | Text: «تهران,کرج,قم» | List: تهران | کرج | قم |
|---|---|---|
| Excel چند مقدار میبیند؟ | ۱ رشته | ۳ عضو مستقل |
| بررسی وجود «قم» | با SEARCH و ریسک تطبیق جزئی | با HAS و تطبیق کامل |
| شمارش اعضا | فرمولهای ترکیبی LEN و SUBSTITUTE | =COUNTA(B3) |
| مرتبسازی اعضا | TEXTSPLIT + SORT + TEXTJOIN | ={SORT(B3)} |
| فیلتر AutoFilter | فقط کل متن | هر عضو جداگانه در فهرست فیلتر |
| تبدیل | Ctrl+J ← List | Ctrl+J ← Text |
وقتی ستونی از Listها را فیلتر میکنید، هر عضو جداگانه در فهرست AutoFilter ظاهر میشود. یعنی اگر «رشت» را تیک بزنید، فقط ردیفهایی میآیند که واقعاً عضو «رشت» دارند، نه ردیفهایی که فقط کلمهای شبیه آن دارند.
۶Lists in Cells با Drop-down List چه تفاوتی دارد؟
کلمه «List» در Excel سابقه طولانی دارد و همین باعث سردرگمی میشود. وقتی بیشتر کاربران ایرانی «لیست در اکسل» را میشنوند، یاد Data Validation › List میافتند، همان فهرست کشویی که کاربر یک گزینه از آن انتخاب میکند. این دو قابلیت هیچ ربطی به هم ندارند.
Data Validation List (Drop-down)
- هدف: محدود کردن ورودی
- کاربر یک مقدار را از فهرست انتخاب میکند.
- مقدار نهایی سلول یک مقدار ساده است.
- از نسخههای خیلی قدیمی Excel وجود دارد.
فروش
Lists in Cells
- هدف: نگهداری چند مقدار
- سلول چند مقدار مستقل دارد.
- توابع میتوانند روی تکتک اعضا کار کنند.
- فعلاً فقط در Beta Channel Microsoft 365.
فروش,خرید,مالی
مثلاً در فرم ثبت پرسنل، ستون «واحد اصلی» با Drop-down پر میشود چون هر نفر فقط یک واحد اصلی دارد. اما ستون «واحدهایی که دسترسی دارد» میتواند یک List باشد، چون یک کارمند ممکن است به واحدهای فروش، خرید و مالی دسترسی داشته باشد.
در نسخه فعلی، نمیتوانید یک List یا Array را بهعنوان منبع گزینههای Data Validation استفاده کنید. اگر میخواهید اعضای یک List در Drop-down ظاهر شوند، ابتدا آن را با FLATTEN یا یک ارجاع ساده (مثل =B2) در سلولهای معمولی Spill کنید و سپس Drop-down را به آن محدوده متصل کنید.
۷توابع آشنا روی List: COUNTA، COUNT و SUM
خبر خوب این است که لازم نیست برای کار با Listها همه چیز را از نو یاد بگیرید. توابع آشنای Excel حالا اعضای داخل List را میبینند. یعنی وقتی به یک سلول List ارجاع میدهید، تابع با آن مثل یک آرایه از مقادیر رفتار میکند.
COUNTA: شمارش اعضای List
=COUNTA(value1, [value2], ...)
در یک فرم ثبت پروژه، ستون B اعضای تیم را بهصورت List نگه میدارد. میخواهیم بدانیم هر پروژه چند نفر نیرو دارد:
=COUNTA(B2)
COUNT و SUM: کار با Listهای عددی
=COUNT(value1, [value2], ...) =SUM(number1, [number2], ...)
فرض کنید مدتزمان مراحل پروژه A (بر حسب روز) در سلول B2 بهصورت List ثبت شده است: 12,15,20.
=COUNT(B2) =SUM(B2)
=SUM(B2)| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | پروژه | مدت مراحل (روز) | COUNT | SUM | AVERAGE |
| 2 | پروژه A | 12,15,20 | 3 | 47 | 15.67 |
| 3 | پروژه B | 10,18 | 2 | 28 | 14 |
| 4 | پروژه C | 8,11,13,17 | 4 | 49 | 12.25 |
تفاوت COUNT و COUNTA اینجا هم مثل قبل است. اگر Listی مثل 12,در انتظار,20 داشته باشید، COUNTA عدد 3 و COUNT عدد 2 را برمیگرداند. این ترفند سادهای است برای پیدا کردن Listهایی که عضو غیرعددی دارند و شاید اشتباه تایپی باشند.
۸HAS، HASANY و HASALL: سه سؤال اصلی درباره یک List
وقتی دادهها در قالب List ذخیره شدند، پرتکرارترین سؤال این است: «آیا فلان مقدار در این List وجود دارد؟» Microsoft برای پاسخ به همین سؤال سه تابع جدید معرفی کرده است. قبل از رفتن سراغ جزئیات، این جدول را به خاطر بسپارید:
| تابع | سؤالی که میپرسد | منطق | خروجی |
|---|---|---|---|
HAS | آیا این مقدار وجود دارد؟ | یک مقدار | TRUE / FALSE |
HASANY | آیا حداقل یکی از این مقادیر وجود دارد؟ | OR | TRUE / FALSE |
HASALL | آیا همه این مقادیر وجود دارند؟ | AND | TRUE / FALSE |
طبق مستندات رسمی، هر سه تابع دو آرگومان دارند. در HASANY و HASALL، آرگومان دوم (values) یک مجموعه از مقادیر است، نه چند آرگومان جداگانه. بنابراین چند مقدار را باید داخل یک آرایه ثابت با آکولاد { } یا بهصورت ارجاع به یک محدوده بنویسید. شکلهایی مثل =HASANY(B2,"سم","بذر") که گاهی در آموزشهای غیررسمی دیده میشوند، با Syntax رسمی همخوانی ندارند.
=HAS(array, value) =HASANY(array, values) =HASALL(array, values)
- array: List یا آرایهای که میخواهید داخلش جستجو کنید. معمولاً ارجاع به یک سلول List مثل
B2. - value: یک مقدار که دنبالش هستید.
- values: مجموعه مقادیری که دنبالشان هستید، مثل
{"سم","بذر"}یا محدودهF2:F3.
تابع HAS: آیا این مقدار در List هست؟
کاربرد: بررسی وجود یک عضو مشخص در List، با تطبیق کامل. HAS اعضای کامل را مقایسه میکند، نه بخشی از متن. یعنی «علی» با «علیرضا» یکی حساب نمیشود.
مثال ۱: منطقه فروش
فروشندهای سه منطقه دارد: تهران,کرج,قزوین در سلول B2. آیا تهران جزء مناطق اوست؟
=HAS(B2,"تهران")
مثال ۳: عضویت در تیم پروژه
اعضای تیم پروژه در B2 ذخیره شدهاند: علی,رضا,مریم. نام شخص موردنظر را در سلول E1 مینویسیم تا فرمول پویا باشد:
=HAS(B2,E1)
مثال ۵: مراکز هزینه در حسابداری پروژه
در حسابداری صنعتی و پروژهای، یک پروژه ممکن است به چند مرکز هزینه مرتبط باشد. پروژه «ساختمان اداری ونک» در سلول C2 این مراکز هزینه را دارد: اداری,مصالح,نیروی انسانی. قبل از ثبت سند دستمزد، حسابدار میخواهد مطمئن شود که «نیروی انسانی» جزء مراکز هزینه مجاز این پروژه است:
=IF(HAS(C2,"نیروی انسانی"),"مجاز","خارج از مراکز هزینه پروژه")
عضو «نیروی انسانی» یک فاصله در وسط دارد. در یک List، این کلمه یک عضو کامل است و فاصله مشکلی ایجاد نمیکند. اما مراقب فاصلههای اضافی در ابتدا یا انتهای اعضا و تفاوت «ی» و «ک» عربی و فارسی باشید. «نیروی انسانی» با «ي» عربی، از نظر Excel عضو دیگری است.
=HAS(C2,"نیروی انسانی")| A | B | C | D | |
|---|---|---|---|---|
| 1 | کد پروژه | نام پروژه | مراکز هزینه | نیروی انسانی؟ |
| 2 | PRJ-101 | ساختمان اداری ونک | اداری,مصالح,نیروی انسانی | TRUE |
| 3 | PRJ-102 | انبار شهریار | مصالح,حمل | FALSE |
| 4 | PRJ-103 | بازسازی شعبه رشت | نیروی انسانی,مصالح | TRUE |
تابع HASANY: آیا حداقل یکی از این مقادیر هست؟
کاربرد: وقتی چند گزینه دارید و وجود هر کدام کافی است. مثل یک OR روی اعضای List.
مثال ۲ (بخش اول): خریدار سموم یا بذر
شرکتی که نهادههای کشاورزی میفروشد، برای کمپین «فصل کاشت» میخواهد مشتریانی را پیدا کند که حداقل یکی از گروههای «سم» یا «بذر» را خریدهاند. سلول B2 گروههای خریداریشده مشتری را دارد: کود,سم,بذر.
=HASANY(B2,{"سم","بذر"})اگر نمیخواهید مقادیر را داخل فرمول بنویسید، آنها را در یک محدوده کمکی (مثلاً F2:F3) قرار دهید. این روش برای کاربرانی که فرمول را ویرایش نمیکنند امنتر است:
=HASANY(B2,$F$2:$F$3)
=HASANY(B2,{"سم","بذر"})| A | B | C | |
|---|---|---|---|
| 1 | مشتری | گروههای خریداریشده | سم یا بذر؟ |
| 2 | کشت و صنعت مهر | کود,سم,بذر | TRUE |
| 3 | تعاونی روستایی دشت | کود | FALSE |
| 4 | گلخانه سبز البرز | بذر,کود | TRUE |
| 5 | باغات فدک | سم | TRUE |
تابع HASALL: آیا همه این مقادیر هستند؟
کاربرد: وقتی وجود تمام مقادیر شرط است. مثل یک AND روی اعضای List.
مثال ۲ (بخش دوم): خریدار همزمان سم و کود
بخش فروش میخواهد به مشتریانی که هم سم و هم کود خریدهاند، بسته مشاوره فنی رایگان پیشنهاد دهد:
=HASALL(B2,{"سم","کود"})=HASALL(B2,{"سم","کود"})| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | مشتری | گروهها | HAS سم | HASANY سم/بذر | HASALL سم+کود |
| 2 | کشت و صنعت مهر | کود,سم,بذر | TRUE | TRUE | TRUE |
| 3 | تعاونی روستایی دشت | کود | FALSE | FALSE | FALSE |
| 4 | گلخانه سبز البرز | بذر,کود | FALSE | TRUE | FALSE |
| 5 | باغات فدک | سم,کود | TRUE | TRUE | TRUE |
جمعبندی سه تابع با یک مثال واحد
برای مشتری «کشت و صنعت مهر» با List کود,سم,بذر:
=HAS(B2,"سم") → TRUE آیا سم خریده؟
=HASALL(B2,{"سم","کود"}) → TRUE آیا سم و کود هر دو را خریده؟
=HASANY(B2,{"سم","بذر"}) → TRUE آیا حداقل یکی از سم یا بذر را خریده؟این سه تابع جدید هستند و در نسخههایی که Lists را پشتیبانی نمیکنند وجود ندارند. اگر فایل را برای همکاری بفرستید که Excel قدیمیتر یا کانال غیر Beta دارد، احتمالاً بهجای نتیجه با خطای #NAME? روبهرو میشود.
۹Arrays in Cells: آرایه کامل در یک سلول
از زمان معرفی Dynamic Arrays، به رفتار Spill عادت کردهایم. فرمول =SORT(A2:A10) نُه نتیجه برمیگرداند و آنها را در نُه سلول زیرین میریزد. این رفتار عالی است، اما دو مشکل همیشگی دارد:
- اگر یکی از سلولهای مسیر Spill پر باشد، با خطای
#SPILL!روبهرو میشویم. - اگر بخواهیم در هر ردیف یک جدول، یک نتیجه چندتایی داشته باشیم، Spillها روی هم میافتند و عملاً غیرممکن است.
Arrays in Cells راهحل این مشکل است. کافی است فرمول را بین آکولاد قرار دهید: یک { درست بعد از علامت مساوی و یک } در انتهای فرمول. Excel بهجای پخش کردن نتایج، همه آنها را بهصورت یک آرایه داخل همان یک سلول نگه میدارد.
={formula_that_returns_an_array}=SORT(A2:A10) → Spill در 9 سلول
={SORT(A2:A10)} → همه 9 نام، مرتبشده، داخل یک سلول={SORT(A2:A6)}| A | B | C | E | ||
|---|---|---|---|---|---|
| 1 | مشتری | =SORT(A2:A6) | ={SORT(A2:A6)} | ||
| 2 | نیکپخش | آریا تجارت | آریا تجارت,بهار,پارسکود,سپهر,نیکپخش | ||
| 3 | بهار | بهار | (خالی، بدون Spill) | ||
| 4 | سپهر | پارسکود | |||
| 5 | آریا تجارت | سپهر | |||
| 6 | پارسکود | نیکپخش |
یک کاربرد عملی: یک ردیف، یک نتیجه چندتایی
فرض کنید برای هر پروژه میخواهید اعضای تیم را بهصورت مرتبشده در ستون کناری نشان دهید. با Spill معمولی، اگر فرمول را برای ردیف اول بنویسید، نتایج به پایین میریزند و ردیف دوم را اشغال میکنند. اما با آرایه در سلول، هر ردیف نتیجه خودش را دارد:
={SORT(B2)}آرایههای دوبعدی در یک سلول
آرایه داخل سلول محدود به یک ستون نیست. Microsoft اعلام کرده که آرایهها میتوانند هر اندازه و هر شکلی داشته باشند. مثلاً این فرمول یک جدول ۳ ردیفی و ۲ ستونی را داخل یک سلول نگه میدارد:
={SEQUENCE(3,2)}آکولاد اینجا با آکولاد فرمولهای آرایهای قدیمی (CSE که با Ctrl+Shift+Enter ساخته میشد) فرق دارد. در روش قدیمی، Excel خودش آکولاد را دور فرمول نشان میداد. اینجا شما خودتان آکولاد را تایپ میکنید و معنایش «نتیجه را در یک سلول بستهبندی کن» است. Microsoft توضیح داده که این آکولاد یک آرایه 1×1 دور نتیجه میسازد. به همین دلیل نتیجه بهجای Spill شدن در همان سلول میماند.
۱۰مرتبسازی و حذف تکراری با SORT و UNIQUE
توابع SORT و UNIQUE مستقیماً روی اعضای List کار میکنند. انتخاب با شماست که نتیجه Spill شود یا داخل یک سلول بماند.
=SORT(array, [sort_index], [sort_order], [by_col]) =UNIQUE(array, [by_col], [exactly_once])
مثال ۱۰: پاکسازی List گروههای کالایی
اپراتور فروش هنگام ثبت سفارشهای یک مشتری، گروههای کالایی را بدون دقت وارد کرده و List سلول B2 این شکلی شده است: کود,سم,کود,بذر,سم. میخواهیم موارد تکراری حذف و نتیجه مرتب شود:
={SORT(UNIQUE(B2))}=SORT(UNIQUE(B2))
={SORT(UNIQUE(B2),,-1)}=COUNTA(UNIQUE(B2))
مرتبسازی متن فارسی در Excel بر اساس ترتیب حروف الفبای فارسی و تنظیمات زبان سیستم انجام میشود. اگر نتیجه مرتبسازی برایتان عجیب بود، دنبال «ی» و «ک» عربی بگردید. این دو کاراکتر شایعترین دلیل مرتبسازی اشتباه و تکراریهای پنهان در دادههای فارسی هستند.
۱۱برگرداندن List با XLOOKUP
XLOOKUP همچنان همان کار همیشگی را انجام میدهد: یک مقدار را پیدا میکند و مقدار متناظر را برمیگرداند. تفاوت این است که حالا «مقدار متناظر» میتواند یک List کامل باشد.
=XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])
مثال ۹: اعضای تیم بر اساس Project ID
جدول پروژهها در محدوده A1:C4 قرار دارد. ستون A کد پروژه، ستون B نام پروژه و ستون C اعضای تیم بهصورت List است. کد پروژه موردنظر را در E2 مینویسیم:
=XLOOKUP(E2,A2:A4,C2:C4)
={SORT(XLOOKUP(E2,A2:A4,C2:C4))}=HAS(XLOOKUP(E2,A2:A4,C2:C4),"نرگس")
={SORT(XLOOKUP(E2,A2:A4,C2:C4))}| A | B | C | E | F | |
|---|---|---|---|---|---|
| 1 | Project ID | پروژه | اعضای تیم | کد موردنظر | اعضای مرتبشده |
| 2 | P-101 | اپ فروشگاهی | علی,رضا,مریم | P-102 | حمید,سارا,نرگس |
| 3 | P-102 | استقرار ERP | سارا,حمید,نرگس | ||
| 4 | P-103 | داشبورد مالی | مریم,کاوه |
۱۲فیلتر کردن رکوردها بر اساس اعضای List
FILTER در کار با Listها دو نقش دارد: فیلتر کردن اعضای یک List و فیلتر کردن ردیفهای یک جدول بر اساس محتوای Listها.
=FILTER(array, include, [if_empty])
حالت اول: فیلتر کردن اعضای داخل یک List
List مدت مراحل پروژه C در B4 است: 8,11,13,17. مراحلی که بیش از ۱۰ روز طول میکشند کداماند؟
={FILTER(B4,B4>10)}حالت دوم: فیلتر کردن مشتریان بر اساس List محصولات
میخواهیم فهرست مشتریانی را بگیریم که «سم» خریدهاند. مطمئنترین روش استفاده از یک ستون کمکی است:
- در C2 بنویسید
=HAS(B2,"سم")و تا پایین جدول کپی کنید. - سپس در هر جای دلخواه بنویسید:
=FILTER(A2:A5,C2:C5,"مشتریای یافت نشد")
کاربران حرفهایتر میتوانند ستون کمکی را حذف کنند و منطق را با MAP و LAMBDA مستقیماً داخل فرمول بنویسند. MAP هر سلول از ستون B را جداگانه به HAS میدهد:
=FILTER(A2:A5,MAP(B2:B5,LAMBDA(x,HAS(x,"سم"))))
نسخه MAP به نحوه رفتار Nested Arrays در Compatibility Version 3 وابسته است. چون قابلیت در Beta است، این نوع فرمولها را حتماً روی داده خودتان آزمایش کنید و نتیجه را با نسخه ستون کمکی مقایسه کنید. ستون کمکی هم سادهتر است و هم برای همکارانتان قابلفهمتر.
نوشتن =HAS(B2:B5,"سم") بهجای نسخه ردیفبهردیف، معنای دیگری دارد: در این حالت کل محدوده بهعنوان یک آرایه به HAS داده میشود و انتظار نداشته باشید برای هر ردیف یک نتیجه جداگانه بگیرید. برای نتیجه ردیفی، HAS را برای هر سلول جداگانه بنویسید یا از MAP استفاده کنید.
۱۳Nested Arrays: آرایههای تودرتو به زبان ساده
تا اینجا دیدیم که یک سلول میتواند یک List داشته باشد. حالا یک قدم جلوتر برویم: اگر یک ستون داشته باشیم که هر سلولش یک List باشد، کل آن ستون چیست؟ جواب: یک آرایه که اعضایش خودشان آرایه هستند. به این ساختار Nested Array یا آرایه تودرتو میگویند.
مثال ۸: پروژههایی با تعداد مراحل متفاوت
یک شرکت پیمانکاری سه پروژه دارد و مدتزمان هر مرحله (روز) را ثبت کرده است:
| پروژه | مراحل (روز) | تعداد مراحل |
|---|---|---|
| پروژه A | 12,15,20 | ۳ |
| پروژه B | 10,18 | ۲ |
| پروژه C | 8,11,13,17 | ۴ |
مشکل ساختار سنتی
در جدول سنتی Excel، برای این دادهها یا باید به اندازه بیشترین تعداد مراحل ستون بسازیم (مرحله ۱ تا مرحله ۴) که نتیجهاش سلولهای خالی زیاد است، یا هر مرحله را در یک ردیف جدا ثبت کنیم. اگر فردا پروژهای با ۹ مرحله اضافه شود، در روش اول باید ۵ ستون جدید بسازیم و همه فرمولها را اصلاح کنیم.
از طرف دیگر، تا قبل از این قابلیت، اگر فرمولی مینوشتیم که برای هر ردیف یک آرایه برمیگرداند (مثلاً با MAP یا BYROW)، Excel با خطای #CALC! متوقف میشد یا فقط بخشی از نتیجه را نشان میداد. Microsoft اعلام کرده که با Nested Arrays، فرمولهای پشتیبانیشده حالا نتیجه کامل را برمیگردانند.
فرض کنید میخواهیم برای هر پروژه، مراحلی را که بیش از ۱۲ روز طول میکشند جدا کنیم. خروجی هر پروژه تعداد متفاوتی عضو دارد، یعنی یک آرایه از آرایهها:
=MAP(B2:B4,LAMBDA(s,FILTER(s,s>12,"")))
=MAP(B2:B4,LAMBDA(s,FILTER(s,s>12,"")))| A | B | C | D | E | F | H | ||
|---|---|---|---|---|---|---|---|---|
| 1 | پروژه | مراحل (List) | م۱ | م۲ | م۳ | م۴ | بیش از 12 روز | |
| 2 | پروژه A | 12,15,20 | 12 | 15 | 20 | 15,20 | ||
| 3 | پروژه B | 10,18 | 10 | 18 | 18 | |||
| 4 | پروژه C | 8,11,13,17 | 8 | 11 | 13 | 17 | 13,17 |
در این ساختار دو سطح وجود دارد. سطح بیرونی: آرایهای سهعضوی (یک عضو برای هر پروژه). سطح درونی: آرایه مراحل هر پروژه با طول ۱، ۲ یا ۳. به همین دلیل اسمش «تودرتو» است. Microsoft حتی نمونه آرایههای ثابت تودرتو را هم با آکولادهای چندلایه نشان داده است. یعنی آرایهای که اعضایش داخل آکولادهای جداگانه قرار دارند.
همیشه با یک فرمول سادهتر میتوانید ساختار تودرتو را حس کنید: در یک سلول خالی بنویسید =B2:B4. نتیجه، سه سلول است که هر کدام همان List پروژه متناظر را دارند. یعنی ارجاع به ستونی از Listها، دوباره Listها را برمیگرداند، نه اعضای تکی را. برای رسیدن به اعضای تکی، به FLATTEN نیاز دارید.
۱۴FLATTEN: تبدیل Listها به داده ساده
FLATTEN شاید کاربردیترین تابع جدید این مجموعه باشد. کارش ساده است: یک یا چند سطح از تودرتویی را حذف میکند تا هر عضو در سلول خودش قرار بگیرد. هر جا ابزاری از Excel هنوز با Listها کنار نمیآید (PivotTable، Chart، Data Validation)، FLATTEN پل ارتباطی شماست.
=FLATTEN(array, [pad_value], [levels])
| آرگومان | اجباری؟ | توضیح |
|---|---|---|
array | بله | List، آرایه تودرتو یا محدودهای از سلولهای List که میخواهید باز شود. |
pad_value | خیر | مقداری برای پر کردن جاهای خالی، وقتی ردیفها تعداد عضو متفاوتی دارند و نتیجه حالت جدولی پیدا میکند. |
levels | خیر | تعداد سطحهایی از تودرتویی که باید حذف شود. برای ساختارهای چندلایه کاربرد دارد. |
مثال ۱۱: باز کردن مناطق فروشندگان
ستون B مناطق سه فروشنده را بهصورت List نگه میدارد. میخواهیم همه مناطق را بهصورت داده ساده، هر کدام در یک سلول، داشته باشیم:
=FLATTEN(B2:B4)
=FLATTEN(B2:B4)| A | B | D | E | ||
|---|---|---|---|---|---|
| 1 | فروشنده | مناطق (List) | FLATTEN | SORT(UNIQUE(FLATTEN)) | |
| 2 | احمدی | تهران,کرج | تهران | تهران | |
| 3 | رضایی | تهران,قم | کرج | رشت | |
| 4 | محمدی | رشت,ساری | تهران | ساری | |
| 5 | قم | قم | |||
| 6 | رشت | کرج | |||
| 7 | ساری |
ترکیب طلایی: SORT + UNIQUE + FLATTEN
رایجترین ترکیبی که با آن کار خواهید کرد این است: همه Listها را باز کن، تکراریها را حذف کن و مرتب کن. نتیجه، فهرست کامل و یکتای همه مقادیری است که در ستون استفاده شدهاند:
=SORT(UNIQUE(FLATTEN(B2:B20)))
={SORT(UNIQUE(FLATTEN(B2:B20)))}اگر محدودهای مثل B2:B20 انتخاب کنید و فقط چند ردیف اول پر باشد، سلولهای خالی هم وارد محاسبه میشوند و ممکن است عضو خالی یا صفر در خروجی ببینید. بهترین راه، تبدیل داده به Excel Table و استفاده از ارجاع ساختیافته مثل =FLATTEN(Sales[مناطق]) است تا محدوده همیشه دقیق باشد و با اضافه شدن ردیف جدید خودکار بزرگ شود.
وقتی نتیجه FLATTEN به شکل جدولی درمیآید و ردیفها تعداد عضو یکسانی ندارند (مثل پروژههای A، B و C با ۳، ۲ و ۴ مرحله)، Excel باید جاهای خالی را با چیزی پر کند. با pad_value تعیین میکنید آن چیز چه باشد، مثلاً رشته خالی "" یا عدد 0. این آرگومان مثل آرگومان مشابه در توابعی مثل TEXTSPLIT و EXPAND عمل میکند.
۱۵شمارش و گروهبندی با GROUPBY
GROUPBY یکی از توابع جدیدتر Microsoft 365 است که یک خلاصه شبیه PivotTable را فقط با یک فرمول میسازد. در کنار FLATTEN، تبدیل به ابزار اصلی تحلیل Listها میشود.
=GROUPBY(row_fields, values, function, [field_headers], [total_depth], [sort_order], [filter_array], [field_relationship])
مثال ۱۲: هر منطقه چند بار تکرار شده؟
به جدول فروشندگان یک نفر دیگر اضافه میکنیم تا مثال واقعیتر شود:
| فروشنده | مناطق (List) |
|---|---|
| احمدی | تهران,کرج |
| رضایی | تهران,قم |
| محمدی | رشت,ساری |
| کریمی | تهران,کرج,اصفهان |
منطق کار ساده است: ابتدا Listها را با FLATTEN باز میکنیم، سپس همان ستون باز شده را هم بهعنوان فیلد گروهبندی و هم بهعنوان مقدار به GROUPBY میدهیم و تابع COUNTA را برای شمارش انتخاب میکنیم:
=GROUPBY(FLATTEN(B2:B5),FLATTEN(B2:B5),COUNTA,0,0,{-2,1})FLATTEN(B2:B5)اول: فیلد گروهبندی (نام مناطق).FLATTEN(B2:B5)دوم: مقادیری که شمرده میشوند.COUNTA: تابع تجمیع.0اول (field_headers): داده سرستون ندارد.0دوم (total_depth): ردیف جمع کل نمایش داده نشود.{-2,1}(sort_order): اول بر اساس ستون دوم (تعداد) نزولی، و در صورت برابری بر اساس ستون اول (نام منطقه) صعودی.
=GROUPBY(FLATTEN(B2:B5),FLATTEN(B2:B5),COUNTA,0,0,{-2,1})| A | B | D | E | ||
|---|---|---|---|---|---|
| 1 | فروشنده | مناطق | منطقه | تعداد | |
| 2 | احمدی | تهران,کرج | تهران | 3 | |
| 3 | رضایی | تهران,قم | کرج | 2 | |
| 4 | محمدی | رشت,ساری | اصفهان | 1 | |
| 5 | کریمی | تهران,کرج,اصفهان | رشت | 1 | |
| 6 | ساری | 1 | |||
| 7 | قم | 1 |
| منطقه | تعداد |
|---|---|
| تهران | 3 |
| کرج | 2 |
| اصفهان | 1 |
| رشت | 1 |
| ساری | 1 |
| قم | 1 |
مسیر برعکس: ساختن List برای هر گروه
GROUPBY میتواند کار برعکس را هم انجام دهد. اگر داده شما در قالب نرمالشده (هر فروشنده و منطقه در یک ردیف) است و میخواهید برای گزارش مدیریتی، مناطق هر فروشنده را در یک سلول ببینید، تابع تجمیع را UNIQUE قرار دهید. نتیجه هر گروه یک List خواهد بود:
=GROUPBY(A2:A10,B2:B10,UNIQUE,0,0)
این دو فرمول در کنار هم یک الگوی کامل میسازند: داده را در قالب نرمال (ردیف به ردیف) نگه دارید، برای نمایش با GROUPBY(...,UNIQUE) آن را به List تبدیل کنید، و هر جا List را از منبع دیگری گرفتید، برای تحلیل با FLATTEN بازش کنید.
۱۶سناریوی کامل: مناطق تحت پوشش فروشندگان
حالا همه چیز را در یک سناریوی واقعی کنار هم میگذاریم (مثال ۴). مدیر فروش یک شرکت پخش مواد غذایی، جدول زیر را در یک Excel Table به نام Reps نگه میدارد و سه سؤال دارد:
| A: فروشنده | B: مناطق | |
|---|---|---|
| 2 | احمدی | تهران,کرج |
| 3 | رضایی | تهران,قم |
| 4 | محمدی | رشت,ساری |
| 5 | کریمی | تهران,کرج,اصفهان |
سؤال ۱: چه مناطقی پوشش داده شدهاند؟
=SORT(UNIQUE(FLATTEN(B2:B5)))
=COUNTA(UNIQUE(FLATTEN(B2:B5)))
سؤال ۲: چند فروشنده در تهران فعالیت دارند؟
روش اول (ستون کمکی، توصیهشده): در C2 بنویسید =HAS(B2,"تهران") و تا C5 کپی کنید. سپس:
=COUNTIF(C2:C5,TRUE)
روش دوم (یک فرمول): تعداد دفعاتی را بشمارید که «تهران» در خروجی FLATTEN آمده است:
=SUM(--(FLATTEN(B2:B5)="تهران"))
روش دوم «تعداد تکرار» را میشمارد، نه «تعداد فروشنده». فقط وقتی این دو برابرند که هیچ فروشندهای یک منطقه را دو بار در List خودش نداشته باشد. اگر از تمیز بودن داده مطمئن نیستید، روش ستون کمکی با HAS را انتخاب کنید.
سؤال ۳: چه کسانی در تهران فعالیت دارند؟
={FILTER(A2:A5,C2:C5)}با همین چند فرمول، مدیر فروش بدون Power Query و بدون ستونهای اضافی برای «منطقه ۱، منطقه ۲، منطقه ۳»، یک داشبورد کوچک و پویا ساخته است. هر بار که منطقهای به List یک فروشنده اضافه شود، همه نتایج خودکار بهروز میشوند.
۱۷شرکت بازرگانی و سفارش مشتری: کی List، کی جدول؟
مثال ۶: گروههای کالایی مشتریان یک شرکت بازرگانی
یک شرکت بازرگانی که نهادههای کشاورزی وارد و توزیع میکند، در فایل CRM ساده خودش برای هر مشتری گروههای کالایی موردعلاقه را ثبت میکند. این داده «ویژگی» مشتری است، نه تراکنش، و جای ایدهآلی برای List است:
| مشتری | استان | گروههای کالایی (List) |
|---|---|---|
| کشت و صنعت مهر | خوزستان | کود,سم,بذر |
| تعاونی روستایی دشت | فارس | کود |
| گلخانه سبز البرز | البرز | بذر,کود |
| باغات فدک | کرمان | سم,کود |
چند تحلیل پرکاربرد روی این جدول:
=GROUPBY(FLATTEN(C2:C5),FLATTEN(C2:C5),COUNTA,0,0,{-2,1})D2: =COUNTA(C2)
=FILTER(A2:A5,(D2:D5=1)*(MAP(C2:C5,LAMBDA(x,HAS(x,"کود")))))=HASANY(C2,{"سم","بذر"})=FILTER(A2:A5,E2:E5)
مثال ۷: سفارش چندقلمی: اینجا List انتخاب درستی نیست
حالا یک سفارش را در نظر بگیرید که سه قلم کالا دارد:
کود 15.5.30,سم حشرهکش,بذر خیار
وسوسهانگیز است که همه اقلام سفارش را در یک List ذخیره کنیم. اما هر قلم سفارش اطلاعات خودش را دارد: مقدار، واحد، قیمت واحد، تخفیف، انبار تحویل و شماره بچ. اگر اقلام را در List نگه دارید، این اطلاعات کجا ثبت میشوند؟ مجبور میشوید چند List موازی بسازید (List مقادیر، List قیمتها و...) و امیدوار باشید ترتیبشان هیچوقت به هم نریزد. این دقیقاً همان جایی است که جدول نرمالشده برنده است:
| شماره سفارش | کالا | مقدار | واحد | قیمت واحد (ریال) |
|---|---|---|---|---|
| SO-1405-118 | کود 15.5.30 | 40 | کیسه | 4,850,000 |
| SO-1405-118 | سم حشرهکش | 12 | لیتر | 2,300,000 |
| SO-1405-118 | بذر خیار | 5 | بسته | 9,700,000 |
- اگر هر عضو فقط یک برچسب یا ویژگی است (منطقه، مهارت، گروه کالا، مرکز هزینه، عضو تیم) ← List گزینه خوبی است.
- اگر هر عضو اطلاعات وابسته دارد (مقدار، مبلغ، تاریخ، وضعیت) ← هر عضو را در یک ردیف جدول نرمالشده ثبت کنید.
- اگر فقط برای نمایش خلاصه به List نیاز دارید ← داده را نرمال نگه دارید و با
GROUPBY(...,UNIQUE)یا={UNIQUE(FILTER(...))}List نمایشی بسازید.
برای همین سفارش، اگر در گزارش خلاصه سفارشها میخواهید اقلام هر سفارش را در یک سلول ببینید، کافی است از جدول نرمالشده بالا (با نام OrderLines) یک List نمایشی بسازید:
={FILTER(OrderLines[کالا],OrderLines[شماره سفارش]=H2)}۱۸آیا Lists in Cells جایگزین مدل داده استاندارد است؟
پاسخ کوتاه: خیر.
Lists in Cells یک ابزار عالی برای نمایش فشرده، ورود سریع دادههای برچسبی و تحلیلهای سبک داخل خود Excel است. اما اصول مدلسازی داده که سالها در دیتابیسها، Power Query، Power BI و PivotTable جواب دادهاند، با آمدن این قابلیت عوض نشدهاند. این ابزارها با ساختار نرمالشده بهترین عملکرد را دارند. یعنی هر ردیف یک واقعیت، و هر ستون یک ویژگی.
مناسب برای تحلیل
| مشتری | محصول |
|---|---|
| شرکت الف | کود |
| شرکت الف | سم |
| شرکت الف | بذر |
PivotTable، Power Query، Power BI و هر دیتابیسی مستقیماً با این ساختار کار میکند.
مناسب برای نمایش
| مشتری | محصولات |
|---|---|
| شرکت الف | کود,سم,بذر |
برای گزارش خلاصه جذابتر و فشردهتر است، اما الزاماً بهترین مدل تحلیلی نیست.
چرا مدل نرمالشده هنوز ضروری است؟
- PivotTable: طبق اعلام Microsoft، PivotTable فعلاً مقادیر داخل آرایهها را نمیخواند. ستونی از Listها در Pivot قابل تحلیل عضوبهعضو نیست.
- Power Query: Power Query فعلاً ستونهای آرایهای را نه بارگذاری میکند و نه خروجی میدهد. اگر Workbook شما منبع Power Query یا Power BI است، ستونهای List را به داده ساده تبدیل کنید.
- Power BI و مدل داده: روابط بین جداول، مدل ستارهای (Star Schema) و اندازههای DAX بر پایه یک مقدار در هر ستون از هر ردیف طراحی شدهاند. در Power Query هم ابزار Split Column › By Delimiter › Rows دقیقاً برای تبدیل متنهای چندمقداری به ردیفهای نرمال وجود دارد.
- یکپارچگی داده: در جدول نرمالشده میتوانید برای هر محصول اطلاعات تکمیلی (مبلغ، تاریخ، مقدار) نگه دارید. در List فقط خود برچسب را دارید.
- سازگاری: جدول نرمالشده در هر نسخه Excel، Google Sheets، دیتابیس و نرمافزار حسابداری قابل استفاده است. List فعلاً فقط در Beta Channel کار میکند.
لایه ذخیره داده: جدول نرمالشده (Excel Table یا دیتابیس). لایه تحلیل: PivotTable، Power Query، Power BI یا توابعی مثل GROUPBY روی همان جدول نرمال. لایه نمایش: Lists in Cells برای گزارشهای فشرده و داشبوردهای داخل Excel. اگر List را از منبع دیگری دریافت کردهاید، با FLATTEN آن را به لایه تحلیل برگردانید.
۱۹محدودیتهای فعلی
Microsoft در اعلام رسمی خود فهرست مشخصی از محدودیتها را منتشر کرده است. دانستن این محدودیتها قبل از طراحی یک فایل جدی ضروری است:
| بخش Excel | وضعیت فعلی | راهحل موقت |
|---|---|---|
| وضعیت انتشار | Beta Channel (Insiders)، انتشار تدریجی | فقط روی فایلهای آزمایشی استفاده شود |
| Compatibility Version | بیشتر محاسبات تودرتو به نسخه 3 نیاز دارند، و برخی فرمولها در نسخه 3 نتیجه متفاوت میدهند | قبل از تغییر نسخه، از فایل کپی بگیرید و نتایج را مقایسه کنید |
| PivotTable | مقادیر آرایهای را نمیخواند | FLATTEN در یک محدوده کمکی یا جدول نرمال |
| Power Query | ستونهای آرایهای را بارگذاری یا خروجی نمیکند | نگهداشتن نسخه متنی یا نرمال داده برای Power Query |
| Charts | اعضای آرایه به نقاط داده تبدیل نمیشوند | FLATTEN یا GROUPBY و ساخت نمودار روی خروجی |
| Data Validation | List یا Array نمیتواند منبع Drop-down باشد | Spill کردن اعضا در سلولهای معمولی و ارجاع به آنها |
| Conditional Formatting | بدون فرمول، محتوای آرایه را بررسی نمیکند | قانون فرمولی، مثلاً =HAS($B2,"تهران") |
| Find & Replace | نمیتواند اعضای List یا Array را جایگزین کند | ویرایش دستی با F2 یا بازسازی List با فرمول |
| پلتفرمها | اعلام رسمی فقط برای Windows و Mac | برای وب و موبایل منتظر اطلاعیه رسمی بمانید |
| Workbookهای قدیمی و نسخههای قبلی | Microsoft هنوز رفتار دقیق باز شدن این فایلها در نسخههای قدیمیتر را مستند نکرده است | فایلهای اشتراکی را بدون List نگه دارید |
برای اینکه ردیف فروشندگانی که در تهران فعالیت دارند سبز شود، محدوده A2:B5 را انتخاب کنید و از مسیر Home › Conditional Formatting › New Rule › Use a formula این فرمول را بنویسید: =HAS($B2,"تهران"). چون Conditional Formatting بدون فرمول وارد List نمیشود، این روش بهترین گزینه فعلی است.
اگر فایل را با مشتری، حسابرس یا همکاری به اشتراک میگذارید که Excel 2019، Excel 2021، Excel 2024 یا Microsoft 365 در کانال عادی دارد، فرض را بر این بگذارید که Listها، توابع HAS، HASANY، HASALL و FLATTEN و آرایههای داخل سلول برای او قابل استفاده نیستند. برای فایلهای اشتراکی، نسخهای با داده ساده تهیه کنید.
۲۰توصیههای عملی برای استفاده حرفهای
- یکسانسازی کاراکترها: قبل از تبدیل متن به List، «ی» و «ک» عربی را به فارسی تبدیل کنید و فاصلههای اضافه را حذف کنید. HAS دقیق مقایسه میکند و «تهران » (با فاصله) را با «تهران» یکی نمیداند.
- از Excel Table استفاده کنید: ارجاعهایی مثل
Reps[مناطق]هم خواناتر هستند و هم با اضافه شدن ردیف جدید، خودکار گسترش پیدا میکنند. - معیارها را در سلول بنویسید: بهجای
=HAS(B2,"تهران")از=HAS(B2,$F$1)استفاده کنید تا گزارش با تغییر یک سلول بهروز شود. - ستون کمکی عیب نیست: یک ستون HAS ساده، برای همکاران شما بسیار قابلفهمتر از یک فرمول MAP و LAMBDA طولانی است.
- برای Pivot و نمودار، اول FLATTEN: یک شیت کمکی بسازید که Listها را باز میکند و ابزارهای کلاسیک را به آن وصل کنید.
- Listها را کوتاه و برچسبی نگه دارید: اگر یک List بیش از چند ده عضو دارد یا اعضایش اطلاعات وابسته دارند، احتمالاً به یک جدول جداگانه نیاز دارید.
- نسخهبندی و مستندسازی: در یک شیت «راهنما» بنویسید که فایل از Lists و Compatibility Version 3 استفاده میکند تا کاربر بعدی غافلگیر نشود.
- Beta را جدی بگیرید: روی فایلهای عملیاتی و مالی، تا انتشار عمومی صبر کنید.
۲۱جدول جمعبندی
| تابع / مفهوم | کاربرد | نمونه فرمول | نتیجه نمونه |
|---|---|---|---|
| List in Cell | چند مقدار مستقل در یک سلول | تهران,کرج,قزوین + Ctrl+J | List سهعضوی |
| HAS | وجود یک مقدار | =HAS(B2,"سم") | TRUE |
| HASANY | وجود حداقل یکی از مقادیر | =HASANY(B2,{"سم","بذر"}) | TRUE |
| HASALL | وجود همه مقادیر | =HASALL(B2,{"سم","کود"}) | TRUE |
| COUNTA | تعداد اعضای List | =COUNTA(B2) | 3 |
| COUNT | تعداد اعضای عددی | =COUNT(B2) | 3 |
| SUM | جمع اعضای عددی | =SUM(B2) | 47 |
| Array in Cell | نگهداشتن خروجی آرایهای در یک سلول | ={SORT(A2:A10)} | آرایه مرتب در یک سلول |
| SORT + UNIQUE | پاکسازی و مرتبسازی List | ={SORT(UNIQUE(B2))} | بذر,سم,کود |
| XLOOKUP | برگرداندن List متناظر | =XLOOKUP(E2,A2:A4,C2:C4) | اعضای تیم پروژه |
| FILTER | فیلتر اعضا یا ردیفها | ={FILTER(B4,B4>10)} | 11,13,17 |
| Nested Arrays | آرایهای از آرایهها | =MAP(B2:B4,LAMBDA(s,FILTER(s,s>12,""))) | یک آرایه برای هر پروژه |
| FLATTEN | حذف تودرتویی و تبدیل به داده ساده | =FLATTEN(B2:B4) | هر عضو در یک سلول |
| GROUPBY | شمارش و گروهبندی اعضا | =GROUPBY(FLATTEN(B2:B5),FLATTEN(B2:B5),COUNTA,0,0,{-2,1}) | تهران 3، کرج 2، ... |
۲۲سؤالات متداول
آیا میتوان چند مقدار را در یک سلول Excel قرار داد؟
بله، با قابلیت جدید Lists in Cells. البته این قابلیت در حال حاضر فقط برای کاربران Microsoft 365 Insiders در Beta Channel نسخه Windows (Version 2610، Build 20520.20000 به بعد) و Mac (Version 16.114، Build 26092111 به بعد) و بهصورت تدریجی منتشر شده است. در نسخههای دیگر، تایپ چند مقدار در یک سلول فقط یک متن ساده میسازد.
Lists in Cells چیست؟
قابلیتی که اجازه میدهد چند مقدار را در یک سلول نگه دارید، بهطوری که Excel هر کدام را یک مقدار مستقل بشناسد. میتوانید روی تکتک اعضا فیلتر بگذارید، با HAS وجودشان را بررسی کنید و با توابعی مثل COUNTA، SUM و SORT روی آنها محاسبه انجام دهید.
تفاوت List با Text چیست؟
متن «تهران,کرج,قم» برای Excel یک رشته واحد است و COUNTA آن را ۱ میشمارد. اما List با همین ظاهر، سه عضو مستقل دارد و COUNTA عدد ۳ را برمیگرداند. در List، جستجو با HAS دقیق و بدون تطبیق جزئی انجام میشود. با Ctrl+J میتوانید بین این دو حالت جابهجا شوید.
جداکننده List در Excel چیست؟
همان جداکننده آرگومانهای فرمول در Excel شما. اگر فرمولهایتان به شکل =IF(A1>10,100,0) نوشته میشوند، جداکننده List شما ویرگول است. همه مثالهای این مقاله با ویرگول نوشته شدهاند.
چرا جداکننده من با جداکننده سیستم دیگری فرق دارد؟
چون Excel جداکننده را از تنظیمات Regional سیستمعامل و تنظیمات Excel میگیرد. در مناطقی که ممیز اعشار ویرگول است، Excel برای جداکننده از کاراکتر دیگری استفاده میکند تا با اعداد اعشاری اشتباه نشود. به همین دلیل یک فایل ممکن است روی دو سیستم با فرمولهایی به ظاهر متفاوت نمایش داده شود، در حالی که منطق یکسان است.
تابع HAS در Excel چیست؟
تابعی جدید با Syntax =HAS(array,value) که اگر مقدار موردنظر یکی از اعضای آرایه یا List باشد، TRUE و در غیر این صورت FALSE برمیگرداند. مقایسه روی اعضای کامل انجام میشود، پس «علی» با «علیرضا» یکی نیست.
تفاوت HAS و HASANY چیست؟
HAS فقط یک مقدار را بررسی میکند. HASANY مجموعهای از مقادیر را میگیرد (مثل {"سم","بذر"} یا یک محدوده) و اگر حداقل یکی از آنها در List باشد، TRUE برمیگرداند. HASANY در واقع چند HAS است که با OR ترکیب شدهاند.
تابع HASALL چه کاربردی دارد؟
HASALL زمانی TRUE برمیگرداند که همه مقادیر دادهشده در List وجود داشته باشند. مثلاً =HASALL(B2,{"سم","کود"}) مشتریانی را مشخص میکند که هر دو گروه کالایی را خریدهاند. کاربرد رایجش بررسی پیشنیازها، مهارتهای لازم یا کامل بودن مدارک است.
FLATTEN در Excel چیست؟
تابعی جدید با Syntax =FLATTEN(array,[pad_value],[levels]) که یک یا چند سطح از آرایههای تودرتو را حذف میکند. کاربرد اصلیاش باز کردن ستونی از Listها به مقادیر ساده است تا بتوانید آنها را با UNIQUE، GROUPBY، نمودار یا PivotTable تحلیل کنید.
آیا Lists in Cells جایگزین Power Query است؟
خیر. Power Query ابزار استخراج، پاکسازی و تبدیل داده از منابع مختلف است و فعلاً حتی ستونهای آرایهای را بارگذاری یا خروجی نمیکند. Lists in Cells برای نگهداری و تحلیل سبک دادههای چندمقداری داخل خود Excel مناسب است. در پروژههای جدی، این دو مکمل یکدیگرند، نه جایگزین هم.
آیا این قابلیت در Excel قدیمی وجود دارد؟
خیر. این قابلیت فقط در Microsoft 365 و فعلاً فقط در Beta Channel عرضه شده است. Microsoft هنوز بهطور رسمی توضیح نداده که فایلهای حاوی List در نسخههای قدیمیتر دقیقاً چطور نمایش داده میشوند. پس برای فایلهایی که باید در نسخههای قدیمی باز شوند از آن استفاده نکنید.
آیا Lists in Cells در Excel 2021 کار میکند؟
خیر. Excel 2021 یک نسخه دائمی (Perpetual) است و قابلیتهای جدید Microsoft 365 به آن اضافه نمیشوند. حتی تابع GROUPBY هم در Excel 2021 وجود ندارد. تا این لحظه Microsoft هیچ برنامهای برای ارائه Lists به نسخههای دائمی اعلام نکرده است.
آیا میتوان از Lists داخل PivotTable استفاده کرد؟
در حال حاضر خیر. طبق اعلام Microsoft، PivotTable مقادیر داخل آرایهها را نمیخواند. راهحل این است که داده را با FLATTEN در یک محدوده کمکی باز کنید یا آن را از ابتدا بهصورت جدول نرمالشده نگه دارید و PivotTable را روی آن بسازید.
Compatibility Version 3 را کجا فعال کنم و آیا خطری دارد؟
از مسیر Formulas › Calculation Options › Compatibility Version. Microsoft اعلام کرده که بیشتر محاسبات Nested Array به نسخه 3 نیاز دارند و برخی فرمولهای موجود در این نسخه ممکن است نتیجه متفاوتی بدهند. قبل از تغییر، از فایل نسخه پشتیبان بگیرید. در صورت بروز مشکل، میتوانید به نسخه 1 یا 2 برگردید.
چرا HASANY(B2,"سم","بذر") کار نمیکند؟
چون طبق Syntax رسمی، HASANY و HASALL فقط دو آرگومان دارند: array و values. چند مقدار باید در قالب یک آرایه ثابت یا محدوده ارسال شوند: =HASANY(B2,{"سم","بذر"}).
۲۳منابع
- منبع رسمی Microsoft: Microsoft 365 Insider Blog، «Put multiple values in one cell with lists and arrays in Excel»
techcommunity.microsoft.com/blog/Microsoft365InsiderBlog/put-multiple-values-in-one-cell-with-lists-and-arrays-in-excel/4559395 - منبع آموزشی XelPlus: «Excel Lists in Cells: Put Multiple Values in One Cell»
xelplus.com/excel-lists-in-cells
این مقاله بر اساس اطلاعات منتشرشده تا مهر ۱۴۰۵ (اکتبر ۲۰۲۶) نوشته شده است. Lists، Arrays in Cells و Nested Arrays در مرحله Beta هستند و Microsoft ممکن است رفتار، نام توابع یا محدودیتها را تا انتشار عمومی تغییر دهد. هر جا بین منابع تفاوتی وجود داشت، مستندات رسمی Microsoft ملاک قرار گرفته است. تمام مثالها، دادهها و نامهای این مقاله ساختگی و برای آموزش طراحی شدهاند.
درباره محمود بنی اسدی (مدیر سایت)
فارغ التحصیل کارشناسی ارشد حسابداری، ده سال سابقه تدریس اکسل در سطوح مختلف از قبیل فرمول نویسی، ابزارهای هوش تجاری، ترفندها و ... ، نویسنده شش مقاله در سطح ملی و ISI
نوشتههای بیشتر از محمود بنی اسدی (مدیر سایت)دیدگاهتان را بنویسید لغو پاسخ
این سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.

