Page 1 of 2
ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Aug 27, 2017 9:58 am
by akekarakj
จากไฟล์ที่แนบมา
ไม่ค่อยเข้าใจการเอาจากฐานข้อมูลมาแสดง อยากทราบว่าการดึงข้อมูลจากรายการบันทึกมาแสดงในการอบรมแต่ละซีทเพื่อที่จะมาแสดงวันที่การอบรมในช่วงปี จะเขียนสูตรว่าอย่างไรครับ
1.รายการบันทึกแต่ละการอบรมสามารถเอามารวมกันเวลาเขียนสูตรเพื่อที่จะแยกออกมาต้องเขียนว่าอย่างไร
2.Sheet อบรม ตัวอย่าง GHA ในการเขียนสูตรแยกว่า ID01 นาย A อบรม GHA ใน ช่วงปี 2012 ให้เอาวันที่มาใส่ ตามที่ผมกรอกไว้
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Aug 27, 2017 2:22 pm
by snasui

ตัวอย่างสูตรครับ
ที่ชีต GHA เซลล์ G4 คีย์สูตร
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[Course]=$D4,IF(รายการบันทึก[NAME]=$C4,IF(YEAR(G$3)=YEAR(รายการบันทึก[Date]),1))),0)),"")
Ctrl+Shift+Enter> Copy ไปทางขวาและลงด้านล่าง > คัดลอกสูตรไปใช้กับชีตอื่น ๆ ตามต้องการ กรุณาอ่านวิธีกดแป้นใน Note ด้านล่างอย่างละเอียด ไม่เช่นนั้นจะไม่ได้คำตอบตรับ
!
| Note: Ctrl+Shift+Enter เป็นการสร้างสูตร Array โดยสามารถเลือกดำเนินการตามข้อ 1 หรือ 2 ด้านล่าง
- กรณีคีย์สูตรเอง เมื่อคีย์สูตรแล้ว แทนที่จะกด Enter ให้กดแป้น Ctrl และ Shift พร้อมกันค้างไว้แล้วกด Enter เพื่อสร้างเป็นสูตร Array
- กรณี Copy สูตรไปวางให้กดแป้น F2 เพื่อทำการ Edit Cell นั้นก่อน จากนั้นกดแป้น Ctrl และ Shift พร้อมกันค้างไว้แล้วตามด้วย Enter เพื่อสร้างเป็นสูตร Array
- หากกดแป้นถูกต้องสูตรนั้นจะมีเครื่องหมายปีกกาครอบ เช่น {=YourFormulas(...)} ปีกกานี้ไม่สามารถคีย์เข้าไปเอง จะต้องมาด้วยการกดแป้น Ctrl+Shift+Enter เท่านั้น ถ้ายังไม่เห็นปีกกาครอบสูตรแสดงว่ากดแป้นให้รับสูตรไม่ถูกต้อง
- การแก้ไขเปลี่ยนแปลงสูตร Array จะต้องกดแป้นให้รับสูตรด้วย Ctrl+Shift+Enter ทุกครั้ง
|
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Aug 27, 2017 4:39 pm
by akekarakj
อาจารย์ครับพอจะอธิบายความหมายเพิ่มเติ่มได้ไหมครับ เพื่อจะจะนำดัดแปลงหรือพอจะมีอันไหนเพื่อผมจะได้ไปศึกษาต่อได้ ขอบคุณมากครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Aug 27, 2017 4:59 pm
by snasui

ความหมายคือให้หาข้อมูลในช่วงข้อมูลที่กำหนด
Index จะกำหนดว่าให้นำข้อมูลจากที่ใดมาแสดง
Match จะค้นหาว่าจากข้อมูลใน Index จะนำลำดับใดมาแสดง
แต่เนื่องจากมีหลายเงื่อนไข Match จึงมีความซับซ้อน จากสูตร
MATCH(1,IF(รายการบันทึก[Course]=$D4,IF(รายการบันทึก[NAME]=$C4,IF(YEAR(G$3)=YEAR(รายการบันทึก[Date]),1))),0)
เป็นการค้นหาเลข 1 จาก
IF(รายการบันทึก[Course]=$D4,IF(รายการบันทึก[NAME]=$C4,IF(YEAR(G$3)=YEAR(รายการบันทึก[Date]),1)))
หมายถึงว่าหากเข้าทั้ง 3 เงื่อนไขพร้อมกันให้ผลลัพธ็เป็นเลข 1 คือ รายการบันทึก[Course]=$D4, รายการบันทึก[NAME]=$C4 และ YEAR(G$3)=YEAR(รายการบันทึก[Date]) ผลลัพธ์จะได้เป็นชุดข้อมูล ยกตัวอย่างเช่น {False, 1, False, False, False,...}
จากตัวอย่างข้างต้นสังเกตว่า 1 อยู่ในลำดับที่ 2 ของชุดข้อมูล ภาพรวมของสูตรจะกลายเป็น
=IFERROR(INDEX(รายการบันทึก[Date],2),"")
หมายถึง จากช่วง รายการบันทึก[Date] ให้นำลำดับที่ 2 มาแสดง
แต่ถ้าหาก Match แล้วไม่พบผลลัพธ์จะเป็น #N/A ซึ่งจะส่งผลให้ Index ได้ผลลัพธ์เป็น #N/A เช่นกัน และกรณีนี้จะถูก Iferror ที่ครอบอยู่นอกสุดเปลี่ยนค่าผิดพลาดให้เป็นค่าว่าง แต่หากไม่เป็นค่าผิดพลาดก็ให้แสดงผลลัพธ์ตามปกติ
ฟังก์ชั่นนี้เป็นฟังก์ชั่น Array จะมีความซับซ้อนสูงและเข้าใจยาก จะต้องค่อย ๆ ทำความเข้าใจครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Mon Aug 28, 2017 9:25 pm
by akekarakj
ขอบคุณมากเลยครับ ถ้าผมจะเพิ่มสูตรค่าที่มากสุดของแต่ล่ะปีเราจะเพิ่มในช่วงตรงไหนครับ
เนื่องจากในการอบรมมีบ้างครั้งที่ปี1 อบรม2ครั้ง
ครั้งที่1 ID01 นาย A อบรม GHA 2 FEB 2003
ครั้งที่2 ID01 นาย A อบรม GHA 3 DEC 2003
ในSheet GHA ปี 2003 Cell G4 ให้แสดงครั้งล่าสุดของปี คือ แสดง 3 DEC 2003
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Mon Aug 28, 2017 9:39 pm
by snasui

ปรับสูตรเป็นด้านล่างครับ
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[Course]=$D4,IF(รายการบันทึก[NAME]=$C4,IF(YEAR(G$3)=YEAR(รายการบันทึก[Date]),1))))),"")
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Tue Aug 29, 2017 1:11 pm
by akekarakj
ขอบคุณอาจารย์มากเลยครับ ผมเอาไปปรับได้หลายแบบได้เลยครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Sep 10, 2017 12:57 pm
by akekarakj
อาจาร์ยครับพอลองปรับสูตร เพื่อที่จะใช้ Small,Large กับไม่แสดงผลข้อมูลครับหรือว่าผมเขียนผิด
ในช่อง D4
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[Course]=$D2,IF(รายการบันทึก[NAME]=$C4,SMALL(รายการบันทึก[[ID]:[Date]],1))),0)),"")
ในช่อง E4
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[Course]=$D2,IF(รายการบันทึก[NAME]=$C4,Large(รายการบันทึก[[ID]:[Date]],2))),0)),"")
ในช่อง F4
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[Course]=$D2,IF(รายการบันทึก[NAME]=$C4,Large(รายการบันทึก[[ID]:[Date]],1))),0)),"")
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Sep 10, 2017 3:01 pm
by snasui

ควรแจ้งมาว่าต้องการค่าใด ด้วยเงื่อนไขใด กรอกตัวอย่างคำตอบด้วยมือมาด้วยจะได้สะดวกในการทำความเข้าใจครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Sep 10, 2017 5:32 pm
by akekarakj
ขอโทษด้วยครับอาจาร์ย ที่ไม่ได้อธิบายค่าที่ต้องการ
ค่าที่ต้องการคือ พนักงาน ID 01 นาย A อบรมCourse DGA ครั้งแรกโดยเอาข้อมูลจากรายการที่บันทึก เช่น ID 01 นาย A อบรมวันที่ 1 JAN 16,1 DEC 16, 1 NOV 17 แต่เนื่องด้วยบ้างครั้ง1ปีอาจอบรมCourse เดียวกันถึงสองครั้ง จึงลองแทรกสูตร Small กับ Large เพื่อจะได้เลือกลำดับวันที่ก่อนและหลัง หรือรองสุดท้าย
คอลัมน์ D4 ต้องการแสดงวันที่ครั้งแรกที่นาย Aอบรบ 1 JAN 16
คอลัมน์ E4 ต้องการให้แสดงวันที่ก่อนครั้งสุดท้ายที่นาย A อบรม 1 DEC 16 ครับ แสดงค่าว่างไว้
คอลัมน์ F4 ต้องการให้แสดงวันที่สุดท้าย 1 NOV 17 ครับ
- ท่าไม่มีข้อมูลให้แสดงค่าว่างไว้ครับ
เพื่อที่จะไปทำ ใบป่ะหน้า Sheet ประวัติข้อมูลพนักงาน
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Sep 10, 2017 8:15 pm
by snasui

ตัวอย่างสูตรครับ
- เซลล์ D4 คีย์
=IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:D$2),1))),0)),"")
Ctrl+Shift+Enter > Copy ลงด้านล่าง > Copy ไปยังคอลัมน์ที่เกี่ยวข้อง
- เซลล์ E4 คีย์
=IFERROR(LARGE(IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:E$2),รายการบันทึก[Date]))),2),"")
Ctrl+Shift+Enter > Copy ลงด้านล่าง > Copy ไปยังคอลัมน์ที่เกี่ยวข้อง
- เซลล์ F4 คีย์
=IFERROR(LARGE(IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:F$2),รายการบันทึก[Date]))),1),"")
Ctrl+Shift+Enter > Copy ลงด้านล่าง > Copy ไปยังคอลัมน์ที่เกี่ยวข้อง
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Mon Sep 11, 2017 6:56 pm
by akekarakj
ขอบคุณอาจาร์ยมากเลยครับ จากสูตรที่ให้มาสามารถใช้งานได้ตามตรงตามที่ต้องการให้แสดงเลยครับ
คำถามครับ
1.เชลล์ D4 ใช้INDEX และก็ MATCH แต่ เซลล์ E4,F4 ตัดออก โดยการใช้ Large เพื่อหาลำดับใช้ไหมครับ
2.IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:E$2) ผมไม่ค่อยเข้าใจครับ LookupกับChar225
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Mon Sep 11, 2017 7:05 pm
by snasui

Large เป็นการค่าค่าที่มากที่สุดในลำดับที่ต้องการ เช่น มากที่สุดเป็นลำดับที่ 2 เป็นลำดับที่ 3 ลำดับที่ 1000 เป็นต้น จึงไม่จำเป็นต้องพึ่งพา Index และ Match ที่มีความมุ่งหมายในการใช้งานต่างกันครับ
Lookup ลักษณะนั้นเป็นการหาค่าตัวอักษรสุดท้ายในช่วง สักเกตว่าบรรทัดที่่ 2 เราไม่ได้เขียนข้อมูลไว้ทุกเซลล์เขียนไว้แค่เซลล์แรก แต่คอลัมน์ถัดไปเป็นเซลล์ว่าง ในขณะที่สูตรที่ตรงกันในเซลล์ด้านล่างจำเป็นจะต้องใช้ค่าในบรรทัดที่ 2 เพื่อจะนำไปคำนวณต่อได้ จึงจำเป็นต้องเกิดการประยุกต์ให้สามารถหาค่าสุดท้ายในช่วงใด ๆ ตามต้องการเพื่อที่จะได้ไม่ต้องแก้สูตรอีก เขียนทีเดียวแล้วใช้ได้ทุกคอลัมน์ครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Tue Sep 12, 2017 7:36 pm
by akekarakj
ขอบคุณมากเลยครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Thu Sep 28, 2017 9:50 am
by akekarakj
ขออนุญาติถามต่อน่ะครับ
เนื่องจากข้อมูลที่ผมได้มามีสิ่งผิดปกติคือ วันที่ที่ไม่ใช้วันที่ในวันอบรบ จึงมีวันที่แบบText (3-4 Jan 17) และวันที่ปกติ 3 Jan 17 ซึ่งวันที่ปกติเราสามารถจัดลำดับก่อนหลังได้ จะพอมีวิธีการโดยสิ่งที่ผมทำคือในตารางผมจะให้หาจากวันที่ปกติก่อน เพื่อจัดลำดับแล้วถ้าจะเขียนสูตรเพิ่มโดย เมื่อเจอวันที่ปกติ แล้วไปเอาคอลัมน์ DateText มาแสดง
ในช่องD4 ID01 นาย A Course DGA ครั้งแรกในชีทReport ได้วันที่ 5 AUG 03 และไปเอาข้อความในรายการบันทึก DateText จะได้5-6 Aug 03 มาแสดง
สูตรเก่าD4 =IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:D$2),1))),0)),"")
ในช่องF4 ID01 นาย A Course DGA ท้าย Dateได้วันที่ 4 AUG 03 และไปเอาข้อความในรายการบันทึก DateText จะได้ 4 Aug 07 มาแสดง
สูตรเก่า F4=IFERROR(LARGE(IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:F$2),รายการบันทึก[Date]))),1),"")
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Thu Sep 28, 2017 9:30 pm
by snasui

เปลี่ยนสูตรในส่วนของ Index เสียใหม่ในส่วนอื่น ๆ ยังคงเดิมครับ
จากเดิม
INDEX(รายการบันทึก[Date]
เปลี่ยนเป็นด้านล่างครับ
INDEX(รายการบันทึก[DateText]
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Tue Oct 03, 2017 4:33 pm
by akekarakj
ขอบคุณมากครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sat Nov 04, 2017 3:37 pm
by akekarakj
อาจาร์ยครับจากคราวได้ทำการสอบถามปรากฎว่า เมื่อทำการเปลี่ยนตามที่อาจาร์ยบอกข้อมูลไม่ตรงตามที่ต้องการเลยครับ หรือว่ผมเข้าใจผิด ต้องรบกวนอาจาร์ยอีกครั้งน่ะครับติดเรื่องนี้เรื่องเดียวเลยครับ (ขอแก้ไขข้อมูลบ้างส่วนที่ถามไปตอนแรกน่ะครับ)
ส่วนของช่อง D4 กลับไม่ค้นหาจากครั้งแรกครับเจออันไหนครั้งก็แสดงเลย
ในช่องD4 ID01 นาย A Course DGA ครั้งแรกในรายการบันทึก ได้วันที่ 3 Jan 02 และไปเอาข้อความในรายการบันทึก DateText จะได้ 2-3 Jan 02 มาแสดง แต่กลับเจอ ได้ 5-6 Aug 03 แทนครับ
สูตรเก่าD4 =IFERROR(INDEX(รายการบันทึก[Date],MATCH(1,IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:D$2),1))),0)),"")
แก้ตามที่อาจาร์ยบอกเป็น
D4 =IFERROR(INDEX(รายการบันทึก[DateText],MATCH(1,IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:D$2),1))),0)),"")
ส่วนของช่องF4 กลับไม่แสดงครั้งสุดท้ายของวันที่กลับไปแสดงวันที่ครั้งแรกมาแสดงครับ
ผลที่ต้องการคือช่อง F4 ID01 นาย A Course DGA มี่การอบรบหลายครั้ง ต้องการให้ค้นหาจากวันที่ครั้งสุดท้าย ซึ่งวันสุดท้ายคือ 4 Aug 10 และไปเอาข้อความในรายการบันทึก DateText จะได้ 4-5 Aug 10 มาแสดง ผลปรากฎว่าไม่แสดงผล หรือว่าผมเขียนผิดครับ เพราะเมื่อเปลี่ยน รายการบันทึก[Date] เป็น Date[Text] กลับไม่เรียงลำดับวันที่เลยครับ
F4=IFERROR(LARGE(IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:F$2),รายการบันทึก[DateText]))),1),"")
จากการแก้เป็น DateText กลับแสดงเป็น 5-6 AUG 03 แทน ครับ
F4=IFERROR(INDEX(รายการบันทึก[DateText],MATCH(1,IF(รายการบันทึก[ID]=$B4,IF(รายการบันทึก[NAME]=$C4,IF(รายการบันทึก[Course]=LOOKUP(CHAR(255),$D$2:D$2),1))),0)),"")
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sat Nov 04, 2017 4:54 pm
by snasui
akekarakj wrote:ส่วนของช่อง D4 กลับไม่ค้นหาจากครั้งแรกครับเจออันไหนครั้งก็แสดงเลย
ในช่องD4 ID01 นาย A Course DGA ครั้งแรกในรายการบันทึก ได้วันที่ 3 Jan 02 และไปเอาข้อความในรายการบันทึก DateText จะได้ 2-3 Jan 02 มาแสดง แต่กลับเจอ ได้ 5-6 Aug 03 แทนครับ

จากไฟล์แนบ เซลล์ D4 ให้แสดงครั้งแรก โดยมีเงื่อนไข 3 เงื่อนไขคือ
- ID: ID01
- Name: A
- Course: DGA
เจอที่เซลล์ G7 ค่าเป็น 5-6 Aug 03 ลองทบทวนดูอีกรอบว่าใช่หรือไม่ครับ
Re: ดึงข้อมูลจากรายการบันทึก Training Record
Posted: Sun Nov 05, 2017 7:48 am
by akekarakj
snasui wrote:akekarakj wrote:ส่วนของช่อง D4 กลับไม่ค้นหาจากครั้งแรกครับเจออันไหนครั้งก็แสดงเลย
ในช่องD4 ID01 นาย A Course DGA ครั้งแรกในรายการบันทึก ได้วันที่ 3 Jan 02 และไปเอาข้อความในรายการบันทึก DateText จะได้ 2-3 Jan 02 มาแสดง แต่กลับเจอ ได้ 5-6 Aug 03 แทนครับ

จากไฟล์แนบ เซลล์ D4 ให้แสดงครั้งแรก โดยมีเงื่อนไข 3 เงื่อนไขคือ
- ID: ID01
- Name: A
- Course: DGA
เจอที่เซลล์ G7 ค่าเป็น 5-6 Aug 03 ลองทบทวนดูอีกรอบว่าใช่หรือไม่ครับ
จากไฟล์แนบ เซลล์ D4 ให้แสดงวันที่ครั้งแรก โดยมีเงื่อนไข 3 เงื่อนไขคือ
ID: ID01
Name: A
Course: DGA
Date: 3 Jan 02
แสดงค่า คือ 2-3 Jan 02 ครับ
จากไฟล์แนบ เซลล์ F4 ให้แสดงวันที่ครั้งสุดท้าย โดยมีเงื่อนไข 3 เงื่อนไขคือ
ID: ID01
Name: A
Course: DGA
Date: 4-5 Aug 10
แสดงค่า คือ 4-5 Aug 10 ครับ