Page 1 of 2
การล๊อคชีท
Posted: Fri Oct 21, 2011 1:55 pm
by bank9597

อาจารย์ครับ เข้าใจว่าชีทต่างๆ เราสามารถซ่อนได้ แต่ผมไม่มั่นใจว่าสามารถที่จะล๊อคได้ไหม
เช่น ชีทที่เก็บข้อมูลสำคัญ เช่น ชีทเก็บข้อมูลรายการสั่งซื้อ เป็นต้น เราสามารถล๊อคไว้ได้ไหม โดยที่ไม่ให้ผู้ใช้สามารถเปิดดูและแก้ัไขได้ เว้นแต่เราจะอนุญาต
และถ้ามันล็อคได้จริง สมมุติเวลาเราต้องดึงข้อมูลจากชีทที่ล็อคไว้มาแก้ไขด้วยมาโครที่เราสร้างไว้ มันจะยอมให้ดึงข้อมูลมาแก้ไขไหมครับอาจารย์
untitled.JPG
Re: การล๊อคชีท
Posted: Fri Oct 21, 2011 3:10 pm
by snasui
bank9597 wrote:ชีทต่างๆ เราสามารถซ่อนได้ แต่ผมไม่มั่นใจว่าสามารถที่จะล๊อคได้ไหม
เช่น ชีทที่เก็บข้อมูลสำคัญ เช่น ชีทเก็บข้อมูลรายการสั่งซื้อ เป็นต้น เราสามารถล๊อคไว้ได้ไหม โดยที่ไม่ให้ผู้ใช้สามารถเปิดดูและแก้ัไขได้ เว้นแต่เราจะอนุญาต

เราสามารถซ่อนชีทไว้ก่อนแล้วเข้าเมนู Review > Protect Workbook > ระบุรหัสที่ต้องการ
User ก็ไม่สามารถมองเห็นไม่สามารถยกเลิกการซ่อนได้แล้วครับ ยกเว้นว่าจะมีรหัสเพื่อยกเลิกการซ่อน กรณีเราต้องการเขียน VBA เพื่อนำค่ามาใช้ก็สามารถทำได้ปกติครับ
Re: การล๊อคชีท
Posted: Fri Oct 21, 2011 4:24 pm
by bank9597
ได้แล้วครับ ขอบคุณครับ
ว่าแต่ Excel 2007 เวอร์ชั่นไทย มันหายากเอาเรื่องเหมือนกัน

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 9:05 pm
by bank9597

ผมล๊อคชีทตามที่อาจารย์บอกแล้ว แต่พอทดสอบทำใบสั่งซื้อ แล้วกดบันทึกข้อมูล กลายเป็นว่าบันทึกไม่ได้ มันติด Debug
ผมจึงปลดล็อคออกมา มันก็ทำงานเป็นปกติ
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 9:27 pm
by snasui

การ Protect Sheet กับ Protect Workbook ไม่เหมือนกันนะครับ
ถ้า Protect Sheet เอาไว้ก็ย่อมที่จะบันทึกใน Sheet ที่ Protect ไว้ไม่ได้ครับ
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 9:53 pm
by bank9597

แสดงว่าผมทำผิดวิธีการ รบกวนอาจารย์แนะนำอีกครั้งได้ไหมครับ ของผมเป็น Excel 2007 ภาษาไทย
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 10:10 pm
by snasui

อยู่ที่เมนู ตรวจทาน > ป้องกันสมุดงานครับ ถ้าเป็นไปได้ให้ใช้เมนูภาษาอังกฤษ เพราะผมไม่สะดวกตอบเป็นเมนูภาษาไทยครับ

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 10:33 pm
by bank9597

ครับผม เดี๋ยวผมจะพยายามในเรื่องนี้อีกทีนึงครับ
ส่วนการป้องกันชีทที่อาจารย์แนะนำมา ผมได้ทำตามที่อาจารย์แนะนำแล้วครับ แต่มันติด Debug ตอนบันทึกข้อมูลไปยัง Datastore (ผมซ่อนและป้องกัน Datastore ไว้ครับ) ยังไงผมจะลองศึกษาดูอีกทีครับ อาจจะไม่ตรงกับที่อาจารย์แนะมาทั้งหมดก้ได้ครับ

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 10:37 pm
by snasui

ทำไมถึงติดกับการป้องกันชีทครับ ผมมิได้แนะนำให้ป้องกันชีทแต่ประการใดครับ อ่านซ้ำอีกครั้งหนึ่ง

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:04 pm
by bank9597

ผมงงอยู่อ่ะครับอาจารย์ อิอิ
คือว่าผมต้องการซ่อนชีท Datastore ไว้ ไม่ให้ใครเห็น ผมเลยทำการซ่อนชีทไว้ แล้วไปที่ ตรวจทาน==>ป้องกันสมุดงาน==> ป้องกันโครงสร้างและวินโดว์ ผมทำอย่างนี้ ชีทก็ถูกซ่อนไว้และไม่สามารถเปิดชีทดูได้ถ้าไม่มีรหัสผ่าน
แล้วผมก็มาลองทำรายการสั่งซื้อดู แล้วบันทึกรายการ มันก็ติด Debug อย่างที่กล่าวไ้ข้างต้น ถ้าไม่ผิดเหมือนมันจะฟ้องว่า การบันทึกไปยังชีท Datastore ล้มเหลว
ทั้งหมดก็ประมาณนี้อ่ะครับ แต่ถ้ายังไงมันลำบากเกินไป ก็ไม่เป็นไรครับ ผมแค่ป้องกันการลบและแก้ไขข้อมูลก็พอครับ ไม่จำเป็นต้องซ่อนก้ได้

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:17 pm
by snasui

สำหรับที่ถามมานั้นไม่ใช่เรื่องลำบากครับ
สิ่งที่ต้องทราบและสื่อสารให้ถูกต้องคือ
- ป้องกันแผ่นงานคือป้องกันชีทไม่ให้แก้ไขเซลล์ แทรก ลบข้อมูล ฯลฯ ป้องกันสมุดงานคือป้องกันไฟล์ ไม่ให้ซ่อนชีท ยกเลิกการซ่อนชีท ลบชีท เป็นต้น ระวังอย่าใช้สับกันเพราะจะทำให้ผมตอบตามที่เขียนถาม
- การป้องกันการแก้ไขชีทที่ซ่อนไว้ก็ต้องเขียน Code ให้ยกเลิกการป้องกันก่อนเสมอ (แม้ไม่ซ่อนถ้ามีการป้องกันไว้ก็ต้องยกการป้องกันก่อนเสมอ) หากมีการแก้ไขปรับปรุง เปลี่ยนแปลง เพิ่มเติมข้อมูล ไม่งั้นก็ไม่สามารถที่จะแก้ไข ปรับปรุง เปลี่ยนแปลง เพิ่มเติมข้อมูลได้
ถ้าได้ทำถูกต้องอย่างที่ผมเขียนมาแล้วลองส่งไฟล์ที่มีปัญหานั้นมาครับ จะได้ช่วยตรวจสอบให้ได้
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:30 pm
by bank9597

อิอิ ผมพอจะเข้าใจแล้วครับอาจารย์
งั้นก็ต้องแก้ไขที่โค๊ดดังที่อาจารย์บอกครับ คือว่า ฟอร์มใบสั่งซื้อผมป้องกันแผ่นงานไว้ ตอนเขียนโค๊ดสั่งให้บันทึกข้อมูล ก็ต้องมีโค๊ดปลดล๊อคและล๊อคตามเดิม ดังโค๊ดด้านล่างนี้
Code: Select all
Sub Button7_Click()
Dim msg As Integer
msg = MsgBox("¤Ø³µéͧ¡Òúѹ·Ö¡ÃÒ¡ÒÃãªèËÃ×ÍäÁè?", vbYesNo)
If msg = vbYes Then
ActiveSheet.Unprotect Password:="240130" '<==UnProtect
If Range("A17") <> "" Then
Sheets("Temp").Select
Range("A2:J61").Resize(Range("K1"), 10).Select
Selection.Copy
Sheets("DataStore").Select
Range("Target").Select
Selection.PasteSpecial xlPasteValues
Sheets("PurchaseOrder").Select
Range("B17:I76,L3,G7,C13,B7").SpecialCells(xlCellTypeConstants).ClearContents
MsgBox ("ºÑ¹·Ö¡¢éÍÁÙºàÃÕºÃéÍÂáÅéÇ")
Else
MsgBox ("¤Ø³ÂѧäÁèàÅ×Í¡ÊÔ¹¤éÒ")
Range("A17").Activate
End If
ActiveSheet.Protect Password:="240130" '<== Protect Again
End If
End Sub
โค๊ดด้านบนสั่งบันทึกมายัง Datastore ซึ่งDatastore ไม่ได้มีการป้องกันแผ่นงานแต่อย่างใด
แต่เมื่อผมซ่อนชีท Datastore และล๊อคไว้ด้วย ผมควรจะแก้ไขโค๊ดด้านบนอย่างไรครับ โดยให้ปลดล็อคตอนขัมมูลมาบันทึก และจะล็อคใหม่เมื่อบันทึกข้อมูลเสร็จแล้ว
อีกนิดน่ะครับ ถ้าเราป้องกันแผ่นงานแล้ว ก็ไม่จำเป็นต้องซ่อนใช่ไหมครับ

Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:38 pm
by snasui

ลองปรับ Code เป็นตามด้านล่าง ถ้ายังไม่ได้ส่ง
ตัวอย่างไฟล์มาครับ
Code: Select all
Sub Button7_Click()
Dim msg As Integer
msg = MsgBox("¤Ø³µéͧ¡Òúѹ·Ö¡ÃÒ¡ÒÃãªèËÃ×ÍäÁè?", vbYesNo)
If msg = vbYes Then
ActiveSheet.Unprotect Password:="240130" '<==UnProtect
If Range("A17") <> "" Then
Sheets("Temp").Range("A2:J61").Resize(Range("K1"), 10).Copy
Sheets("DataStore").Range("Target").PasteSpecial xlPasteValues
Sheets("PurchaseOrder").Range("B17:I76,L3,G7,C13,B7") _
.SpecialCells(xlCellTypeConstants).ClearContents
MsgBox ("ºÑ¹·Ö¡¢éÍÁÙºàÃÕºÃéÍÂáÅéÇ")
Else
MsgBox ("¤Ø³ÂѧäÁèàÅ×Í¡ÊÔ¹¤éÒ")
Range("A17").Activate
End If
ActiveSheet.Protect Password:="240130" '<== Protect Again
End If
End Sub
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:55 pm
by snasui
bank9597 wrote:อีกนิดน่ะครับ ถ้าเราป้องกันแผ่นงานแล้ว ก็ไม่จำเป็นต้องซ่อนใช่ไหมครับ
ความจำเป็นอยู่ที่ว่าต้องการให้เห็นหรือไม่ครับ ถ้าไม่ต้องการให้เห็นก็จำเป็นต้องซ่อนครับ
Re: การล๊อคชีท
Posted: Sat Oct 22, 2011 11:57 pm
by bank9597

ยังติด Debug ครับ
ผมส่งไฟล์แนบมาให้ครับ (ขออภัยด้วยน่ะครับ พอดีชีทค่อนข้างเยอะแล้ว อาจจะสับสนหน่อย)
ชีท Purchase Order เป็นฟอร์มสั่งซื้อครับ
ส่วนในชีท Datastore ตอนนี้ผมป้องกันแผ่นงานไว้น่ะครับ
Re: การล๊อคชีท
Posted: Sun Oct 23, 2011 12:18 am
by snasui

Password ที่ป้องกันแผ่นงานคืออะไรครับ
ตอนนี้สิ่งที่เป็นปัญหาไม่ได้เกี่ยวกับการซ่อนชีท DataStore แต่เป็นปัญหาหลายจุด เช่น
- ชีท Temp ไม่ได้เตรียมข้อมูลไว้สำหรับการบันทึก K1 มีค่าเป็น 0 ทำให้ Error
- กรณีชีท Temp ไม่ได้เป็นชีทที่กำลังทำงาน การเขียน Code ตามบรรทัดนี้แล้วจะเกิดผิดพลาดได้ครับ
Code: Select all
Sheets("Temp").Range("A2:J61").Resize(Range("K1"), 10).Copy
ควรเขียนเป็น
Code: Select all
Sheets("Temp").Range("A2:J61").Resize(Sheets("Temp").Range("K1"), 10).Copy
- เมื่อมีการป้องกันชีท DataStore ก็ต้องมี Code สำหรับการปลดการป้องกันเอาไว้ด้วย ไฟล์ที่แนบมายังไม่มี Code นั้น
ลองทำข้อมูลตัวอย่างที่พร้อมใช้งานมาใหม่ครับ
Re: การล๊อคชีท
Posted: Sun Oct 23, 2011 12:24 am
by bank9597

ผมจะใส่รหัสผ่านไปให้ ก็กลัวจะผิดกฏของฟอรั่ม อิอิ (Pass 240130 ครับ)
เด๊่ยวผมจะลองทำตัวอย่างไปให้ครับ (ส่งไฟล์จริงไปให้ อายไปเป็นแถบๆ อิอิ)
Re: การล๊อคชีท
Posted: Sun Oct 23, 2011 8:59 pm
by phum2553
ขอบคุณครับ
Re: การล๊อคชีท
Posted: Sun Oct 23, 2011 9:52 pm
by bank9597
Sheets("Temp").Range("A2:J61").Resize(Sheets("Temp").Range("K1"), 10).Copy
ผมลองปรับโค๊ดตามด้านบน แต่ว่ามันกลับติด Debug ครับ
ไม่ทราบว่ามันเกิดจากสาเหตุอะไรครับ
ผมลองกลับใช้โค๊ดแบบเก่า ก็ทำงานปกติครับ

Re: การล๊อคชีท
Posted: Sun Oct 23, 2011 10:58 pm
by bank9597

ผมส่งตัวอย่างมาให้ดูครับ เป็นตัวทดสอบ รู้สึกว่ายังมีปัญหาแก้ไม่ได้เลยครับ