PDA

View Full Version : สามารถตรวจหาการ Save ได้หรือไม่ครับ



ittaVB
24 May 2007, 14:36
ใน VBA ถ้าหากเราต้องการป้องกันไม่ให้มีการบันทึกใดๆ ที่ทำงานโดย Excel เว้นแต่การบันทึกจาก code ที่เราเขียนเอง เราสามารถป้องกันได้ไหมครับ? ความคิดผมก็คือให้มีการตรวจจับว่ามีการกดปุ่ม save หรือไม่ แล้วค่อยสั่งให้จบการทำงานก่อนที่จะบันทึก แต่ไม่รู้จะดักจับด้วยวิธีการไหน รบกวนผู้รู้ให้คำแนะนำด้วยครับ
ขอบคุณครับ

สมเกียรติ
25 May 2007, 21:52
แทนที่จะใช้ VBA ปิดเมนู Save หรือกันการกดปุ่ม Ctrl+s ซึ่งผู้ใช้เก่งๆอาจหาทาง save จนได้หรือ copy ออกไปที่แฟ้มอื่นแล้ว save

ที่ผมเคยใช้โดยใช้ Windows Explorer กำหนด Property ของแฟ้มให้เป็น Read Only จะได้เปิดดูได้อย่างเดียว

ittaVB
26 May 2007, 09:35
ขอบคุณครับ อาจารย์สมเกียรติ
ผมกำลังเขียนโปรแกรมด้วยวิธีการป้องกันไม่ให้บันทึกไปใช้กับคอมพิวเตอร์เครื่องอื่นครับ
การป้องกันของผมก็คือให้ไปเก็บค่า S/N ของ HDD มาเก็บไว้ใน cell แล้วก็ให้โปรแกรมตรวจสอบทุกครั้งก่อนที่จะใช้งาน หลังจากได้ค่ามาเก็บแล้วผมจะตั้งให้เป็น Readonly แล้วครับ
แต่ผมอยากจะให้ตัวโปรแกรมป้องกันตนเองครับโดยการไม่ยอมให้บันทึกเลย ไม่ว่าจะเป็น Readonly แล้วเปลี่ยนเป็นชื่ออื่น ผมก็เลยอยากจะทราบว่ามีวิธีการไหนบ้างที่เราจะดักจับการบันทึกจากผู้ใช้ ถ้าดักจับได้แล้วผมก็จะสั่งให้โปรแกรมปิดตัวเองโดยไม่มีการบันทึกใดๆ เลยครับ

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

ขอบคุณอีกครั้งครับ

สมเกียรติ
26 May 2007, 09:57
มีหลายวิธีที่ทำให้แฟ้มที่ save ในโฟลเดอร์หรือชื่อใหม่ แล้ว VBA ทำงานต่อไม่ได้ เช่น

ใช้วิธีตรวจสอบ Path โดยใช้คำสั่ง ThisWorkbook.Path = ที่อยู่ที่กำหนดเดิม
ใช้วิธีตรวจสอบชื่อแฟ้ม โดยใช้คำสั่ง ThisWorkbook.Name = ชื่อแฟ้มเดิมถ้ากลัวว่าเขาจะสร้างโฟลเดอร์ชื่อซ้ำกับเราเพื่อทำให้ VBA ทำงานต่อได้ ก็ให้ใช้คำสั่ง ThisWorkbook.Path ไปตรวจสอบชื่อแฟ้มอื่นที่ต้องอยู่ในโฟลเดอร์เดยวกันกับที่เราใช้ เช่น
Filename = ThisWorkbook.Path & "\ExpertModule.bas"

ลองพยายาม save แฟ้มตัวอย่างที่แนบมานี้ครับ แฟ้มจะปิดตัวเองทันทีโดยไม่ save แต่มีจุดอ่อนตรงที่ถ้าผู้ใช้เปิดแฟ้มโดย Disable Macro จะ save ได้เสมอเพราะ VBA ไม่ทำงาน (จึงเป็นเหตุที่เราไม่ควรพึ่งตัวรหัส VBA ในการป้องกันการ save)



Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "แฟ้มนี้ห้าม Save"
ThisWorkbook.Close (False)
End Sub

อรวีร์
26 May 2007, 10:15
ลองดูรูปแนบค่ะ

ittaVB
26 May 2007, 13:55
ขอบคุณอาจารย์สมเกียรติ, คุณอรวีร์ มากครับ