Page 1 of 1

ดึงข้อมูลรายการที่ไม่ซ้ำแบบมีเงื่อนไข

Posted: Sat Sep 10, 2022 10:37 am
by knine2465
:D สอบถามท่านผู้รู้หน่อยครับ
ต้องการดึงข้อมูลคอลัมภ์ A ช่วงข้อมูล A3:A35 ให้มาแสดงผลที่คอลัมภ์ G แบบไม่ซ้ำกันโดยมีเงื่อนไขตรงกับ F1 ที่ G3 ใช้สูตร =LOOKUP(CHAR(255),CHOOSE({1,2},"",INDEX($A$3:$A$35,SMALL(IF($B$3:$B$35=$F$1,IF(MATCH($A$3:$A$35,$A$3:$A$35,0)=ROW($A$3:$A$35)-ROW($A$3)+1,ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS($G$3:G3))))) กดแป้น Ctrl+Shift+Enter แล้ว
พบว่าข้อมูลที่แสดงในคอลัมภ์ G แสดงค่าได้ไม่ครบถ้วนต้องแก้ไขปรับสูตรอย่างไรครับ
ขอบคุณครับ

Re: ดึงข้อมูลรายการที่ไม่ซ้ำแบบมีเงื่อนไข

Posted: Sat Sep 10, 2022 10:55 am
by snasui
:D ตัวอย่างสูตรครับ

เซลล์ G3 คีย์

=IFERROR(INDEX($A:$A,AGGREGATE(15,6,ROW($A$3:$A$35)/(0<FREQUENCY(IF($B$3:$B$35=$F$1,MATCH($A$3:$A$35,$A$3:$A$35,0)),ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS(G$3:G3))),"")

Ctrl+Shift+Enter > Copy ลงด้านล่าง

Re: ดึงข้อมูลรายการที่ไม่ซ้ำแบบมีเงื่อนไข

Posted: Sat Sep 10, 2022 4:19 pm
by knine2465
ขอบคุณครับสำหรับคำแนะนำปรับแก้ไขสูตร...นำไปลองใช้กับข้อมูลจริงแล้วใช้งานได้ดีครับ
มีข้อสงสัยสอบถามเพิ่มครับ :D =IFERROR(INDEX($A:$A,AGGREGATE(15,6,ROW($A$3:$A$35)/(0<FREQUENCY(IF($B$3:$B$35=$F$1,MATCH($A$3:$A$35,$A$3:$A$35,0)),ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS(G$3:G3))),"")
จากสูตรที่แนะนำมาเป็นการค้นหาข้อมูลทั้งคอลัมภ์ $A:$A ผมลองเปลี่ยนให้ค้นหาแบบระบุเป็นช่วงข้อมูล $A$3:$A$35 ทำไมผลลัพธ์ถึงต่างกันครับ
=IFERROR(INDEX($A$3:$A$35,AGGREGATE(15,6,ROW($A$3:$A$35)/(0<FREQUENCY(IF($B$3:$B$35=$F$1,MATCH($A$3:$A$35,$A$3:$A$35,0)),ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS(G$3:G3))),"")
=LOOKUP(CHAR(255),CHOOSE({1,2},"",INDEX($A$3:$A$35,SMALL(IF($B$3:$B$35=$F$1,IF(MATCH($A$3:$A$35,$A$3:$A$35,0)=ROW($A$3:$A$35)-ROW($A$3)+1,ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS($G$3:G3)))))
และจากสูตรนี้ทำไมผลการคำนวณถึงได้ผลลัพธ์ไม่ครบถ้วนครับเกิดการผิดพลาดตรงจุดใดขอคำชี้แนะด้วยครับ

Re: ดึงข้อมูลรายการที่ไม่ซ้ำแบบมีเงื่อนไข

Posted: Sat Sep 10, 2022 4:44 pm
by snasui
knine2465 wrote: Sat Sep 10, 2022 4:19 pm มีข้อสงสัยสอบถามเพิ่มครับ =IFERROR(INDEX($A:$A,AGGREGATE(15,6,ROW($A$3:$A$35)/(0<FREQUENCY(IF($B$3:$B$35=$F$1,MATCH($A$3:$A$35,$A$3:$A$35,0)),ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS(G$3:G3))),"")
จากสูตรที่แนะนำมาเป็นการค้นหาข้อมูลทั้งคอลัมภ์ $A:$A ผมลองเปลี่ยนให้ค้นหาแบบระบุเป็นช่วงข้อมูล $A$3:$A$35 ทำไมผลลัพธ์ถึงต่างกันครับ
:D ให้ผลลัพธ์ต่างกันเพราะการระบุตำแหน่งบรรทัดของผลลัพธ์ต่างกัน หากเลือกเป็น INDEX($A$3:$A$35 จะต้องปรับช่วงของ AGGREGATE(15,6,ROW($A$3:$A$35) เป็น AGGREGATE(15,6,ROW($A$3:$A$35)-Row($A$3)+1 เพื่อให้ผลลัพธ์ของ ROW($A$3:$A$35)-Row($A$3)+1 เริ่มที่เลข 1 เสมอ

การกำหนดช่วงเป็น $A:$A เป็นการอ้างอิงถึงช่วงในคอลัมน์ ลำดับแรกของช่วงคือ A1 ค่าที่จะนำมาใช้เป็นคำตอบของข้อมูลที่ค้นหาจะต้องให้ผลลัพธ์ที่สัมพันธ์กับช่วงของคอลัมน์ หากได้ค่าลำดับเป็น 3 แสดงว่านำ A3 มาแสดง

ส่วนการกำหนดเป็น $A$3:$A$35 เป็นการอ้างอิงแบบระบุช่วงข้อมูล ลำดับแรกของข้อมูลคือ A3 ค่าที่จะนำมาใช้เป็นคำตอบของข้อมูลที่ค้นหาจะต้องให้ผลลัพธ์ที่สัมพันธ์กับช่วงของข้อมูลนี้ หากผลลัพธ์เป็น 3 หมายถึงนำ A5 มาแสดง
knine2465 wrote: Sat Sep 10, 2022 4:19 pm =LOOKUP(CHAR(255),CHOOSE({1,2},"",INDEX($A$3:$A$35,SMALL(IF($B$3:$B$35=$F$1,IF(MATCH($A$3:$A$35,$A$3:$A$35,0)=ROW($A$3:$A$35)-ROW($A$3)+1,ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS($G$3:G3)))))
และจากสูตรนี้ทำไมผลการคำนวณถึงได้ผลลัพธ์ไม่ครบถ้วนครับเกิดการผิดพลาดตรงจุดใดขอคำชี้แนะด้วยครับ
ลองปรับเป็นด้านล่างครับ

=LOOKUP(CHAR(255),CHOOSE({1,2},"",INDEX($A$3:$A$35,SMALL(IF($B$3:$B$35=$F$1,IF(MATCH($A$3:$A$35&$B$3:$B$35,$A$3:$A$35&$B$3:$B$35,0)=ROW($A$3:$A$35)-ROW($A$3)+1,ROW($A$3:$A$35)-ROW($A$3)+1)),ROWS(G$3:$G3)))))

Ctrl+Shift+Enter > Copy ลงด้านล่าง

ข้อควรระวังหากใช้สูตรนี้จำนวนมาก เนื่องจากเป็นการนำผลลัพธ์ของ Match ไปเทียบกับค่าบรรทัดจะทำให้เครื่องทำงานหนักครับ

Re: ดึงข้อมูลรายการที่ไม่ซ้ำแบบมีเงื่อนไข

Posted: Sat Sep 10, 2022 4:55 pm
by knine2465
ขอบคุณมากครับท่านอาจารย์
:D อธิบายได้ละเอียดและเข้าใจง่ายดีครับ