بهمدت سالها، من مشکلات پیچیدهٔ صفحهگسترده را به همان روش حل میکردم: افزودن ستونهای کمکی، پیکربندی فرمولهای بهصورت لایهلایه، و وقتی که موارد بهویژه پیچیده میشدند، به ماکروهای VBA اکسل مراجعه میکردم. این فرآیند برایم خوب کار میکرد تا اینکه تابع REDUCE را کشف کردم.
برای سالها، من مشکلات پیچیدهٔ صفحاتگسترده را به همان روش حل میکردم: افزودن ستونهای کمکی، تودستکردن فرمولهای تو در تو، و وقتی اوضاع بهخصوص پیچیده شد، به ماکروهای VBA اکسل مراجعه میکردم. این فرآیند برای من خوب کار میکرد تا اینکه تابع REDUCE را کشف کردم.
REDUCE به شما امکان میدهد تا روی دادههای خود بهصورت گامبهگام تکرار کنید و نتیجهٔ خود را بهصورت گام به گام بسازید، درست همانند یک حلقه در زبان برنامهنویسی. بهجای پخش محاسبات میانی در تمام صفحه، کل فرآیند در یک فرمول واحد انجام میشود که یک خروجی واحد تولید میکند.
اگر تا به حال آرزو داشتهاید که چندین گام متوالی را بدون پر کردن کتابکار خود با ستونها و سلولهای میانی انجام دهید، REDUCE دقیقاً همان چیزی است که دنبالش هستید.
این تابع فقط در Excel برای وب، Excel برای Microsoft 365 و Excel برای Microsoft 365 برای Mac موجود است.
در واقع REDUCE چه کاری انجام میدهد (و چرا مهم است)
دادههای شما را گامبهگام داخل یک فرمول پردازش میکند و یک نتیجهٔ نهایی برمیگرداند

REDUCE یک فرمول تخصصی است که فهرستی از دادهها را میگیرد و یک محاسبهٔ سفارشی را روی هر مورد بهصورت یک‑بهیک اعمال میکند و نتایج را در حین پردازش ترکیب میسازد. در نهایت یک پاسخ نهایی واحد برمیگرداند. این همان ایدهٔ اصلی است.
بهطور خاص، REDUCE همان چیزی است که اکسل آن را «تابع کمکی LAMBDA» مینامد. یعنی کاملاً به محاسبهای که با استفاده از تابع LAMBDA تعریف میکنید، وابسته است. میتوانید LAMBDA را منطق و REDUCE را مکانیزمی که آن منطق را اجرا میکند درنظر بگیرید. با هم گامهای تکراری را انجام میدهند که هر محاسبه بر پایهٔ محاسبهٔ قبلی ساخته میشود. بهجای نمایش هر مرحلهٔ میانی در کاربرگ (همانند ستونهای کمکی)، REDUCE این مراحل را بهصورت داخلی با استفاده از «مجموعگر» (accumulator) نگهداری میکند.
نحوۀ پایهای بهاین شکل است:
=REDUCE([initial_value], array, lambda(accumulator, value, body))
اینها وظیفهٔ هر بخش هستند:
|
آرگومان |
هدف |
یادداشتهای اضافی |
|---|---|---|
|
مقدار شروع برای مجموعگر. |
برای جمع 0 را بهعنوان مقدار آغاز میگیرید؛ برای ساختن متن، رشتهٔ خالی (“”). این مقدار میتواند یک ارجاع به سلول نیز باشد اگر هدف تغییر مقدار موجود باشد. |
|
دادههای منبعی که REDUCE روی آنها میچرخد. |
هر مورد در این آرایه بهصورت یکبهیک در ترتیبی که ظاهر میشود پردازش میشود. |
|
محاسبهٔ سفارشی که روی هر مورد در آرایه اعمال میشود. |
همیشه از سه متغیر استفاده میکند: مجموعگر (اغلب بهصورت A)، مقدار جاری از آرایه (اغلب بهصورت V) و بدنهٔ محاسبه (مثلاً A + V). مجموعگر نتیجهٔ جاری از تکرارهای قبلی را ذخیره میکند، در حالی که مقدار، آیتم جاری را نشان میدهد. |
[initial_value]
array
lambda
جریان کار بهسادگی این است: مجموعگر با مقدار اولیه آغاز میشود. REDUCE اولین عنصر آرایه را میگیرد، محاسبهٔ LAMBDA را اعمال میکند و مجموعگر را با نتیجه بهروز میکند. سپس به عنصر بعدی میرود و این فرایند را تا آخرین عنصر تکرار میکند. پس از پردازش تمام موارد، REDUCE مجموعگر نهایی را برمیگرداند. این خروجی میتواند یک عدد، یک متن یا حتی یک آرایهٔ پراکنده باشد، بسته به آنچه LAMBDA تولید میکند.
زیبایی این تنظیم این است که دیگر نیازی به توزیع چندین فرمول در سرتاسر صفحه ندارید. همه چیز داخل یک فرمول، در یک سلول، بدون شلوغی ستونهای کمکی یا مراحل میانی انجام میشود.
روشهای عملی که من REDUCE را در جریان کار خود استفاده میکنم
کارهایی که قبلاً به ستونهای کمکی یا VBA نیاز داشتند اکنون در یک فرمول زندگی میکنند

REDUCE در موقعیتهایی که نتیجه بهصورت تدریجی ساخته میشود، بهویژه وقتی هر گام به گام قبلی متکی است، عالی است. اما به همان اندازه برای عملیاتهای معمولی لیست نیز ارزشمند است. من بهطور مداوم از آن استفاده میکنم و وقتی بفهمید چگونه رفتار میکند، شروع به مشاهدهٔ فرصتهای استفاده در جاهایی خواهید کرد که قبلاً به ستونهای کمکی یا فرمولهای تکراری متکی بودید.
مثال ۱: شمارش چند مورد مستقل در یک پاس

یکی از استفادههای موردعلاقهٔ من، شمارش همزمان وقوع چندین مورد در یک فهرست است. فرض کنید ستونی از مکانهای سفارش دارم و میخواهم مجموع سفارشها از پاریس و لندن را بدست آورم. بهجای نوشتن فرمولهای جداگانهٔ COUNTIF و جمعکردن آنها، میتوانم همه کارها را در یک عبارت انجام دهم:
=REDUCE(0, {"Paris","London"}, LAMBDA(total, city, total + COUNTIF(A2:A9, city)))
من با صفر آغاز میکنم چون یک جمع را انباشته میکنم. بهجای حلقهزدن روی هر ردیف داده، بر روی دو شهر موردنظر (پاریس و لندن) حلقه میزنم. برای هر شهر، COUNTIF تعداد دفعات ظاهر شدن آن را در ستون A میشمارد و نتیجه به مجموع جاری اضافه میشود. خروجی نهایی یک عدد است که مجموع سفارشهای هر دو شهر را نشان میدهد. اگر بخواهم دامنهٔ جغرافیایی را تغییر دهم، فقط کافی است لیست داخل آکولادها را اصلاح کنم؛ نیازی به بازنویسی فرمول نیست.
مثال ۲: جمعکردن مقادیر تعبیهشده در رشتههای متنی ترکیبی

REDUCE همچنین در زمانی مفید است که دادهها تمیز نباشند. تصور کنید ستون سفارشاتی داشته باشید که بهصورت «SHIRT(5)»، «PANT(2)»، «HAT(3)» ذخیره شدهاند؛ نام کالا و تعداد در یک سلول ترکیب شدهاند. اگر بخواهم تعدادهای مربوط به SHIRT و PANT را بدون در نظر گرفتن عدد سفارش محاسبه کنم، REDUCE بهصورت تمیز این کار را انجام میدهد:
=REDUCE(0, {"SHIRT", "PANT"}, LAMBDA(total, category, total + COUNTIF(A2:A7, category & "(*")))
جزئیات کلیدی استفاده از «(*)» بهعنوان کاراکتر جایگزین است. چون عدد داخل پرانتز در هر ردیف متفاوت است، این کاراکتر جایگزین مطمئن میشود که هر متنی که با «SHIRT(» یا «PANT(» شروع میشود، شمرده شود. REDUCE برای هر دسته، همهٔ ورودیهای منطبق را میشمارد و جمع میکند. نتیجه یک مقدار واحد است که کل تعداد این دو نوع را نشان میدهد، صرفنظر از مقادیر جداگانه آنها.
مثال ۳: تقسیم ردیفها و افقیچین کردن نتایج بدون کمککنندهها

یک زمینهٔ دیگر که REDUCE در آن برجسته میشود، تبدیل قالب دادههاست. فرض کنید ستونی از آدرسهای کامل مانند «10 Main St, New York, NY, 10001» داشته باشید و بخواهید هر یک را به ستونهای جداگانهٔ خیابان، شهر، ایالت و کد پستی تقسیم کنید. میتوانید به ستونهای کمکی متکی شوید یا تمام خروجی را در یک گام بسازید:
=DROP(REDUCE("", A2:A4, LAMBDA(a, v, VSTACK(a, TEXTSPLIT(v, ", ")))), 1)
این فرمول با یک رشتهٔ خالی بهعنوان مجموعگر آغاز میشود. در هر حلقه، TEXTSPLIT آدرس جاری را با استفاده از جداکنندهٔ «، » تقسیم میکند و VSTACK نتایج را بهصورت عمودی زیر نتیجهٔ قبلی میچسباند. اولین تکرار ردیف خالی ایجاد میکند (بهدلیل مقدار اولیه خالی)، بنابراین DROP آن ردیف خالی بر‑بالا را حذف میکند و جدول تمیز و همراستایی از آدرسهای تقسیمشده باقی میماند.
تمام این کارها بدون استفاده از یک ستون کمکی انجام میشود. هر گام تبدیل در یک فرمول محصور شده است و خروجی میتواند بهصورت پویا با افزودن آدرسهای جدید گسترش یابد.
شما شروع به بازنگری میکنید که واقعاً چه زمانی به ستونهای اضافی نیاز دارید
REDUCE شبیه به یک نوار نقاله است. ورودیهای خام (آرایه) را دریافت میکند، تبدیل سفارشی را برای هر آیتم اعمال میکند و بهطور مداوم هر نتیجهٔ پردازش شده را به یک خروجی در حال رشد (مجموعگر) میچسباند. تا وقتی که کل آرایه پردازش میشود، محصول نهایی یک محصول واحد میشود. بهجای ساختن هر مرحلهٔ میانی در سرتاسر کاربرگ، تمام پیشرفت درون فرمول خود انجام میشود، در یک توالی پیوستهٔ واحد.
قبل از اینکه از REDUCE استفاده کنم، هر بار که یک صفحهگسترده پیچیده میشد، ستونهای کمکی اضافه میکردم. احساس میکردم این تنها راه عملی برای تقسیم مسأله است. حالا، وقتی با یک مسأله مواجه میشوم، میپرسیم «آیا REDUCE میتواند این را در یک فرمول انجام دهد؟» در نه از ده بار، پاسخ بله است.