EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)ขออภัยครับอาจารย์snasui wrote: ช่วยอธิบายเงื่อนไขทั้งหมดมาด้วยครับ
! | Note: Ctrl+Shift+Enter หมายถึงเมื่อคีย์สูตรแล้ว แทนที่จะกด Enter ให้กดแป้น Ctrl+Shift ค้างไว้แล้วกด Enter เพื่อสร้างเป็นสูตร Array หากกดแป้นถูกต้องสูตรนั้นจะมีเครื่องหมายปีกกาครอบ เช่น {=YourFormulas(...)} ปีกกานี้คีย์เข้าไปเองไม่ได้ ถ้ายังไม่เห็นปีกกาครอบสูตรแสดงว่ากดแป้นให้รับสูตรไม่ถูกต้อง |
snasui wrote: ที่ D2 ปรับสูตรเป็นด้านล่างครับ
=INDEX(prod_cal!$A$1:$Q$1000,MATCH(1,IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1)),0),MATCH(B$1,prod_cal!$A$1:$AZ$1,0))
Ctrl+Shift+Enter > Copy ไปด้านขวาและลงด้านล่าง
!Note: Ctrl+Shift+Enter หมายถึงเมื่อคีย์สูตรแล้ว แทนที่จะกด Enter ให้กดแป้น Ctrl+Shift ค้างไว้แล้วกด Enter เพื่อสร้างเป็นสูตร Array หากกดแป้นถูกต้องสูตรนั้นจะมีเครื่องหมายปีกกาครอบ เช่น {=YourFormulas(...)} ปีกกานี้คีย์เข้าไปเองไม่ได้ ถ้ายังไม่เห็นปีกกาครอบสูตรแสดงว่ากดแป้นให้รับสูตรไม่ถูกต้อง
สูตรนี้ครับอาจารย์snasui wrote: ไม่เข้าใจสูตรไหนให้ถามเป็นสูตร ๆ ไปครับ
ขอบพระคุณอย่างสูงครับอาจารย์สำหรับความรู้ใหม่ อธิบายได้ชัดเจนมากครับsnasui wrote: ตอบข้อ 1, 2 เป็นการ Match แบบ 2 เงื่อนไขครับ
จากสูตร
MATCH(1,IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1)),0)
หมายถึงให้หาค่า 1 ว่าอยู่ในลำดับที่เท่าไรของ IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1))
จากสูตร
IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1))
หมายถึง หาก prod_cal!$A$2:$A$1000=$A2 เป็นจรีงให้แสดงผลลัพธ์ของ IF(prod_cal!$B$2:$B$1000=$B2,1)
จากสูตร
IF(prod_cal!$B$2:$B$1000=$B2,1)
หมายถึง หาก prod_cal!$B$2:$B$1000=$B2 เป็นจรีงให้แสดงเลข 1 ถ้าไม่เป็นจริงให้แสดงค่า False
สูตรพวกนี้เป็นสุตร Array ที่ผมอธิบายจะต้องแทนค่าสูตรจากด้านหลังไปด้านหน้า หรือจากคำอธิบายนี้ให้แทนค่าจากล่างขึ้นบน
การแกะสูตรให้คลุมส่วนทีสนใจแล้วกดแป้น F9 เพื่อดูผลลัพธ์ หรือ คลิกที่เซลล์ที่มีสูตร > เข้าเมนู Evaluate Formula > แล้วคลิก Evaluate ไปเรื่อย ๆ ตามต้องการจะเห็นการแสดลผลลัพธ์ของส่วนประกอบสูตร
ตอบข้อ 3 Index มีส่วนประกอบสำหรับการอ้างอิงถึงบรรทัดและคอลัมน์อย่างละ 1 ค่าเท่านั้น การใส่เข้าไป 3 ค่าจึงให้ค่าทีผิดพลาด
ฟังก์ชั่น Index มีไวยากรณ์คือ
=Index(Range,x,y)
หมายถึงใน Range ให้นำบรรทัดที่ x คอลัมน์ที่ y มาแสดง
เราไม่สามารถเขียนให้แสดงผลลัพธ์ของบรรทัดและคอลัมน์ด้วยการใช้
=Index(Range,x,y,z)
เพราะ z เป็นส่วนเกินของการทำงานลักษณะที่ถามมานี้
visarut wrote:ขอบพระคุณอย่างสูงครับอาจารย์สำหรับความรู้ใหม่ อธิบายได้ชัดเจนมากครับsnasui wrote: ตอบข้อ 1, 2 เป็นการ Match แบบ 2 เงื่อนไขครับ
จากสูตร
MATCH(1,IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1)),0)
หมายถึงให้หาค่า 1 ว่าอยู่ในลำดับที่เท่าไรของ IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1))
จากสูตร
IF(prod_cal!$A$2:$A$1000=$A2,IF(prod_cal!$B$2:$B$1000=$B2,1))
หมายถึง หาก prod_cal!$A$2:$A$1000=$A2 เป็นจรีงให้แสดงผลลัพธ์ของ IF(prod_cal!$B$2:$B$1000=$B2,1)
จากสูตร
IF(prod_cal!$B$2:$B$1000=$B2,1)
หมายถึง หาก prod_cal!$B$2:$B$1000=$B2 เป็นจรีงให้แสดงเลข 1 ถ้าไม่เป็นจริงให้แสดงค่า False
สูตรพวกนี้เป็นสุตร Array ที่ผมอธิบายจะต้องแทนค่าสูตรจากด้านหลังไปด้านหน้า หรือจากคำอธิบายนี้ให้แทนค่าจากล่างขึ้นบน
การแกะสูตรให้คลุมส่วนทีสนใจแล้วกดแป้น F9 เพื่อดูผลลัพธ์ หรือ คลิกที่เซลล์ที่มีสูตร > เข้าเมนู Evaluate Formula > แล้วคลิก Evaluate ไปเรื่อย ๆ ตามต้องการจะเห็นการแสดลผลลัพธ์ของส่วนประกอบสูตร
ตอบข้อ 3 Index มีส่วนประกอบสำหรับการอ้างอิงถึงบรรทัดและคอลัมน์อย่างละ 1 ค่าเท่านั้น การใส่เข้าไป 3 ค่าจึงให้ค่าทีผิดพลาด
ฟังก์ชั่น Index มีไวยากรณ์คือ
=Index(Range,x,y)
หมายถึงใน Range ให้นำบรรทัดที่ x คอลัมน์ที่ y มาแสดง
เราไม่สามารถเขียนให้แสดงผลลัพธ์ของบรรทัดและคอลัมน์ด้วยการใช้
=Index(Range,x,y,z)
เพราะ z เป็นส่วนเกินของการทำงานลักษณะที่ถามมานี้
ขอบคุณครับอาจารย์ สำหรับข้อชี้แนะsnasui wrote: ที่ชีท Cal เซลล์ AC2 ต้องเป็น กรุงเทพฯ ไม่ใช่ กรุงเทพมหานคร สูตรจึงจะให้คำตอบได้ถูกต้อง
ค่าที่ต่างกันเช่นนี้จะต้องมีการแก้ไขให้เหมือนกันเสียก่อน ไม่เช่นนั้นก็ Match กันไม่ได้ นอกจากนี้การเขียนสูตรใน Excel ให้หลีกเลี่ยงการอ้างทั้งคอลัมน์ มีข้อมูลแค่ไหนให้อ้างถึงแค่นั้นหรือเผื่อไว้เท่าที่เห็นว่าข้อมูลสามารถขยายไปถึง
เมื่อเปลี่ยนค่าในเซลล์ AC2 แล้วปรับสูตรใน AE2 เป็นด้านล่าง สังเกตช่วงเซลล์ด้วยว่าปรับจากของเดิมเป็นอย่างไรครับ
=INDEX(table!$A$2:$AZ$1000,MATCH(1,IF(table!$C$2:$C$1000=$M2,IF(table!$D$2:$D$1000=$AB2,IF(table!$E$2:$E$1000=$AC2,1))),0),MATCH(AD$2,LEFT(table!$A$1:$AZ$1,4)+0))
ช่วงที่ระบายสีแดงไว้ในสูตรเป็นการตัดค่าด้านหน้าของช่วง table!$A$1:$AZ$1 มา 4 อักขระ จากนั้นบวกด้วย 0 เพื่อให้กลับไปเป็น Number ที่ต้องทำเช่นนี้เพื่อให้ Match กันได้ ตัวเลขต้อง Match กับตัวเลข, Text ต้อง Match กับ Text ค่าที่เหมือนกันเท่านั้นจึงจะ Match กันได้ ไม่ใช่เอาค่าเดี่ยวไป Match กับช่วงเหมือนที่เขียนมา ช่วงที่เขียนแบบนั้นเป็น Text ไม่สามารถ Match กันได้ครับ