Page 1 of 2
สรุปข้อมูลจาก Database
Posted: Tue Mar 27, 2012 5:02 pm
by joo
ต้องการสรุปข้อมูลจากซีท Database มาที่ซีท "สรุป" โดยแสดงจำนวนของแต่ละรายการลงในแต่ละช่องของวัน เช่น รายการ A ช่องของวันที่2 มีจำนวนเท่ากับ 2 ช่วยดูสูตรให้หน่อยครับ

Re: สรุปข้อมูลจาก Database
Posted: Tue Mar 27, 2012 5:31 pm
by bank9597

ลองตามนี้ครับ
ที่ C9 คีย์
=SUMPRODUCT(--(DAY(Database!$B$4:$B$160)=C$7),--(TEXT(Database!$B$4:$B$160,"ดดดด")=$T$4),--(Database!$A$4:$A$160=$V$4),--(Database!$C$4:$C$160=$B9),Database!$D$4:$D$160)
คัดลอกไปทางขวามือจนสุดวันที่ 31 แล้วคัดลอกลงมาพร้อมกันครับ
สามารถเปลี่ยนชื่อ เดือน และ ปี ได้ตามต้องการครับ

Re: สรุปข้อมูลจาก Database
Posted: Wed Mar 28, 2012 5:04 pm
by joo
ขอบคุณครับสำหรับคำแนะนำ ทดลองแล้วใช้งานได้ดีครับ..แต่เครื่องจะคำนวณช้ามากเมื่อมีการเปลี่ยนแปลงข้อมูลที่ซีท Database ยิ่งมีข้อมูลมากก็ยิ่งคำนวณช้ามากขึ้นครับ
มีวิธีให้การคำนวณเร็วขึ้นกว่านี้ไหมครับ

Re: สรุปข้อมูลจาก Database
Posted: Wed Mar 28, 2012 5:27 pm
by bank9597

โปรแกรมคำนวนช้าเป็นเรื่องธรรมดาครับ เพราะเป็นสูตรอาร์เรย์ อีกทั้งเงื่อนไขก็เยอะด้วย
ลองดูตามไฟล์แนบครับ
Re: สรุปข้อมูลจาก Database
Posted: Wed Mar 28, 2012 9:44 pm
by tupthai
ลองแบบสูตรธรรมดาครับ
1.หาช่วงวันที่ของเดือน ที่ชีท Database
j2 พิมพ์สูตร
= DATEVALUE("1/"&สรุป!$T$4&"/"&สรุป!$V$4-543)
k2 พิมพ์สูตร
=DATE(YEAR($J$2),MONTH($J$2)+1,0)
2.หา index ไว้ดึงข้อมูล
k4 พิมพ์สูตร
=IF(AND($B4>=$J$2,$B4<=$K$2),$C4&DAY($B4),"")
enter> copy ลงด้านล่าง
3.ที่ชีท สรุป c9 พิมพ์สูตร
=IF(COUNTIF(Database!$K$4:$K$151,$B9&C$7)=0,"",INDEX(Database!$D$4:$D$151,MATCH($B9&C$7,Database!$K$4:$K$151,0)))
enter> copy ไปทางขวา และ ลงด้านล่าง
Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 10:17 am
by tupthai
tupthai wrote:ลองแบบสูตรธรรมดาครับ
1.หาช่วงวันที่ของเดือน ที่ชีท Database
j2 พิมพ์สูตร
= DATEVALUE("1/"&สรุป!$T$4&"/"&สรุป!$V$4-543)
k2 พิมพ์สูตร
=DATE(YEAR($J$2),MONTH($J$2)+1,0)
2.หา index ไว้ดึงข้อมูล
k4 พิมพ์สูตร
=IF(AND($B4>=$J$2,$B4<=$K$2),$C4&DAY($B4),"")
enter> copy ลงด้านล่าง
3.ที่ชีท สรุป c9 พิมพ์สูตร
=IF(COUNTIF(Database!$K$4:$K$151,$B9&C$7)=0,"",INDEX(Database!$D$4:$D$151,MATCH($B9&C$7,Database!$K$4:$K$151,0)))
enter> copy ไปทางขวา และ ลงด้านล่าง
ผมมาดูเงื่อนไขใหม่อีกครั้ง พบว่าในหนี่งวัน เช่น กิจกรรม A ในวันที่ 9 มีมากกว่าหนึ่งรายการจึงปรับสูตรใหม่เป็น
c9 พิมพ์สูตร
=IF(COUNTIF(Database!$K$4:$K$151,$B9&C$7)=0,"",SUMIF(Database!$K$4:$K$151,$B9&C$7,Database!$D$4:$D$151))
enter> copy ไปทางขวา และ ลงด้านล่าง

Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 12:05 pm
by joo
ขอบคุณครับ คุณTupthai และ คุณ bank9597 มากๆเลยครับได้ทดลองกับข้อมูลมากๆดูแล้วเร็วขึ้นกว่าเดิมเลยครับ แต่ก็ไม่ค่อยสะดวกมากเท่าไรที่ต้องคีย์สูตรไว้ที่ฐานข้อมูลให้ครอบคลุมล่วงหน้าไว้ก่อน ถ้าได้แบบเดิมก็จะดีไม่น้อยเลยครับ

Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 1:07 pm
by bank9597
joo wrote:ขอบคุณครับ คุณTupthai และ คุณ bank9597 มากๆเลยครับได้ทดลองกับข้อมูลมากๆดูแล้วเร็วขึ้นกว่าเดิมเลยครับ แต่ก็ไม่ค่อยสะดวกมากเท่าไรที่ต้องคีย์สูตรไว้ที่ฐานข้อมูลให้ครอบคลุมล่วงหน้าไว้ก่อน ถ้าได้แบบเดิมก็จะดีไม่น้อยเลยครับ

ให้แยกเก็บข้อมูลวันที่ออกมาก่อนครับ เช่น 1/03/2012 ก็ให้แยกเก็บข้อมูล วันที่ เดือน ปี ออกจากกัน เวลานำข้อมูลไปใช้ ก็จะทำให้เร็วขึ้น เนื่องจากสูตรไม่ต้องแปลงค่าจากวันที่ก่อน ก่อนจะนำไปเปรียบเทียบกับเงื่อนไข ซึ่งมีผลทำให้การทำงานช้าลงอย่างหลีกเลี่ยงไม่ได้ แต่ในทางปฎิบัติแล้วไม่มีค่อยมีใครแยกเก็บข้อมูลแบบนั้น เพราะมันจะเปลืองคอลัมน์โดยเปล่าประโยชน์ เว้นแต่ว่าเราต้องการใช้เฉพาะกิจจริงๆ เราถึงจะทำแบบนั้นได้
ในชีท database มีข้อมูลวันที่อยู่ 1 คอลัมน์ การจะใช้สูตรให้ได้ผลลัพธ์ที่เร็วขึ้นก็ควรแยกวันที่ เดือน ปี ออกมาอยู่คนล่ะคอลัมน์กัน โดยการใช้สูตร Day,Month,Year แล้วคัดลอกค่าที่ได้ วางทับที่เดิมอีกครั้งโดยการ "วางค่า" ที่ทำเช่นนี้เพราะว่า ฐานข้อมูลที่ดีไม่ควรมีสูตรอยู่ในชีทเก็บข้อมูล มันจะทำให้การทำงานของโปรแกรมช้านั่นเองครับ
ดังไฟล์แนบในกระทู้ล่าสุดของผม ผมจะใช้วิธีดังกล่วนี้ในการทำ ซึ่งทำให้สูตรคำนวนได้เีร็วกว่าเดิมเยอะขึ้นครับ

Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 2:12 pm
by snasui
bank9597 wrote:ในชีท database มีข้อมูลวันที่อยู่ 1 คอลัมน์ การจะใช้สูตรให้ได้ผลลัพธ์ที่เร็วขึ้นก็ควรแยกวันที่ เดือน ปี ออกมาอยู่คนล่ะคอลัมน์กัน โดยการใช้สูตร Day,Month,Year แล้วคัดลอกค่าที่ได้ วางทับที่เดิมอีกครั้งโดยการ "วางค่า" ที่ทำเช่นนี้เพราะว่า ฐานข้อมูลที่ดีไม่ควรมีสูตรอยู่ในชีทเก็บข้อมูล มันจะทำให้การทำงานของโปรแกรมช้านั่นเองครับ
ปกติแล้วใน Database ไม่จำเป็นต้องแยกวัน เดือน ปี ออกเป็นคนละคอลัมน์ครับ เพราะจะยุ่งยากลำบากในการสรุปข้อมูลด้วยวิธีอื่น ๆ เช่น PivotTable และไม่ควรจะมี วันเดือนปี แล้วแยกเป็น วันที่ เดือน ปี รวมเป็น 4 คอลัมน์เช่นนี้ครับ
Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 2:24 pm
by bank9597
Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 6:59 pm
by joo
สรุปแล้วควรใช้วิธีไหนดีครับท่านอาจารย์...จึงจะได้ผลการคำนวณที่รวดเร็ว

Re: สรุปข้อมูลจาก Database
Posted: Thu Mar 29, 2012 7:44 pm
by snasui

ที่ชีทสรุปเซลล์ C9 ลองปรับสูตรเป็นตามด้านล่างครับ
=SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151)
Enter > Copy ไปทางขวาและลงด้านล่าง
Re: สรุปข้อมูลจาก Database
Posted: Fri Mar 30, 2012 10:53 am
by joo
ขอบคุณครับท่านอาจารย์...ทดลองกับข้อมูลปริมาณมากๆแล้วเร็วขึ้นกว่าเดิมครับ
แต่ว่าถ้าเลือกเป็นเดือนอื่นๆที่ไม่ครบ 31 วัน เช่น เดือน กุมภาพันธ์ ที่เซลล์ AF,AG จะแสดง #VALUE! ทำให้การคำนวณที่เซลล์ AH แสดง #VALUE! ตามครับ

Re: สรุปข้อมูลจาก Database
Posted: Fri Mar 30, 2012 11:17 am
by bank9597

ที่ C9 ลองปรับสูตรตามนี้
=IF(ISERROR(SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151))=TRUE,"",SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151))
คัดลอกไปทางขวามือ
Re: สรุปข้อมูลจาก Database
Posted: Fri Mar 30, 2012 11:52 am
by joo
ขอบคุณครับทดลองแล้วสามารถแก้ปัญหา #VALUE! ได้ดี....แต่ผลข้างเคียงที่ตามมาคือคำนวณช้าลงกว่าเดิมอีกครับ

Re: สรุปข้อมูลจาก Database
Posted: Fri Mar 30, 2012 12:03 pm
by snasui

เมื่อใช้ Iserror, Iserr, Isnumber ฯลฯ ซึ่งเป็นการตรวจสอบค่าว่าจริงหรือเท็จแล้ว เราไม่จำเป็นต้องเขียนเปรียบเทียบว่าเท่ากับ True หรือ False อีกรอบครับ เพราะมันให้ผลลัพธ์เป็น True หรือ False อยู่แล้ว
จาก
bank9597 wrote:
ที่ C9 ลองปรับสูตรตามนี้
=IF(ISERROR(SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151))=TRUE,"",SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151))
ควรจะเป็น
=IF(ISERROR(SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151)),"",SUMPRODUCT(--((C$7&$T$4&$V$4-543)+0=Database!$B$4:$B$151),--($B9=Database!$C$4:$C$151),Database!$D$4:$D$151))
joo wrote:ขอบคุณครับท่านอาจารย์...ทดลองกับข้อมูลปริมาณมากๆแล้วเร็วขึ้นกว่าเดิมครับ
แต่ว่าถ้าเลือกเป็นเดือนอื่นๆที่ไม่ครบ 31 วัน เช่น เดือน กุมภาพันธ์ ที่เซลล์ AF,AG จะแสดง #VALUE! ทำให้การคำนวณที่เซลล์ AH แสดง #VALUE! ตามครับ

หากข้อมูลปริมาณมากและไม่ต้องการเพิ่มความซับซ้อนของสูตรให้ปรับสูตรในคอลัมน์ AH เป็น Sumif แบบไม่รวมค่าผิดพลาด และใช้ Conditional Formatting เพื่อซ่อนค่าผิดพลาดเอาไว้ก็ได้ครับ ดูตัวอย่าง Sumif แบบไม่รวมค่าผิดพลาดที่นี่ครับ
http://snasui.blogspot.com/2008/11/blog-post_9829.html
Re: สรุปข้อมูลจาก Database
Posted: Fri Mar 30, 2012 1:10 pm
by bank9597
Re: สรุปข้อมูลจาก Database
Posted: Sat Mar 31, 2012 10:33 am
by joo
ขอบคุณครับสำหรับคำแนะนำ
หากข้อมูลปริมาณมากและไม่ต้องการเพิ่มความซับซ้อนของสูตรให้ปรับสูตรในคอลัมน์ AH เป็น Sumif แบบไม่รวมค่าผิดพลาด และใช้ Conditional Formatting เพื่อซ่อนค่าผิดพลาดเอาไว้ก็ได้ครับ
ตรง Conditional Formatting เพื่อซ่อนค่าผิดพลาด กำหนดการซ่อนค่าอย่างไรครับ

Re: สรุปข้อมูลจาก Database
Posted: Sat Mar 31, 2012 10:39 am
by snasui

ลองตามนี้ครับ
สมมุติต้องการซ่อนค่าผิดพลาดที่เซลล์ A1:A10
- คลุม A1:A10
- เข้าเมนู Format > Conditional Formatting
- ที่ Condition 1 เลือก Formula Is
- ที่ช่องถัดมาคีย์ =Iserr(a1)
- คลิกปุ่ม Format > กำหนดสีของตัวอักษรเป็นสีพื้น > OK > OK
Re: สรุปข้อมูลจาก Database
Posted: Sat Mar 31, 2012 10:54 am
by joo
ขอบคุณครับท่านอาจารย์ลองตั้งนานที่แท้ใช้สูตรนี้นี่เอง
