Page 1 of 2

ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 2:09 pm
by wisit
รบกวนช่วยหาวิธีที่ทำให้ไฟล์งานทำงานเร็วขึ้น เนื่องจากผมมีไฟล์งานที่มีชีทอยู่ประมาณ 15 ชีท แต่ละชีทอาจมีการคำนวณข้ามชีท และมีการใช้สูตรที่เป็นอเรย์ และมีการใช้แมโคร ประเภท Check Box และมีการใช้ล็อกคอลัมน์ แต่ผมได้เอาเครื่องหมาย $ ออกแล้ว (แต่ไม่รู้ว่าจะมีผลต่อสูตรหรือเปล่า เพราะไม่ได้เช็คทั้งหมด) มันก็ทำงานเร็วขึ้น แต่พอมีวิธีที่ทำให้เร็วขึ้นกว่านี้ไหมครับ เพราะต้องรอประมาณ 15-30 นาที

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 2:32 pm
by bank9597
:D การเพิ่มความเร็วในการทำงานของโปรแกรม ส่วนแรกจะอยู่ที่ทรัพยากรคอมพิวเตอร์ของเรา เช่น หน่วยประมวล(CPU) หน่วยความจำ(RAM) ฮาร์ดดิส(Storage) วึ่งส่วนนี้จะเป็นพื้นฐานครับ

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

วิธีแก้ไข จะต้องแยกส่วนต่างๆออกมาอย่างชัดเจน เช่น ส่วนที่ใช้ทำงาน(Form) ส่วนเก็บข้อมูล(Database) ส่วนที่เป็นที่แสดงผล (Report) ไม่ใช่แยกชีท แต่หมายถึงการแยกไฟล์ออกมา แต่ถึงกระนั้นก็จะต้องเพิ่มความซับซ้อนของสูตรไปอีก แต่ก็ทำให้การทำงานไม่ช้าอย่างที่เป็นอยู่ครับ :D

ปล. คำแนะนำนี้ได้รับมากจากอาจารย์อีกทอดหนึ่งครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 3:18 pm
by wisit
:D ขอบคุณ คุณ Bank 9597 มากครับที่ช่วยให้คำแนะนำ แต่งานผมถ้าแยกไฟล์ออกจะทำให้ทำงานยุ่งยาก พอดีเคยอ่านคำแนะนำของท่านอาจารย์คนควน (แต่ลืมแล้วว่าทำยังไง) เช่น ให้ลบเซลล์ Column และ Row แต่ผมลองลบแล้วมันไม่หาย (เลือกเซลล์ที่ต้องการลบแล้วคลิกขวา เลือก Delete) ไม่รู้ต้องทำยังไงดีครับ และพอมีวิธีที่จะทำให้ไฟล์ทำงานเร็วขึ้นโดยไม่แยกไฟล์ไหมครับ รบกวนช่วยด้วยครับ เพราะโปรแกรมทำงานช้ามาก จากที่ช้าอยู่แล้ว มันยิ่งช้ามากเป็นเท่าตัวครับ :flw:

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 3:44 pm
by bank9597
:D ลองดูที่ข้อมูลน่ะครับ ผมคิดว่าเรื่องสูตรที่เราใส่ไปแล้ว ไม่สามารถจะแก้ไขอะไรได้แล้วครับ เพราะมันทำงานไปตามปกติของมัน
ผมจึงอยากให้ลองดูที่ตัวข้อมูลที่เก็บอยู่ในไฟลล์ครับ หากคิดว่ามากเกินไปลองแบ็คอัพไปเก็บไว้ก่อน แล้วลองประมวลผลกับจำนวนข้อมูลที่ไม่มากเกิน ลองดูว่าจะเร็วเพิ่มขึ้นหรือไม่ครับ ส่วนวิธีการอื่น ผมยังไม่ทราบเหมือนกัน ต้องรอให้อาจารย์มาแนะนำอีกครั้งน่ะครับ :D

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 4:10 pm
by snasui
:D คงต้องทราบว่าสูตรที่ใช้เป็นสูตรใดบ้างและมีจำนวนมากขนาดไหน นอกจากนี้มี Object ใด ๆ ที่เกินความจำเป็นจำนวนมากหรือไม่ มีชื่อหรือ Range Name เกินความจำเป็นหรือไม่ มี Style เกินความจำเป็นหรือไม่ เป็นต้น และปกติการคำนวณข้ามไฟล์จะช้ากว่าข้ามชีทครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 4:15 pm
by bank9597
:D การใช้สูตรข้ามไฟล์ช้ากว่าเหรอเนี่ย อิอิ

:D คงต้องอยู่ที่การแบ็คอัพข้อมูลแล้วล่ะครับ ว่าจะบ่อยแค่ไหน :D

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 5:41 pm
by wisit
สูตรของผมจะมีสูตรดังนี้ครับ
1. =LOOKUP(CHAR(255),A$3:A3) อยู่ในคอลัมน์ AF แทนจำนวนแถวประมาณ
2. =LOOKUP(CHAR(255),B$3:B3) อยู่ในคอลัมน์ AE
3. =AF3&C3, =AF3&F3, =AF3&F3, =AF3&I3, =AF3&O3 (อาจารย์คนควนแนะนำ) :mrgreen:
4. =AE3&C3, =AE3&F3, =AE3&F3, =AE3&I3, =AE3&O3
มีจำนวนทั้งหมวด 3,500 แถว (ไม่ทราบว่าเป็นเพราะสูตรนี้หรือเปล่าครับ เพราะผมลองสังเกต เมื่อเปลี่ยนค่า ตรงคอลัมน์ A หรือ คอลัมน์ ฺB เช่น ลบจากชื่อนาย ก เป็น นาย ข ต้องใช้เวลาในการรอนานมาก หรือเปลี่ยนตัวเลขจากข้อมูลที่คีย์มันจะช้า เพราะต้องรอคำนวณสูตรในข้อ 3 และข้อ 4 ครับ ผมอาจคิดไปเองหรือเปล่าไม่รู้ครับ)
5. =SUMIF($AF$3:$AF$15036,AH3,$D$3:$D$15036) ซึ่ง AH จะเซลล์ที่มีการเปลี่ยนแปลงตามรายชื่อ กล่าวคือ นาย ก แทนด้วยเซลล์ AH นาย ข แทนด้วยเซลล์ AG3 และนาย ค แทนด้วยเซลล์ AI และนาย ง,.....จนถึงนาย ญ ประมาณ 10-11 คน
6. = sum()ข้ามชีท
7. =$B306*SUMIF(ป้อนข้อมูล!$Z$3:$Z$1998,F$305&$A306,ป้อนข้อมูล!$D$3:$D$1998) อยู่ประมาณ 210 คอลัมน์ 3,200 แถว (อาจารย์คนควนแนะนำ) :mrgreen:
8. ใช้แมโคร ประเภท Check Box อีก 3,200 ช่อง
9. =IF(ROWS($I$2:I6)>$G$1,"",INDEX(ฐานข้อมูลใบประหน้า!$M$35:$M$41,SMALL(IF(ฐานข้อมูลใบประหน้า!$J$35:$J$41="พิมพ์",ROW(ฐานข้อมูลใบประหน้า!$M$35:$M$41)-ROW(ฐานข้อมูลใบประหน้า!$M$35)+1),ROWS($I$2:I6)))) (ประยุกต์มาจากอาจารย์คนควน) :tt: อยู่ประมาณ 50 คอลัมน์ 100 แถว
10. แทนค่าในเซลล์ข้ามชีท เช่น = ป้อนข้อมูล!A3
11. =COUNTIF
12. =IF
พอมีวิธีที่จะทำให้ทำงานได้เร็วขึ้นไหมครับ ซึ่งอาจารย์เคยโพสลงในกระทู้พันทิพย์ หรือกระทู้ใน Forum ไม่ทราบครับ ผมเคยอ่าน แต่จำไม่ได้ว่าในกระทู้ไหน โดยอาจารย์แนะนำให้ตัดค่า $ (ซึ่งผมตัดแล้ว มันก็ทำให้เร็วขึ้นนิดหนึ่ง แต่ไม่รู้จะมีผลต่อสูตร หรือค่าที่คำนวณหรือเปล่าครับ) และอาจารย์ยังแนะนำให้ลบเซลล์คอลัมน์ หรือแถวที่ไม่ได้ใช้ออก (ไม่แน่ใจ ว่าผมจำถูกหรือเปล่า) (ซึ่งผลลบแล้วแต่มันไม่ได้ ไม่รู้ทำผิดวิธีหรือเปล่า) และอาจารย์ยังแนะนำอีกหลายวิธี ซึ่งผมจำไม่ได้แล้ว และหากระทู้ดังกล่าวไม่เจอครับ รบกวนอาจารย์ ช่วยแนะนำหน่อยครับ และขอบคุณ คุณ Bank 9597 มากครับที่ช่วยให้คำแนะนำ
หมายเหตุ: สูตรหรือวิธีทำจะได้รับคำแนะนำจากท่านอาจารย์คนควนเป็นส่วนมาก ต้องขอบคุณท่านอาจารย์เป็นอย่างสูงครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 5:52 pm
by snasui
wisit wrote:9. =IF(ROWS($I$2:I6)>$G$1,"",INDEX(ฐานข้อมูลใบประหน้า!$M$35:$M$41,SMALL(IF(ฐานข้อมูลใบประหน้า!$J$35:$J$41="พิมพ์",ROW(ฐานข้อมูลใบประหน้า!$M$35:$M$41)-ROW(ฐานข้อมูลใบประหน้า!$M$35)+1),ROWS($I$2:I6)))) (ประยุกต์มาจากอาจารย์คนควน) อยู่ประมาณ 50 คอลัมน์ 100 แถว
สูตรนี้แหละครับที่ทำให้ช้า จะต้องหาวิธีการจัดการใหม่ ลองส่งไฟล์ตัวอย่างมาครับ
wisit wrote:พอมีวิธีที่จะทำให้ทำงานได้เร็วขึ้นไหมครับ ซึ่งอาจารย์เคยโพสลงในกระทู้พันทิพย์ หรือกระทู้ใน Forum ไม่ทราบครับ ผมเคยอ่าน แต่จำไม่ได้ว่าในกระทู้ไหน โดยอาจารย์แนะนำให้ตัดค่า $ (ซึ่งผมตัดแล้ว มันก็ทำให้เร็วขึ้นนิดหนึ่ง แต่ไม่รู้จะมีผลต่อสูตร หรือค่าที่คำนวณหรือเปล่าครับ) และอาจารย์ยังแนะนำให้ลบเซลล์คอลัมน์ หรือแถวที่ไม่ได้ใช้ออก (ไม่แน่ใจ ว่าผมจำถูกหรือเปล่า)
จำผิดแน่นอนครับ การตัดตัว $ ไม่ได้ช่วยให้เร็วขึ้นแต่อย่างใดครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 10:18 pm
by wisit
อาจารย์ครับ ผมได้แนบไฟล์ตัวอย่างมาให้อาจารย์ช่วยแนะนำให้เร็วขึ้นหน่อยครับ ซึ่งไฟล์ที่ผมแนบมาใช้เพื่อตรวจผลว่ามีลูกค้าสั่งซื้อสินค้ารหัสนี้เป็นใคร (เช่น เล็ก ซึ่งมีลูกค้าประมาณ 30-40 คน ผมได้กำหนดลูกค้าให้เป็น 1L จนถึง 40L เป็นต้น) (อาจารย์ครับ เมื่อผมนำไฟล์งานที่เพื่อนคีย์ มาก๊อปปี้ลงในไฟล์็ตัวอย่างนี้ ในชีทป้อนข้อมูล มันจะรอประมาณ 15-30 นาที ถ้าเป็นโน้ดบุ๊คก็ประมาณนี้เช่นกัน ไม่ต่างกันมากครับ) รบกวนช่วยชี้แนะด้วยครับ :mrgreen:

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 10:20 pm
by snasui
:D ไม่พบไฟล์แนบครับ หากไฟล์มีขนาดใหญ่เกินกว่า 300KB ให้ทำการ Zip ไฟล์ก่อนครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 10:32 pm
by wisit
อาจารย์ครับ Furum ฟ้องว่าไฟล์มีขนาดใหญ่เกินไปครับ ผมซิพไฟล์แล้ว แต่ไฟล์มีขนาด 3.57 MB ครับ จึงแนบไฟล์ไม่ได้ครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Mon Dec 19, 2011 10:38 pm
by snasui
:o ให้ตัดมาเป็นตัวอย่างก็พอครับ ไม่ต้องส่งไฟล์จริงมาแต่อย่างใด จะลองปรับสูตร Array ตามที่ผมเขียนแจ้งไปในความเห็นก่อนหน้านี้ดูก่อนครับ :P

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 3:10 am
by wisit
อาจารย์ครับ ผมได้ลองลบสูตร
=$B306*SUMIF(ป้อนข้อมูล!$Z$3:$Z$1998,F$305&$A306,ป้อนข้อมูล!$D$3:$D$1998) ซึ่งมีอยู่ประมาณ 210 คอลัมน์ 3,200 แถว ลงเหลือ 3 คอลัมน์ ไฟล์มันจะมีขนาดเล็กลง และการก๊อปปี้จากไฟล์ที่เพื่อน ๆ คีย์ จะรอประมาณ 5-7 นาที แต่ถ้าให้สูตรมีประมาณ 210 คอลัมน์ 3,200 แถว เหมือนเดิม ไฟล์จะมีขนาดใหญ่กว่าที่ลดเหลือ 3 คอลัมน์ประมาณ12 เท่า และเมื่อก๊อปปี้จากไฟล์ที่เพื่อน ๆ คีย์ จะรอประมาณ 15-30 นาที แต่ผมมีความจำเป็นต้องใช้ทั้งหมด 210 คอลัมน์ 3,200 แถว ผมได้แนบไฟล์ตัวอย่างที่ผมได้ทำการลบเหลือ 3 คอลัมน์ ในรูปของไฟล์ซิพครับ รบกวนอาจารย์ช่วยแนะนำด้วยครับ :mrgreen:

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 3:52 am
by wisit
ต้องขอโทษด้วยครับอาจารย์ :mrgreen: ไฟล์ที่ซิพมีขนาดใหญ่เกิน 300K ผมดูผิดครับอาจารย์ :tt: ถ้าผมลบเซลล์ดังกล่าวแล้วจะทำให้งานทำเร็วขึ้นมากครับ ซึ่งอาจารย์พอจะแนะนำสูตรที่ทำให้ทำงานเร็วกว่าสูตร :roll:
=$B306*SUMIF(ป้อนข้อมูล!$Z$3:$Z$1998,F$305&$A306,ป้อนข้อมูล!$D$3:$D$1998)
ผมได้แนบไฟล์ตัวอย่างที่อาจารย์เกี่ยวกับสูตรข้างต้นครับ (เป็นไฟล์คนละไฟล์นะครับ)

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 7:35 am
by snasui
:D ในบรรดาสูตรหาข้อมูลโดยมีเงื่อนไข ไม่มีสูตรใดทำงานเร็วไปกว่า Sumif, Countif ครับ และจากไฟล์ที่แนบมาก็เป็นสูตรดีแล้ว กรณีใช้เป็นจำนวนมากไม่ว่าสูตรใดก็ตามทำให้ไฟล์ทำงานช้าได้ทั้งนั้นครับ

แทนที่จะใช้สูตรแสดงรายงานจำนวนมากขนาดนี้ควรแสดงรายงานด้วย PivotTable หรือใช้สูตรให้สามารถเรียกดูเป็นรายบุคคลแทนการแสดงออกมาทั้งหมดพร้อมกันทีเดียวจะดีกว่าครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 1:00 pm
by wisit
:D ขอบคุณครับอาจารย์ ผมลืมคิดไปเลยว่า หากแสดงเป็นรายบุคคลก็จะทำให้สามารถทำงานได้เร็วขึ้น (มั่วแต่คิดจะทำให้เร็วเลยลืมวิธีที่ง่าย ๆ เช่นนี้) ต้องขอบคุณอาจารย์มากครับที่กรุณาให้คำแนะนำที่ดี ๆ :D

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 2:46 pm
by wisit
อาจารย์ครับ จากไฟล์ตัวอย่างที่แนบมา ถ้าหากว่าผมต้องการที่จะเปลี่ยนจากใช้แมโคร ประเภท Check Box มาเป็นกรอกตัวเลขแทน พอจะใช้วิธีการใดได้บ้างครับ ซึ่ง Check Box ของผมจะแบ่งเป็น 5 ประเภท ตามลักษณะของรหัสที่กรอกแต่ละคอลัมน์ครับ

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 3:26 pm
by snasui
:D ที่กำหนดมานั้นก็ไม่ได้เป็น Macro ครับ แค่นำ Check Box มาใช้เท่านั้น หากไม่ต้องการใช้วิธีนี้ก็สามารถคีย์ตัวเลขเรียงไว้แล้วอีกคอลัมน์มีปุ่มให้เลือกว่าเป็นเลข 1 หรือ 0 ถ้า 1 ก็คือใช้ ถ้า 0 ก็คือไม่ใช้ หรือไม่ดึงข้อมูลมาแสดง เช่นนี้เป็นต้น

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 3:37 pm
by wisit
อาจารย์ครับ ผมอาจจะสื่อสารผิดไปนิดหนึ่งครับ :lol: คือ ถ้้าหากผมลบ Check Box ออก แล้วพอมีวิธีที่จะทำให้ทราบว่า นายรุ่งโรจน์ นายสมนึก หรือนายพงษ์ศักดิ์ ขายสินค้ารหัสใดได้จำนวนเท่าใด โดยเราแค่คีย์รหัสที่ต้องการทราบ เช่น เราคีย์รหัส 09 เข้าไป โปรแกรมก็จะคำนวณว่า นายรุ่งโรจน์ นายสมนึก หรือนายพงษ์ศักดิ์ ขายสินค้ารหัส 09 ได้จำนวนเท่านี้ เป็นต้น ถ้าหากใช้ Check Box ติ๊ก ก็จะได้ผลเช่นกัน แต่เพื่อความสะดวกเพราะ Check Box มีจำนวนรหัสมาก และตัวเล็กต้องคอยหา ผมจึงอยากได้วิธีที่ทำให้เราคีย์ตัวเลขลงไป แล้วสามารถบอกได้ว่า นายรุ่งโรจน์ นายสมนึก หรือนายพงษ์ศักดิ์ ขายสินค้ารหัสนี้ รหัสนั้นได้จำนวนเท่าใดครับ รบกวนอาจารย์ช่วยแนะนำด้วยครับ :D

Re: ทำให้โปรแกรมทำงานเร็วขึ้น

Posted: Wed Dec 21, 2011 3:39 pm
by snasui
:D ออกแบบรายงานที่ต้องการและแนบมาก่อนดีกว่าครับ การอธิบายโดยไม่มีตำแหน่งอ้างอิงจะเข้าใจได้ยากครับ