MAP ส่งค่าทีละ element จาก Array หนึ่งหรือหลายตัวเข้าไปประมวลผลใน LAMBDA แล้วคืน Array ผลลัพธ์ที่มีขนาดเท่ากับ input array ต้นฉบับ เหมาะสำหรับ element-wise operations เช่น การแปลงค่าทุกตัว การตรวจสอบเงื่อนไขทีละเซลล์ หรือการคำนวณจากหลาย Array พร้อมกัน ต่างจาก BYROW/BYCOL ที่ส่งทั้งแถวหรือทั้งคอลัมน์ MAP จะส่งเฉพาะค่าเดี่ยวๆ ทีละตำแหน่ง
=MAP(array1, [array2, ...], lambda)
=MAP(array1, [array2, ...], lambda)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| array1 | Array | Yes | Array ตัวแรกที่ต้องการนำไปประมวลผล สามารถเป็น range, array constant, หรือผลลัพธ์จากฟังก์ชันอื่น | |
| array2 | Array | Optional | Array ตัวที่สอง (optional) ต้องมีขนาด (rows × columns) เท่ากับ array1 พอดี สามารถใส่ได้หลาย Array (array3, array4, …) โดยทุกตัวต้องมีขนาดเท่ากัน | |
| lambda | Function | Yes | LAMBDA function ที่รับ parameter เท่ากับจำนวน Array ที่ใส่เข้ามา ถ้าใส่ 2 Array, LAMBDA ต้องมี 2 parameters เช่น LAMBDA(a, b, …) ฟังก์ชันนี้จะถูกเรียกทีละครั้งสำหรับแต่ละตำแหน่งใน Array |
แปลงค่าทุกตัวใน Array ตามกฎเฉพาะ เช่น คูณทุกค่าด้วย 2, ยกกำลังสอง, หรือแปลงหน่วย (กิโลกรัม → ปอนด์) โดยไม่ต้องใช้ helper column
ตรวจสอบเงื่อนไขทีละเซลล์และ return ค่าตามเงื่อนไข เช่น ถ้าค่ามากกว่า 50 ให้ใส่ "Pass" ไม่เช่นนั้นให้ "Fail" หรือแทนที่ค่าที่ไม่ใช่ตัวเลขด้วย 0
คำนวณจาก 2-3 Array พร้อมกัน เช่น คำนวณ price × quantity จากสอง Array, หา MAX จากหลาย Array ตำแหน่งเดียวกัน, หรือตรวจเงื่อนไข AND/OR จากหลายคอลัมน์
ใช้ MAP ร่วมกับฟังก์ชัน text เพื่อแปลงข้อความทั้ง Array เช่น ดึง domain จาก email, แยกชื่อ-นามสกุล, format ตัวเลขแบบกำหนดเอง, หรือ clean data
ตรวจสอบความถูกต้องของข้อมูลทั้ง Array เช่น กรอง blank cells, ลบ non-numeric values, แทนที่ errors ด้วยค่า default, หรือ normalize ข้อมูล
MAP({1; 2; 3; 4; 5}, LAMBDA(v, v * 2))=MAP({1; 2; 3; 4; 5}, LAMBDA(v, v * 2))
{2; 4; 6; 8; 10}
MAP(StudentScores, LAMBDA(score, IF(score >= 50, "ผ่าน", "ไม่ผ่าน")))=MAP(StudentScores, LAMBDA(score, IF(score >= 50, "ผ่าน", "ไม่ผ่าน")))
{"ผ่าน"; "ไม่ผ่าน"; "ผ่าน"; "ผ่าน"}
MAP(Prices, Quantities, LAMBDA(price, qty, price * qty))=MAP(Prices, Quantities, LAMBDA(price, qty, price * qty))
{200; 500; 90}
MAP(EmailList, LAMBDA(email, MID(email, FIND("@", email) + 1, LEN(email))))=MAP(EmailList, LAMBDA(email, MID(email, FIND("@", email) + 1, LEN(email))))
{"gmail.com"; "outlook.com"; "company.co.th"}
MAP(Q1Sales, Q2Sales, Q3Sales, LAMBDA(q1, q2, q3, MAX(q1, q2, q3)))=MAP(Q1Sales, Q2Sales, Q3Sales, LAMBDA(q1, q2, q3, MAX(q1, q2, q3)))
{80; 150; 70}
MAP(RawData, LAMBDA(value, IF(ISNUMBER(value), value, "")))=MAP(RawData, LAMBDA(value, IF(ISNUMBER(value), value, "")))
{100; ""; 250; ""; 75}
MAP(Prices, CustomerTypes, LAMBDA(p, type, IF(type="VIP", p * 0.8, IF(type="Member", p * 0.9, p))))=MAP(Prices, CustomerTypes, LAMBDA(p, type,
IF(type="VIP", p * 0.8,
IF(type="Member", p * 0.9, p))))
{800; 450; 600}
FILTER(ProductTable, MAP(ProductTable[Size], ProductTable[Color], LAMBDA(s, c, AND(s="Large", c="Red"))))=FILTER(ProductTable, MAP(ProductTable[Size], ProductTable[Color], LAMBDA(s, c, AND(s="Large", c="Red"))))
Array of products where Size=Large AND Color=Red
นี่เป็นคำถามที่เจอบ่อยมากครับ แต่ละตัวส่งข้อมูลเข้า LAMBDA คนละแบบ:
.
**MAP** → ส่งค่าทีละ element (ค่าเดี่ยว) และ return Array ขนาดเท่าเดิม
**BYROW** → ส่งทั้งแถว (array ย่อย) และ return column เดียว (1 ค่าต่อ 1 แถว)
**BYCOL** → ส่งทั้งคอลัมน์ (array ย่อย) และ return row เดียว (1 ค่าต่อ 1 คอลัมน์)
.
ตัวอย่าง: MAP({1,2,3}, LAMBDA(v, v*2)) → {2,4,6} (3 ค่า)
BYROW({1,2,3}, LAMBDA(row, SUM(row))) → {6} (1 ค่า)
ใช่ครับ ต้องเท่ากันพอดี 💯
.
ทุก Array ที่ใส่เข้า MAP ต้องมีขนาด (rows × columns) เท่ากันเป๊ะ ถ้าใส่ array1 เป็น 5×3 แล้ว array2 ต้องเป็น 5×3 เหมือนกัน
.
ถ้าขนาดไม่ตรงกัน Excel จะแสดง #VALUE! error พร้อมข้อความ “Incorrect Parameters” ทันที
.
ส่วนตัวผมแนะนำให้ตรวจสอบขนาดด้วย ROWS() และ COLUMNS() ก่อนใช้ MAP กับหลาย Array นะครับ จะได้ไม่ต้องมานั่งแก้ error ทีหลัง 😅
จำนวน parameter ของ LAMBDA ต้องเท่ากับจำนวน Array ที่ใส่เข้า MAP พอดี:
.
• ใส่ 1 Array → LAMBDA(v, …) ต้องมี 1 parameter
• ใส่ 2 Array → LAMBDA(a, b, …) ต้องมี 2 parameters
• ใส่ 3 Array → LAMBDA(a, b, c, …) ต้องมี 3 parameters
.
ถ้าจำนวนไม่ตรง จะได้ #VALUE! error ทันทีครับ นี่เป็นข้อผิดพลาดที่เจอบ่อยตอนเริ่มใช้ MAP 😅
ต่างกันเยอะเลยครับ จำง่ายๆ:
.
**MAP** → return Array ขนาดเท่าเดิม (element-wise transformation)
เหมาะสำหรับ: แปลงค่าทุกตัว
ตัวอย่าง: {1,2,3} → {2,4,6} (ได้ 3 ค่า)
.
**REDUCE** → return ค่าเดียว (aggregation)
เหมาะสำหรับ: รวมหรือสะสมค่า
ตัวอย่าง: {1,2,3} → 6 (ได้ 1 ค่า)
.
เลือกใช้: MAP เมื่อต้องการผลลัพธ์เป็น array, REDUCE เมื่อต้องการผลลัพธ์เป็นค่าเดียว
ได้แน่นอนครับ 💯
.
MAP ทำงานกับ 2D Array ได้เต็มรูปแบบ โดยจะประมวลผลทีละเซลล์ (ทุกแถวทุกคอลัมน์) และคืนค่า Array ที่มีขนาดเท่าเดิม
.
ตัวอย่าง: =MAP({1,2,3;4,5,6}, LAMBDA(v, v*10)) จะได้ {10,20,30;40,50,60} (2 แถว × 3 คอลัมน์เหมือนเดิม)
.
สังเกตว่า MAP จะวน loop ผ่านทุก element ตามลำดับ column-major (คอลัมน์ที่ 1 ทุกแถวก่อน แล้วคอลัมน์ที่ 2 ทุกแถว)
MAP ใช้ได้เฉพาะ **Microsoft 365** และ **Excel 2024** เท่านั้นครับ เป็นหนึ่งใน LAMBDA Helper Functions ที่ออกมาพร้อม dynamic arrays
.
❌ ไม่รองรับใน Excel 2021, 2019, 2016 หรือเวอร์ชันก่อนหน้า
.
ถ้าใช้ Excel รุ่นเก่า ต้องใช้วิธีทางเลือกเช่น helper columns หรือ array formulas แบบเดิม (Ctrl+Shift+Enter) ซึ่งจะยุ่งยากกว่านี้เยอะครับ 😅
ต่างกันครับ ในแง่ของความยืดหยุ่น:
.
**Array formula แบบธรรมดา (A1:A10*2)**
• ใช้ได้เฉพาะ operations พื้นฐาน (+, -, *, /, ^)
• ฟังก์ชันบางตัวที่รองรับ arrays โดยตรง
• เร็วกว่า MAP
.
**MAP**
• ใช้ได้กับ logic ซับซ้อนใดๆ ผ่าน LAMBDA
• รองรับ nested IF, text functions, VLOOKUP
• รองรับหลาย input arrays พร้อมกัน
• สามารถทำ custom logic ที่ array formula แบบเดิมทำไม่ได้
.
ส่วนตัวผมแนะนำว่า ถ้าทำได้ด้วย array formula ธรรมดา ให้ใช้แบบนั้นเพราะเร็วกว่า แต่ถ้า logic ซับซ้อน ให้ใช้ MAP เลยครับ 😎
ถ้า LAMBDA return error ที่ตำแหน่งใดตำแหน่งหนึ่ง (เช่น #DIV/0!, #N/A, #VALUE!) ตำแหน่งนั้นใน output array จะแสดง error นั้น
.
ส่วนตำแหน่งอื่นๆ ที่คำนวณสำเร็จจะแสดงผลลัพธ์ปกติครับ
.
ตัวอย่าง: =MAP({10,0,5}, LAMBDA(v, 100/v)) → {10, #DIV/0!, 20}
.
ถ้าต้องการป้องกัน error สามารถใช้ IFERROR ภายใน LAMBDA ได้เลย:
LAMBDA(v, IFERROR(100/v, 0)) จะได้ {10, 0, 20} แทน
.
นี่เป็นเทคนิคที่ผมใช้บ่อยมากสำหรับ data cleaning ครับ 💡
MAP เป็น LAMBDA Helper Function ที่ใช้ประมวลผลข้อมูลทีละ element (ทีละค่า) จาก Array หนึ่งหรือหลายตัว โดยส่งค่าแต่ละตำแหน่งเข้าไปใน LAMBDA function เพื่อคำนวณ แล้ว return Array ผลลัพธ์ที่มีขนาดเท่ากับ Array ต้นฉบับ
.
ที่เจ๋งคือ MAP ต่างจาก BYROW/BYCOL ตรงที่มันส่งเฉพาะค่าเดี่ยวๆ ทีละตำแหน่ง ไม่ใช่ส่งทั้งแถวหรือทั้งคอลัมน์ ทำให้เหมาะมากสำหรับการแปลงค่าทุกตัวใน Array แบบ element-wise transformations 😎
.
ไม่ว่าจะเป็นการคูณทุกค่าด้วยตัวเลข การตรวจสอบเงื่อนไขทุกเซลล์ การแปลงข้อมูลแบบกำหนดเอง หรือแม้แต่การคำนวณจาก Array หลายตัวพร้อมกันก็ได้ครับ
.
MAP รองรับการใช้หลาย Array input ได้ (ต้องมีขนาดเท่ากันทุกตัว) ซึ่งทำให้เราสามารถทำ parallel processing หรือเปรียบเทียบข้อมูลจากหลายแหล่งได้อย่างมีประสิทธิภาพเลยครับ 💡