Page 5 of 10

Re: Lookup ข้อมูล

Posted: Wed Jan 12, 2011 1:27 pm
by joo
ขอบคุณครับสำหรับคำแนะนำเข้าไปอ่านดูแล้วได้ความรู้เพิ่มมาอีกเยอะเลยครับ
อาจารย์ครับที่ D7 เงื่อนไขที่ว่าใส่รหัสอย่างเดียวก็ได้หรือเลือกจากรายการก็ได้ตรงนี้ผมทำได้แล้วครับ แต่ที่สงสัยคือว่า ถ้าเราเลือกจากรายการพอคลิกเลือกข้อมูลแล้ว รายการที่เลือกก็จะมาปรากฏที่ D7 เช่นแบบนี้ 10101 - JATU แต่ถ้าเลือกแล้วจะให้แสดงแค่ 10101 แบบนี้ได้ไหมครับ :D

Re: Lookup ข้อมูล

Posted: Wed Jan 12, 2011 1:48 pm
by snasui
:D ทำได้ด้วย VBA ครับ ปรับปรุงจาก Code เดิม เป็นตามด้านล่างครับ

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$D$11" Then
    Call ChangeCellValue
End If
If Target.Address = "$D$7" Then
    Target = Left(Target, 5)
End If
Application.EnableEvents = True
End Sub

Re: Lookup ข้อมูล

Posted: Fri Jan 14, 2011 6:34 am
by joo
ขอบคุณครับ ทดสอบแล้วได้ตามเงื่อนไขที่ต้องการแล้วครับ... :lol:

Re: Lookup ข้อมูล

Posted: Sun Jan 16, 2011 2:46 pm
by joo
อาจารย์ครับ…ผมต้องการล็อคทุกซีทไว้ให้ดูได้อย่างเดียว เช่น ที่ซีท"บันทึกการลา" ถูกล็อคเซลล์ไว้ไม่ให้มีการแก้ไข พอเราคีย์ข้อมูลที่ซีท Main เสร็จแล้วกดบันทึก มันจะขึ้น bug ที่บรรทัดนี้ครับ
rTarget.PasteSpecial xlPasteValues หรือ ที่ Sheet2 ซึ่งเป็นตาราง Pivotable มีการป้องกันซีทไว้ พอกดบันทึกที่ซีท Main ก็จะขึ้น Bug ที่บรรทัดนี้ครับ Sheets("Sheet2").PivotTables("PivotTable1").PivotCache.Refresh
สรุปว่าถ้าซีทต่างๆถูกป้องกันไว้เมื่อมีการเปลี่ยนแปลงข้อมูลจะไม่สามารถทำได้ตรงนี้จะปรับแก้ Code อย่างไรเงื่อนไข เมื่อมีการเพิ่มข้อมูลให้ซีทยกเลิกการป้องกันเพื่อรับข้อมูลแล้วจึงค่อยกลับมาล็อคเหมือนเดิม
และที่ D11 พบว่าถ้าเลือกการลาประเภทอื่นนอกจากพักร้อน แล้วคีย์วันที่ในD12,D13 เป็น พ.ศ.สามารถบันทึกข้อมูลได้ตรงนี้แก้ยังไงดีครับ :P
ผมลองแล้วไม่ได้เลยครับอาจารย์ช่วยดู Code ให้หน่อยครับ :D

Re: Lookup ข้อมูล

Posted: Sun Jan 16, 2011 2:58 pm
by snasui
:D หลักการ Lock และปลด Lock ควรจะทำการ Lock Worksheet ต่าง ๆ ด้วย Code ครับ และเมื่อคลิก Run Macro ให้เริ่มด้วยการปลด Lock ชีทต่าง ๆ ทั้งหมดก่อน เมื่อ Macro ทำงานเรียบร้อยก่อนจบด้วย End Sub ค่อย Lock ไว้เช่นเดิม

กรณีที่ Worksheet ที่ใช้เก็บข้อมูลมีการเปลี่ยนแปลงแล้วต้องการให้มีการ Refresh PivotTable ก็ต้องยกเลิกการป้องกัน Worksheet ทีมี PivotTable ไว้ก่อนด้วย ไม่เช่นนั้นก็จะเกิด Error ครับ

กรณีมีเซลล์ให้เลือกได้ด้วย Validation หากมีเซลล์อื่นอ้างอิงเซลล์นี้ด้วยสูตรหรือด้วย Code จะต้องทำการปลดเซลล์ปลายทางนั้นด้วย หากทำการ Lock ไว้จะเกิด Error ครับ

ส่วน Code ด้านล่างทำงานไม่ถูกต้องนะครับ

Code: Select all

If Year(Range("D12,D13")) < Year(Date) - 10 Or Year(Range("D12,D13")) > Year(Date) + 1 Then
ผมเขียนเป็นตัวอย่างไว้แล้วที่นี่ http://www.snasui.com/viewtopic.php?p=3626#p3626

Re: Lookup ข้อมูล

Posted: Mon Jan 17, 2011 8:21 am
by joo
อาจารย์ครับ...โค้ด Macro ที่ผมทำไว้ควรผูกไว้กับเหตุการณ์ไหนครับ ตัวอย่างโค้ดในไฟล์แนบก่อนหน้านี้ช่วยดูให้หน่อยครับรหัสปลดล็อคซีท 123 สำหรับโค้ดเช็ควันที่ใช้ได้ครับแต่เงื่อไขมันเปลี่ยนไปจากเดิมจึงทำให้แจ้งเตือนไม่ได้ช่วยดูในไฟล์แนบอีกทีครับ :mrgreen:

Re: Lookup ข้อมูล

Posted: Mon Jan 17, 2011 6:52 pm
by snasui
:D เนื่องจากผมไม่มีเวลาตรวจดูทุกชีทว่ามีสูตรเกี่ยวข้องกันไปมาอย่างไร การ Protect ชีทไว้จะมีผลกับกรณีที่มีสูตร Link กันไปมาครับ รวมทั้งการทำ Validation ด้วย ผมจะบอกหลักการสำหรับการ Unprotect ที่ผมคิดว่าน่าจะเป็น แล้วค่อยปรับกันไปเรื่อย ๆ ครับ

สิ่งที่คุณ Joo น่าจะทราบดีกว่าผมคือมีเซลล์ไหน ชีทไหนเชื่อมโยงกันบ้าง หากชีทต้นทางเปลี่ยนแล้วชีทปลายทางกระทบ หรือเซลล์ใดที่เชื่อมโยงกันบ้าง เมื่อเซลล์ต้นทางเปลี่ยนแล้วเซลล์ปลายทางกระทบ เช่นนี้จะต้องทำการ Unprotect ไปด้วยกันครับ

การ Unprotect ทีละหลาย ๆ ชีทก็แค่เพิ่ม Code ในการ Unprotect ทุกชีทที่ถูกกระทบกับการเปลี่ยนแปลงในสิ่งที่ต้องการทำปัจจุบันเข้าไปครับ

เช่นกำลังจะเปลี่ยนเซลล์ D5 ในชีท Main แต่เมื่อเปลี่ยนแล้วกระทบกับชีทข้อมูลบุคคล บันทึกการลา เราสามารถที่จะใช้ Code ในการ Unprotect ทุกชีทที่กล่าวมาเมื่อทำการเลือกเซลล์ D5 เมื่อเลือกแล้ว ดำเนินการต่าง ๆ จนครบตามต้องการแล้วก็ค่อย Protect ไว้ใหม่ครับ

สำหรับภาพด้านล่างเป็นการคำนวณแบบวน ควรแก้ไขเพื่อไม่ให้คำนวณวนครับ

Re: Lookup ข้อมูล

Posted: Mon Jan 17, 2011 10:51 pm
by joo
การปลดล็อคและล็อคซีทเพื่อเพิ่มข้อมูลทำได้แล้วครับ... :D ที่ ModUle1ผมใส่รหัสแบบนี้ครับ
....
If Sheets("Main").Range("E23") = False Then
Sheets("ºÑ¹·Ö¡¡ÒÃÅÒ").Select
ActiveSheet.Unprotect
rSource.Copy
rTarget.PasteSpecial xlPasteValues
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
MsgBox "ºÑ¹·Ö¡àÃÕºÃéÍÂáÅéÇ"
Sheets("Main").Range("D6:E6, D11:E13").ClearContents
Sheets("Sheet2").Select
ActiveSheet.Unprotect
Sheets("Sheet2").PivotTables("PivotTable1").PivotCache.Refresh
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Sheets("Main").Select
Sheets("Sheet1").PivotTables("PivotTable4").PivotCache.Refresh
Else
MsgBox "ÃÒ¡Ò÷Õè·èÒ¹¡ÓÅѧºÑ¹·Ö¡ÁÕã¹ÃкºáÅéÇ"
Exit Sub
End If
End Sub
แต่ถ้าซีทที่ป้องกันไว้ใส่รหัสล็อคด้วย เช่น 123 เวลาทำการปลดล็อคและล็อคกลับที่เดิมอยากให้ระบบใส่รหัส 123 ให้อัตโนมัติ ขอคำแนะนำต้องใส่โค้ดยังไงครับ
ที่ N27 สูตรอ้างอิงแบบวงกลมผมแก้แบบนี้ไม่ทาบว่าถูกต้องหรือไม่โดยเข้าไปตั้งการคำนวณซ้ำให้เป็น1

Re: Lookup ข้อมูล

Posted: Mon Jan 17, 2011 11:00 pm
by snasui
:lol: วิธีแก้การคำนวณวนไม่ใช่ไปแก้ค่าใน Options > Calculation ครับ จะต้องแก้สูตรไม่ให้วน นอกจากตั้งใจจะให้วนถึงจะแก้โดยเข้าไปกำหนดค่าที่ Options > Calculation ครับ

สำหรับ Code การ Protect และ Unprotect แบบมี Password ดูตัวอย่างที่ผมตอบไว้ที่นี่ครับ http://topicstock-tech.pantip.com/tech/ ... 910.html#6 :mrgreen:

Re: Lookup ข้อมูล

Posted: Tue Jan 18, 2011 7:12 am
by joo
ขอบคุณครับที่แนะนำ พอได้แนวทางผมนำมาประยุกต์ปรับปรุงนิดหน่อนตอนนี้สามารถใช้งานได้ตามที่ต้องการแล้วครับ :lol:

Re: Lookup ข้อมูล

Posted: Fri Jan 21, 2011 11:27 pm
by joo
อาจารย์ครับ...มีปัญหามารบกวนขอคำชี้แนะอีกแล้วครับคือว่า ที่ซีท “Main” ตรง D12,D13 ถ้าหากเราลาแบบเต็มวัน เช่นที่เซลล์ D12 คีย์วันที่ 20/01/2011 และที่ D13 คีย์วันที่ 20/01/2011 ที่เซลล์ D14 ก็จะแสดงเป็นเลข 1 แล้วถ้าหากว่าลาเพียงครึ่งวัน เช่นลาในวันที่ 21/01/2011 ตั้งแต่เวลา 12.30 ถึง 16.30 อยากให้ที่เซลล์D14 แสดงเป็น 0.5 แบบนี้ครับต้องทำยังไงครับ :P

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 12:14 am
by snasui
:mrgreen: โปรแกรมสำหรับการลางานปกติจะเพิ่มช่องให้เลือกว่าครึ่งวันหรือเต็มวันสำหรับกรณีที่เป็นการลาพักร้อนเพื่อจะได้ใช้เป็นเงื่อนไขให้คิดครึ่งวันครับ ส่วนลาป่วยอาจจะคิดกันเป็นรายชั่วโมง

การกรอกวันที่ ตามด้วยเวลา เช่น 22/01/2011 15:25 สามารถที่จะคิดเวลาเป็นวัน เป็นครึ่งวันได้ไม่ยาก แต่คงต้องระบุเพิ่มว่า กี่ชั่วโมงถือเป็นครึ่งวัน กี่ชั่วโมงถือเป็นเต็มวันครับ :mrgreen:

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 6:23 am
by joo
เงื่อนไขแบบนี้ครับ...
ระยะเวลา 8 ชั่วโมง เป็นเต็มวัน
ระยะเวลา 4 ชั่วโมง คือครึ่งวัน

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 7:13 am
by snasui
:D
joo wrote:อาจารย์ครับ...มีปัญหามารบกวนขอคำชี้แนะอีกแล้วครับคือว่า ที่ซีท “Main” ตรง D12,D13 ถ้าหากเราลาแบบเต็มวัน เช่นที่เซลล์ D12 คีย์วันที่ 20/01/2011 และที่ D13 คีย์วันที่ 20/01/2011 ที่เซลล์ D14 ก็จะแสดงเป็นเลข 1 แล้วถ้าหากว่าลาเพียงครึ่งวัน เช่นลาในวันที่ 21/01/2011 ตั้งแต่เวลา 12.30 ถึง 16.30 อยากให้ที่เซลล์D14 แสดงเป็น 0.5 แบบนี้ครับต้องทำยังไงครับ :P
joo wrote:เงื่อนไขแบบนี้ครับ...
ระยะเวลา 8 ชั่วโมง เป็นเต็มวัน
ระยะเวลา 4 ชั่วโมง คือครึ่งวัน
:D ถ้าหากมีการกรอกวันที่ตามด้วยเวลา ลองตามนี้ครับเซลล์ D14 คีย์

=Hour(D13-D12)/8

Enter :mrgreen:

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 1:41 pm
by joo
- ที่ซีท Main ทดลองดูที่เซลล์อื่นแล้วมันแสดงค่าได้จริงอยู่ แต่ว่าที่ D14 มันมีเงื่อนไขคำนวณวันแบบไม่นับวันเสาร์อาทิตย์อยู่ลองคีย์แบบใส่เวลาต่อท้ายที่ D12,D13 มันก็คำนวณไม่ได้ ยิ่งถ้าคลิกเลือกที่ปฏิทินแล้วจะกำหนดเวลาอย่างไรครับ :mrgreen:
- ที่ซีท Report1 ช่วง I17:I35 ค่าที่ลิงค์มาแสดงไม่ตรงรบกวนอาจารย์ช่วยดูสูตรให้หน่อยครับ :mrgreen:

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 2:09 pm
by snasui
:D ทีละคำถามก่อนนะครับ ปัจจุบันค่าที่คีย์มาแล้วนั้น

D12 คือ 21/6/2010 8:00:00
D13 คือ 22/6/2010 16:00:00

ต้องการได้คำตอบที่ D14 เป็นค่าใด ด้วยวิธีคิดอย่างไรครับ จะได้คำนวณเปรียบเทียบได้ :mrgreen:

Re: Lookup ข้อมูล

Posted: Sat Jan 22, 2011 8:40 pm
by joo
ปกติค่าที่ D12,D13 จะคีย์วันที่แบบนี้ 20/01/2011 หรือเรียกจากปฏิทิน ที่ D14 ก็จะแสดงจำนวนวันให้เลย เช่นที่ D12 คีย์ 20/01/2011,D13 คีย์ 20/01/2011 ค่าที่แสดงใน D14 คือ 1 วัน(8 ชั่วโมง๗
ที่นี้ถ้าเงื่อนไขต้องการลาครึ่งวัน(ชั่วโมง)ที่ D12 ก็จะคีย์เป็น 21/01/2011, D13 คีย์ 21/01/2011 ที่ D14 ต้องการให้แสดง 0.5 วัน ผมลองทำแบบนี้ใส่เงื่อนไขไว้ถ้า D15 = ครึ่งวัน ก็ให้แสดง D14 = 0.5 ถ้าไม่ใช้ก็ให้แสดงค่าการคำนวณตามปกติ
ที่ D14 คีย์ =IF(D12="","",IF(D13="","",IF(D15="ครึ่งวัน",0.5,SUMPRODUCT(--(WEEKDAY(ROW(INDIRECT(D12&":"&D13)),2)<6))))) ค่าที่แสดงออกมาให้ก็พอใช้ได้ครับ :mrgreen:

Re: Lookup ข้อมูล

Posted: Sun Jan 23, 2011 8:30 am
by joo
อาจารย์ครับ...ช่วยดูสูตรที่ Report1ให้ด้วยนะครับ ที่เซลล์ I17:I35 ค่าที่ลิงค์มาไม่ตรงครับมันจะลิงค์มาเฉพาะปี2553 แต่ค่าของปีอื่นๆ มันจะมองไม่เห็นครับ สูตรที่ผมทำไว้แบบนี้ครับ =IF(C17="","",VLOOKUP(C17,Report!$C$7:$H$1440,4,0))ต้องปรับแก้อย่างไรดีครับ :P

Re: Lookup ข้อมูล

Posted: Sun Jan 23, 2011 10:24 am
by snasui
:D เนื่องจาก Vlookup ที่ใช้นั้นสามารถดึงข้อมูลมาเพียงเงื่อนไขเดียวโดยไม่ได้ดูเงื่อนไขที่เป็นปี จึงทำให้ค่าที่ได้ไม่ถูกต้อง จะต้องปรับให้เป็นสูตรที่ดึงได้หลายเงื่อนไข เช่น Index, Match ซึ่งใช้แบบ Array หรือ Lookup แบบที่ผมทำตัวอย่างมา นอกจากนี้ได้เพิ่มคอลัมน์ช่วยเพื่อแสดงปีให้กับข้อมูลที่ได้จากการ PivotTable ด้วย โดยมีวิธีการดังนี้

1. ที่ชีท Report เซลล์ I7 คีย์สูตรเพื่อ List ค่าปีมาแสดง

=LOOKUP(9.99999999999999E+307,B$7:B7)

2. ที่ชีท Report1 เซลล์ I6 คีย์สูตรเพื่อหาจำนวนวันลาตามแต่ละปี

=IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))

ดูไฟล์แนบประกอบครับ

Re: Lookup ข้อมูล

Posted: Mon Jan 24, 2011 7:57 am
by joo
อาจารย์ครับ...ช่วยอธิบาย 3 สูตรนี้ให้หน่อยครับมันทำงานยังไงครับจะได้นำไปประยุกต์ใช้ต่อได้ถูก
1. =LOOKUP(9.99999999999999E+307,B$7:B7)
2. =IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))
3.=INDEX(Report1!$D$6:$D$30,MATCH(1,IF(Report1!$C$6:$C$30=C23,IF(Report1!$B$6:$B$30=B23,1)),0))
แล้วการใช้สูตรที่ดึงข้อมูลได้หลายเงื่อนไข เช่น Index, Match ซึ่งใช้แบบ Array หรือ Lookup มันแตกต่างกันอย่างไรตัวไหนทำงานได้เร็วและประหยัดทรัพยากรกว่ากันเมื่อข้อมูลมีปริมารเพิ่มมากขึ้น :D
ขอบคุณครับ