معرفی تابع REDUCE
تابع REDUCE یکی از توابع جدید و بسیار قدرتمند اکسل است که برای انجام محاسبات مرحلهبهمرحله روی یک آرایه یا محدوده استفاده میشود. این تابع مقدارهای داخل یک محدوده را یکییکی بررسی میکند، نتیجه هر مرحله را نگه میدارد و در نهایت یک خروجی نهایی برمیگرداند.
اگر بخواهیم ساده بگوییم، REDUCE شبیه این است که شما از اولین مقدار شروع کنید، روی هر سلول یک عملیات انجام دهید، نتیجه را ذخیره کنید و به سراغ سلول بعدی بروید.
تابع REDUCE معمولاً همراه با تابع LAMBDA استفاده میشود. در LAMBDA مشخص میکنیم که در هر مرحله چه کاری انجام شود.
مثال ساده: فرض کنید در سلولهای A2 تا A6 چند عدد دارید و میخواهید مجموع آنها را با REDUCE محاسبه کنید.
=REDUCE(0, A2:A6, LAMBDA(total, x, total+x))
در این فرمول، عدد 0 مقدار شروع است، محدوده A2:A6 آرایهای است که بررسی میشود، total نتیجه انباشتهشده تا این لحظه است و x مقدار فعلی هر سلول است. در پایان، مجموع کل اعداد برگردانده میشود.
کاربردهای اصلی تابع REDUCE
- محاسبه مجموع، حاصلضرب یا سایر عملیات تجمعی روی یک محدوده
- انجام محاسبات شرطی پیچیده روی دادهها
- ترکیب چند مقدار متنی در یک خروجی واحد
- بررسی همه مقادیر یک لیست با منطق AND یا OR
- محاسبه تعداد موارد خاص با شرطهای سفارشی
- استفاده در فرمولهای پیشرفته همراه با LAMBDA، FILTER، XLOOKUP، COUNTIF و توابع آرایهای
- جایگزینی فرمولهای طولانی و تکراری با یک فرمول خلاصهتر و قابل توسعهتر
- ساخت منطقهای مرحلهای بدون نیاز به VBA یا ستون کمکی
ساختار (Syntax)
ساختار انگلیسی تابع REDUCE به شکل زیر است:
=REDUCE([initial_value], array, LAMBDA(accumulator, value, body))
ساختار مفهومی با نام آرگومانهای فارسی به شکل زیر است:
=REDUCE([مقدار_اولیه]; آرایه; LAMBDA(انباشته; مقدار; محاسبه))
نکته مهم: در نسخه انگلیسی اکسل، جداکننده آرگومانها معمولاً کاما است. در برخی تنظیمات منطقهای، از نقطهویرگول استفاده میشود.
آرگومانها
initial_value / مقدار اولیه
این آرگومان اختیاری است و مشخص میکند محاسبه از چه مقداری شروع شود. برای جمع معمولاً از 0 استفاده میشود، برای ضرب از 1، برای بررسی منطقی AND از TRUE و برای OR از FALSE استفاده میشود.
مثلاً برای جمع اعداد:
=REDUCE(0, A2:A10, LAMBDA(total, x, total+x))
array / آرایه یا محدوده
این آرگومان محدوده یا آرایهای است که REDUCE باید روی تکتک اعضای آن حرکت کند. این آرایه میتواند یک ستون، یک ردیف، یک محدوده چندستونه یا خروجی یک تابع دیگر مثل FILTER باشد.
مثلاً برای بررسی مقادیر موجود در محدوده B2:B20:
=REDUCE(0, B2:B20, LAMBDA(total, x, total+x))
LAMBDA / تابع سفارشی مرحلهای
آرگومان سوم باید یک تابع LAMBDA باشد. در REDUCE، تابع LAMBDA معمولاً دو ورودی اصلی دارد: یکی مقدار انباشتهشده و دیگری مقدار فعلی از آرایه.
ساختار ساده LAMBDA در REDUCE به این شکل است:
=REDUCE(0, A2:A6, LAMBDA(accumulator, value, accumulator+value))
در اینجا accumulator همان نتیجه موقت تا این مرحله است و value مقدار فعلی از محدوده است.
accumulator / مقدار انباشتهشده
این نام را خودتان انتخاب میکنید. accumulator مقداری است که نتیجه مراحل قبلی را نگه میدارد. مثلاً در جمع، accumulator مجموع اعداد قبلی است.
value / مقدار فعلی
این هم نامی است که شما انتخاب میکنید. value مقدار فعلی از آرایه است که REDUCE در آن مرحله در حال بررسی آن است.
body / عملیات اصلی
بخش body مشخص میکند در هر مرحله چه محاسبهای انجام شود. این بخش میتواند یک جمع ساده، شرط IF، تابع COUNTIF، تابع XLOOKUP یا هر منطق دیگری باشد.
مثالهای ساده و پایه
مثال ۱: محاسبه مجموع اعداد
فرض کنید اعداد فروش روزانه در محدوده A2:A7 قرار دارند. برای محاسبه مجموع فروش با REDUCE از فرمول زیر استفاده میکنیم:
=REDUCE(0, A2:A7, LAMBDA(total, sale, total+sale))
نتیجه این فرمول، مجموع تمام مقادیر محدوده A2:A7 است. در اینجا total از 0 شروع میشود و در هر مرحله مقدار فروش فعلی به آن اضافه میشود.
مثال ۲: محاسبه حاصلضرب اعداد
اگر در محدوده B2:B5 چند عدد دارید و میخواهید حاصلضرب آنها را محاسبه کنید، مقدار اولیه باید 1 باشد.
=REDUCE(1, B2:B5, LAMBDA(result, x, result*x))
اگر مقدار اولیه را 0 قرار دهید، نتیجه همیشه 0 میشود. بنابراین برای ضرب، مقدار شروع باید 1 باشد.
مثال ۳: جمع فقط اعداد مثبت
فرض کنید در محدوده A2:A10 هم عدد مثبت و هم عدد منفی دارید و فقط میخواهید اعداد مثبت را جمع کنید.
=REDUCE(0, A2:A10, LAMBDA(total, x, IF(x>0, total+x, total)))
در این فرمول، اگر مقدار فعلی بزرگتر از صفر باشد، به مجموع اضافه میشود؛ در غیر این صورت، total بدون تغییر باقی میماند.
مثال ۴: اتصال متنها به یکدیگر
فرض کنید نام چند محصول در محدوده C2:C6 قرار دارد و میخواهید آنها را در یک سلول با جداکننده ویرگول نمایش دهید.
=REDUCE("", C2:C6, LAMBDA(text, item, IF(text="", item, text&", "&item)))
این فرمول متنها را یکییکی به هم متصل میکند. اگر متن اولیه خالی باشد، اولین مقدار مستقیماً قرار میگیرد؛ در مراحل بعدی، ویرگول و فاصله اضافه میشود.
مثالهای کاربردی و واقعی
مثال ۱: جمع مبالغ مربوط به چند کد کالا با XLOOKUP
فرض کنید در ستون A کد کالاها، در ستون C مبلغ فروش هر کالا و در محدوده F2:F5 لیست کدهایی را دارید که میخواهید مبلغ آنها را جمع کنید. میتوانید از REDUCE همراه با XLOOKUP استفاده کنید.
=REDUCE(0, F2:F5, LAMBDA(total, code, total+XLOOKUP(code, A2:A20, C2:C20, 0)))
در هر مرحله، یک کد از محدوده F2:F5 برداشته میشود، مبلغ آن با XLOOKUP پیدا میشود و به total اضافه میشود.
مثال ۲: شمارش تعداد آیتمها با چند معیار با COUNTIF
فرض کنید در ستون A نام دستهبندی محصولات ثبت شده و در محدوده F2:F4 چند دستهبندی مهم نوشتهاید. میخواهید تعداد کل ردیفهایی را بشمارید که متعلق به این دستهبندیها هستند.
=REDUCE(0, F2:F4, LAMBDA(total, category, total+COUNTIF(A2:A100, category)))
این فرمول برای هر دستهبندی، COUNTIF را اجرا میکند و نتیجهها را با هم جمع میکند.
مثال ۳: بررسی اینکه همه نمرهها بالاتر از حد مجاز هستند یا نه
فرض کنید نمرهها در محدوده B2:B10 قرار دارند و میخواهید بررسی کنید آیا همه نمرهها حداقل 10 هستند یا نه.
=REDUCE(TRUE, B2:B10, LAMBDA(ok, score, AND(ok, score>=10)))
اگر همه نمرهها 10 یا بیشتر باشند، نتیجه TRUE میشود. اگر حتی یک نمره کمتر از 10 باشد، نتیجه FALSE خواهد شد.
مثال ۴: بررسی وجود حداقل یک سفارش فوری
فرض کنید وضعیت سفارشها در محدوده C2:C20 ثبت شده و میخواهید بدانید آیا حداقل یک سفارش با وضعیت فوری وجود دارد یا نه.
=REDUCE(FALSE, C2:C20, LAMBDA(found, status, OR(found, status="فوری")))
مقدار اولیه FALSE است. اگر در هر مرحله مقدار فعلی برابر فوری باشد، نتیجه نهایی TRUE میشود.
مثال ۵: جمع فروش فقط برای مقادیر بزرگتر از ۵۰۰ هزار
فرض کنید فروشها در محدوده D2:D30 قرار دارند و فقط میخواهید فروشهای بیشتر از 500000 را جمع کنید.
=REDUCE(0, D2:D30, LAMBDA(total, amount, IF(amount>500000, total+amount, total)))
این فرمول برای گزارشهای فروش، کمیسیون، تحلیل مشتریان خاص و فیلتر کردن مبالغ مهم بسیار کاربردی است.
ترکیب تابع REDUCE با فرمولهای دیگر
قدرت اصلی REDUCE زمانی مشخص میشود که آن را با توابع دیگر ترکیب کنیم. در ادامه چند ترکیب رایج و کاربردی را میبینید.
- ترکیب REDUCE با IF برای محاسبات شرطی
- ترکیب REDUCE با COUNTIF برای شمارش چند معیار مختلف
- ترکیب REDUCE با XLOOKUP برای جستجو و جمع نتایج
- ترکیب REDUCE با AND برای بررسی برقرار بودن همه شرطها
- ترکیب REDUCE با OR برای بررسی وجود حداقل یک شرط درست
- ترکیب REDUCE با FILTER برای محاسبه روی دادههای فیلترشده
- ترکیب REDUCE با VSTACK برای ساخت خروجیهای تجمعی و لیستی
REDUCE با IF
در این مثال فقط عددهای زوج جمع میشوند.
=REDUCE(0, A2:A20, LAMBDA(total, x, IF(MOD(x, 2)=0, total+x, total)))
REDUCE با COUNTIF
در این مثال تعداد کل مقادیر مربوط به چند شهر محاسبه میشود.
=REDUCE(0, F2:F5, LAMBDA(total, city, total+COUNTIF(B2:B100, city)))
REDUCE با XLOOKUP
در این مثال قیمت چند محصول بر اساس کد محصول پیدا و جمع میشود.
=REDUCE(0, H2:H6, LAMBDA(total, productCode, total+XLOOKUP(productCode, A2:A50, D2:D50, 0)))
REDUCE با AND
در این مثال بررسی میکنیم آیا همه مقدارهای موجود در محدوده A2:A10 مثبت هستند یا نه.
=REDUCE(TRUE, A2:A10, LAMBDA(result, x, AND(result, x>0)))
REDUCE با OR
در این مثال بررسی میکنیم آیا حداقل یک مقدار منفی در محدوده وجود دارد یا نه.
=REDUCE(FALSE, A2:A10, LAMBDA(result, x, OR(result, x<0)))
REDUCE با FILTER
در این مثال ابتدا فقط فروشهای مربوط به شهر تهران فیلتر میشوند و سپس مجموع آنها محاسبه میشود.
=REDUCE(0, FILTER(C2:C100, B2:B100="تهران"), LAMBDA(total, sale, total+sale))
خطاهای رایج و روش رفع آنها
۱. خطای #VALUE! به دلیل تعریف نادرست LAMBDA
اگر در تابع LAMBDA تعداد پارامترها درست نباشد، REDUCE نمیتواند محاسبه را انجام دهد. در REDUCE، تابع LAMBDA معمولاً باید دو ورودی داشته باشد: مقدار انباشتهشده و مقدار فعلی.
فرمول اشتباه:
=REDUCE(0, A2:A10, LAMBDA(x, x+1))
روش رفع: دو پارامتر برای LAMBDA تعریف کنید.
=REDUCE(0, A2:A10, LAMBDA(total, x, total+x))
۲. خطا به دلیل انتخاب مقدار اولیه نامناسب
مقدار اولیه باید با نوع محاسبه هماهنگ باشد. برای جمع از 0، برای ضرب از 1، برای متن معمولاً از “”، برای AND از TRUE و برای OR از FALSE استفاده کنید.
مثلاً برای ضرب، این فرمول منطقی نیست چون نتیجه را صفر میکند:
=REDUCE(0, A2:A5, LAMBDA(result, x, result*x))
روش صحیح:
=REDUCE(1, A2:A5, LAMBDA(result, x, result*x))
۳. خطای #NAME? به دلیل پشتیبانی نشدن تابع
اگر اکسل شما تابع REDUCE را نشناسد، احتمالاً از نسخهای استفاده میکنید که از این تابع پشتیبانی نمیکند.
روش رفع: از Microsoft 365، Excel for web یا نسخههای جدید پشتیبانیشده استفاده کنید. همچنین مطمئن شوید نام تابع را درست نوشتهاید.
۴. خطا به دلیل استفاده از جداکننده آرگومان اشتباه
در برخی سیستمها باید به جای کاما از نقطهویرگول استفاده شود. اگر فرمول شما خطا میدهد، تنظیمات منطقهای اکسل را بررسی کنید.
نسخه با کاما:
=REDUCE(0, A2:A10, LAMBDA(total, x, total+x))
نسخه با نقطهویرگول:
=REDUCE(0; A2:A10; LAMBDA(total; x; total+x))
۵. خطا به دلیل وجود متن در محاسبات عددی
اگر محدوده شما شامل متن باشد و بخواهید آن را مستقیم با عدد جمع کنید، ممکن است خطا یا نتیجه غیرمنتظره بگیرید.
روش رفع: قبل از جمع، نوع داده را کنترل کنید.
=REDUCE(0, A2:A10, LAMBDA(total, x, IF(ISNUMBER(x), total+x, total)))
۶. پیچیده شدن بیش از حد فرمول
گاهی فرمول REDUCE آنقدر طولانی میشود که خواندن و عیبیابی آن سخت است.
روش رفع: از نامهای واضح در LAMBDA استفاده کنید و اگر فرمول خیلی پیچیده شد، آن را با LET ترکیب کنید.
=LET(data, A2:A10, REDUCE(0, data, LAMBDA(total, x, total+x)))
نکات حرفهای و ترفندهای مهم
- برای جمع، مقدار اولیه را 0 قرار دهید.
- برای ضرب، مقدار اولیه را 1 قرار دهید.
- برای اتصال متنها، مقدار اولیه را “” قرار دهید.
- برای بررسی همه شرطها با AND، مقدار اولیه را TRUE قرار دهید.
- برای بررسی وجود حداقل یک شرط با OR، مقدار اولیه را FALSE قرار دهید.
- نام پارامترهای LAMBDA را واضح انتخاب کنید؛ مثلاً total، amount، item، result و status.
- اگر فرمول طولانی شد، از LET برای تعریف بخشهای مختلف فرمول استفاده کنید.
- برای جلوگیری از خطا در دادههای ترکیبی، از ISNUMBER، ISTEXT یا IFERROR کمک بگیرید.
- REDUCE برای محاسبات مرحلهای عالی است، اما برای جمع ساده همیشه SUM خواناتر و سریعتر است.
- اگر نیاز دارید خروجی هر مرحله را ببینید، به جای REDUCE از SCAN استفاده کنید.
- در فایلهایی که برای دیگران ارسال میکنید، حتماً نسخه اکسل گیرنده را در نظر بگیرید.
تفاوت تابع REDUCE با توابع مشابه
تفاوت REDUCE با SUM
تابع SUM برای جمع ساده بسیار مناسب و خواناست، اما REDUCE زمانی کاربرد دارد که بخواهید عملیات سفارشی و مرحلهای انجام دهید.
جمع ساده با SUM:
=SUM(A2:A10)
جمع سفارشی با REDUCE:
=REDUCE(0, A2:A10, LAMBDA(total, x, IF(x>0, total+x, total)))
تفاوت REDUCE با SCAN
تابع REDUCE فقط نتیجه نهایی را برمیگرداند، اما SCAN نتیجه هر مرحله را نمایش میدهد. اگر میخواهید روند تجمعی را ببینید، SCAN بهتر است. اگر فقط خروجی نهایی را میخواهید، REDUCE مناسبتر است.
مثال با SCAN برای نمایش مجموع تجمعی:
=SCAN(0, A2:A6, LAMBDA(total, x, total+x))
تفاوت REDUCE با MAP
تابع MAP روی هر عضو آرایه یک عملیات انجام میدهد و برای هر عضو یک خروجی جداگانه برمیگرداند. اما REDUCE همه مقادیر را به یک نتیجه نهایی تبدیل میکند.
مثال با MAP برای دو برابر کردن هر عدد:
=MAP(A2:A6, LAMBDA(x, x*2))
تفاوت REDUCE با BYROW و BYCOL
توابع BYROW و BYCOL محاسبات را روی هر ردیف یا هر ستون انجام میدهند، اما REDUCE روی اعضای یک آرایه حرکت میکند و یک نتیجه نهایی تجمعی میسازد.
مثال با BYROW برای جمع هر ردیف:
=BYROW(A2:C6, LAMBDA(row, SUM(row)))
سازگاری با نسخههای مختلف اکسل
تابع REDUCE از توابع جدید اکسل است و در نسخههای قدیمی اکسل وجود ندارد. این تابع معمولاً در نسخههای زیر پشتیبانی میشود:
- Microsoft 365
- Excel for web
- Excel 2024 و نسخههای جدیدتر پشتیبانیشده
- نسخههای جدید Excel برای Mac که از توابع LAMBDA Helper پشتیبانی میکنند
در نسخههایی مثل Excel 2016، Excel 2019 و بسیاری از نصبهای دائمی قدیمیتر، تابع REDUCE در دسترس نیست. اگر فایل شامل REDUCE را در این نسخهها باز کنید، ممکن است خطای #NAME? مشاهده کنید.
اگر با چند کاربر کار میکنید، قبل از استفاده گسترده از REDUCE مطمئن شوید همه افراد نسخه سازگار اکسل را دارند.
سؤالات پرتکرار درباره تابع REDUCE
تابع REDUCE چه کاری انجام میدهد؟
REDUCE روی مقادیر یک آرایه حرکت میکند، در هر مرحله یک محاسبه انجام میدهد و در پایان یک نتیجه نهایی برمیگرداند.
آیا REDUCE جایگزین SUM است؟
برای جمع ساده، SUM بهتر و خواناتر است. اما برای جمعها و محاسبات شرطی یا سفارشی، REDUCE انعطاف بیشتری دارد.
چرا REDUCE همیشه با LAMBDA استفاده میشود؟
چون REDUCE باید بداند در هر مرحله چه عملیاتی انجام دهد. این منطق مرحلهای با LAMBDA تعریف میشود.
مقدار اولیه در REDUCE چه اهمیتی دارد؟
مقدار اولیه نقطه شروع محاسبه است. اگر اشتباه انتخاب شود، نتیجه نهایی هم اشتباه میشود؛ مثلاً برای ضرب نباید از 0 استفاده کرد.
آیا REDUCE میتواند متنها را هم ترکیب کند؟
بله. با مقدار اولیه “” و استفاده از عملگر & میتوانید چند متن را به یک خروجی واحد تبدیل کنید.
فرق REDUCE و SCAN چیست؟
REDUCE فقط نتیجه نهایی را نشان میدهد، اما SCAN نتیجه همه مراحل میانی را هم برمیگرداند.
چرا در اکسل من تابع REDUCE کار نمیکند؟
احتمالاً نسخه اکسل شما از این تابع پشتیبانی نمیکند یا جداکننده آرگومانها را اشتباه وارد کردهاید.
جمعبندی و پیشنهاد یادگیری بعدی
تابع REDUCE یکی از توابع پیشرفته و کاربردی اکسل برای انجام محاسبات مرحلهای روی آرایههاست. با این تابع میتوانید مجموعهای شرطی، بررسیهای منطقی، اتصال متنها، شمارش چندمعیاره و فرمولهای بسیار منعطف بسازید.
اگرچه برای کارهای سادهای مثل جمع معمولی بهتر است از SUM استفاده کنید، اما زمانی که منطق محاسبه شما پیچیدهتر میشود، REDUCE میتواند فرمولهای شما را حرفهایتر، کوتاهتر و قابل توسعهتر کند.
برای یادگیری بهتر REDUCE، پیشنهاد میشود در مرحله بعد توابع LAMBDA، LET، MAP، SCAN، FILTER و XLOOKUP را یاد بگیرید. این توابع در کنار REDUCE مجموعهای بسیار قدرتمند برای ساخت فرمولهای مدرن و حرفهای در اکسل ایجاد میکنند.
