Page 1 of 2

การล๊อคชีท

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

และถ้ามันล็อคได้จริง สมมุติเวลาเราต้องดึงข้อมูลจากชีทที่ล็อคไว้มาแก้ไขด้วยมาโครที่เราสร้างไว้ มันจะยอมให้ดึงข้อมูลมาแก้ไขไหมครับอาจารย์
untitled.JPG

Re: การล๊อคชีท

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

User ก็ไม่สามารถมองเห็นไม่สามารถยกเลิกการซ่อนได้แล้วครับ ยกเว้นว่าจะมีรหัสเพื่อยกเลิกการซ่อน กรณีเราต้องการเขียน VBA เพื่อนำค่ามาใช้ก็สามารถทำได้ปกติครับ

Re: การล๊อคชีท

Posted: Fri Oct 21, 2011 4:24 pm
by bank9597
ได้แล้วครับ ขอบคุณครับ

ว่าแต่ Excel 2007 เวอร์ชั่นไทย มันหายากเอาเรื่องเหมือนกัน :D

Re: การล๊อคชีท

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

ผมจึงปลดล็อคออกมา มันก็ทำงานเป็นปกติ

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 9:27 pm
by snasui
:D การ Protect Sheet กับ Protect Workbook ไม่เหมือนกันนะครับ

ถ้า Protect Sheet เอาไว้ก็ย่อมที่จะบันทึกใน Sheet ที่ Protect ไว้ไม่ได้ครับ

Re: การล๊อคชีท

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

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 10:10 pm
by snasui
:D อยู่ที่เมนู ตรวจทาน > ป้องกันสมุดงานครับ ถ้าเป็นไปได้ให้ใช้เมนูภาษาอังกฤษ เพราะผมไม่สะดวกตอบเป็นเมนูภาษาไทยครับ :mrgreen:

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 10:33 pm
by bank9597
:tt: ครับผม เดี๋ยวผมจะพยายามในเรื่องนี้อีกทีนึงครับ

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

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 10:37 pm
by snasui
:shock: ทำไมถึงติดกับการป้องกันชีทครับ ผมมิได้แนะนำให้ป้องกันชีทแต่ประการใดครับ อ่านซ้ำอีกครั้งหนึ่ง :mrgreen:

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 11:04 pm
by bank9597
:D ผมงงอยู่อ่ะครับอาจารย์ อิอิ
คือว่าผมต้องการซ่อนชีท Datastore ไว้ ไม่ให้ใครเห็น ผมเลยทำการซ่อนชีทไว้ แล้วไปที่ ตรวจทาน==>ป้องกันสมุดงาน==> ป้องกันโครงสร้างและวินโดว์ ผมทำอย่างนี้ ชีทก็ถูกซ่อนไว้และไม่สามารถเปิดชีทดูได้ถ้าไม่มีรหัสผ่าน

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

ทั้งหมดก็ประมาณนี้อ่ะครับ แต่ถ้ายังไงมันลำบากเกินไป ก็ไม่เป็นไรครับ ผมแค่ป้องกันการลบและแก้ไขข้อมูลก็พอครับ ไม่จำเป็นต้องซ่อนก้ได้ :)

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 11:17 pm
by snasui
:lol: สำหรับที่ถามมานั้นไม่ใช่เรื่องลำบากครับ

สิ่งที่ต้องทราบและสื่อสารให้ถูกต้องคือ
  • ป้องกันแผ่นงานคือป้องกันชีทไม่ให้แก้ไขเซลล์ แทรก ลบข้อมูล ฯลฯ ป้องกันสมุดงานคือป้องกันไฟล์ ไม่ให้ซ่อนชีท ยกเลิกการซ่อนชีท ลบชีท เป็นต้น ระวังอย่าใช้สับกันเพราะจะทำให้ผมตอบตามที่เขียนถาม
  • การป้องกันการแก้ไขชีทที่ซ่อนไว้ก็ต้องเขียน Code ให้ยกเลิกการป้องกันก่อนเสมอ (แม้ไม่ซ่อนถ้ามีการป้องกันไว้ก็ต้องยกการป้องกันก่อนเสมอ) หากมีการแก้ไขปรับปรุง เปลี่ยนแปลง เพิ่มเติมข้อมูล ไม่งั้นก็ไม่สามารถที่จะแก้ไข ปรับปรุง เปลี่ยนแปลง เพิ่มเติมข้อมูลได้
ถ้าได้ทำถูกต้องอย่างที่ผมเขียนมาแล้วลองส่งไฟล์ที่มีปัญหานั้นมาครับ จะได้ช่วยตรวจสอบให้ได้

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 11:30 pm
by bank9597
:tt: อิอิ ผมพอจะเข้าใจแล้วครับอาจารย์

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

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 และล๊อคไว้ด้วย ผมควรจะแก้ไขโค๊ดด้านบนอย่างไรครับ โดยให้ปลดล็อคตอนขัมมูลมาบันทึก และจะล็อคใหม่เมื่อบันทึกข้อมูลเสร็จแล้ว

อีกนิดน่ะครับ ถ้าเราป้องกันแผ่นงานแล้ว ก็ไม่จำเป็นต้องซ่อนใช่ไหมครับ :mrgreen:

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 11:38 pm
by snasui
:D ลองปรับ 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
:D
bank9597 wrote:อีกนิดน่ะครับ ถ้าเราป้องกันแผ่นงานแล้ว ก็ไม่จำเป็นต้องซ่อนใช่ไหมครับ
ความจำเป็นอยู่ที่ว่าต้องการให้เห็นหรือไม่ครับ ถ้าไม่ต้องการให้เห็นก็จำเป็นต้องซ่อนครับ

Re: การล๊อคชีท

Posted: Sat Oct 22, 2011 11:57 pm
by bank9597
:D ยังติด Debug ครับ
ผมส่งไฟล์แนบมาให้ครับ (ขออภัยด้วยน่ะครับ พอดีชีทค่อนข้างเยอะแล้ว อาจจะสับสนหน่อย)
ชีท Purchase Order เป็นฟอร์มสั่งซื้อครับ
ส่วนในชีท Datastore ตอนนี้ผมป้องกันแผ่นงานไว้น่ะครับ

Re: การล๊อคชีท

Posted: Sun Oct 23, 2011 12:18 am
by snasui
:D 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
:D ผมจะใส่รหัสผ่านไปให้ ก็กลัวจะผิดกฏของฟอรั่ม อิอิ (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 ครับ

ไม่ทราบว่ามันเกิดจากสาเหตุอะไรครับ
ผมลองกลับใช้โค๊ดแบบเก่า ก็ทำงานปกติครับ :cry:

Re: การล๊อคชีท

Posted: Sun Oct 23, 2011 10:58 pm
by bank9597
:D ผมส่งตัวอย่างมาให้ดูครับ เป็นตัวทดสอบ รู้สึกว่ายังมีปัญหาแก้ไม่ได้เลยครับ