PDA

View Full Version : มีวิธี แยก โมดูล ออกจาก ไฟล์ Excel หรือไม่ครับ



nutty
24 May 2007, 14:09
ผมต้องการให้ Code มาโคร ที่เขียนไม่อยู่ติดกับไฟล์ที่เขียนนะครับ ให้ไฟล์มีแต่หน้าแบบฟอร์มที่สร้างขึ้น และ จะเก็บ Code ไว้ในเครื่องผม แต่จะ Share ไฟล์ที่เป็นหน้าแบบฟอร์มไว้ นะครับ จะต้องทำอย่างไรบ้าง เนื่องจาก เกรงว่าบุคคลที่ไม่หวังดีจะนำไฟล์ไปแก้ไข เลยอยากจะแยกไฟล์ที่เป็นแบบฟอร์มและ Code ออกจากกัน เพราะ ตอนนี้ พบว่า มีสูตรในโปรแกรมที่ผมเขียนในเซลล์ถูกแก้ไขไปแล้วนะครับ เลยอยากเขียนมาโครแทนสูตรในเซลล์ให้หมดและแยก Code ออกจากไฟล์เลยนะครับ
ถ้าท่านใดมีวิธีหรือระบบจัดการด้านความปลอดภัยใน Excel ช่วยแนะนำด้วยนะครับ เพราะ จำเป็น

Ubolwan
24 May 2007, 18:44
ลองนำโค้ดดังกล่าวมาสร้างเป็นแฟ้ม Add-ins นะค่ะ ลองอ่านวิธีการสร้างแฟ้มแอดอินส์ในเว็บ http://www.Excelexperttraining.com/ ก่อนค่ะ

สมเกียรติ
25 May 2007, 20:22
แนะนำให้หาทางทำให้รหัสที่เราสร้างไว้นั้น ไม่ทำงานเมื่อคนอื่นเข้ามาแก้ไข โดยเขียนรหัสให้คอยตรวจสอบค่าต่างๆที่เราตั้งไว้ว่ายังคงเหมือนเดิมหรือไม่ ถ้าไม่ ให้ส่งค่า 0 ไปแทนที่ .... อะไรทำนองนี้

อย่างไรก็ตามถ้าคนแกะเขาเก่ง ก็ยังกันไม่ได้อยู่ดีครับ วิธีที่ดีคือต้องหาทางสร้าง .dll มาใช้ ซึ่งผมยังทำไม่เป็น

มิตรภาพ
26 May 2007, 10:01
ที่ผมนะครับ ผมใช้วิธีคล้ายๆกับที่คุณ nutty ต้องการเลย คือผมแยกไฟล์สำหรับทำหน้าที่เป็นโค้ดหลักต่างหาก(มีแต่ Module ล้วนๆ) ไฟล์นี้จะเก็บที่ Server ในโฟลเดอร์ที่ Share ด้วยชื่อที่มีตัว $ ต่อท้าย โดยตั้งให้ไฟล์เป็น ReadOnly ด้วย ซึ่ง User ทั่วๆไปจะมองไม่เห็นโฟลเดอร์ที่แชร์มาจากเซิฟเวอร์นี้ และไม่สามารถจะแก้ไข/บันทึกโค้ดได้ (ถึงแม้จะสามารถเปิดดูโค้ดได้ก็ตาม)

วิธีนี้จะยังคงได้ผล ถ้าเรายังเป็นคนเดียวที่สามารถเข้าไปทำอะไรใน Server ได้

ข้อเสียอีกอย่าง(ถ้าไม่ได้ทำ Add-in) ก็คือ แม้ว่า User จะไม่สามารถแก้ไขโค้ดแล้วบันทึกกลับได้ แต่เขายังสามารถแก้ไขในขณะนั้นๆ แล้วใช้งานตามที่แก้ไขนั้นได้ทันที

สำหรับที่ผมเป็นองค์กรเล็กๆ จึงยังคงใช้วิธีนี้ได้อยู่ครับ

nutty
28 May 2007, 16:49
ขอบคุณ คุณ Ubolwan อาจารย์สมเกียรติ และ คุณ มิตรภาพ นะครับ

ผมได้ไปอ่านเจอในหนังสือเกี่ยวกับ Personal Macro Workbook ไม่ทราบว่า เป็นวิธีเดียวกับที่คุณมิตรภาพใช้หรือไม่ครับ แต่อ่านแล้วก็ยัง งงๆ อยู่นะครับ

ตามความเข้าใจที่ผมอ่านนั้น จะเข้าใจได้ว่า มาโครที่เขียนไว้นั้น จะยังคงอยู่ใน Workbook นั้นๆใช่หรือไม่ครับ เพียงแต่เราจะมองไม่เห็นมันเท่านั้นเอง ซึ่งถ้าเป็นอย่างนั้นจริง วิธีของคุณมิตรภาพ น่าจะตรงกับที่ผมต้องการมากกว่า คือ มี Workbook อันเดียวที่รวบรวม โมดูลทั้งหมดไว้ที่เดียว
แต่ก็ยังติดอยู่ตรงที่ว่า ของคุณมิตรภาพ ถ้าเวลารันจะต้องเปิด Workbook อันนี้ทุกครั้งใช่ไหมครับ

แต่อย่างไรก็ดี ผมรบกวนคุณมิตรภาพ ช่วยบอกขั้นตอนการการแยก โมดูลเป็นขั้นๆ ให้ได้ไหมครับ

ขอบคุณมากครับ:)

ปล.
ผมกำลังมีแนวคิดที่จะทำ ดังต่อไปนี้ นะครับ ไม่ทราบว่า จะใช้ได้หรือไม่ คือ
1. ทำการสร้าง Workbook ขึ้นมาใหม่
2. นำโมดูลที่สร้างไว้ มาวางไว้ใน Workbook ข้อที่ 1 และบันทึกเป็นแบบ Personal Macro Workbook (เพื่อที่จะได้ให้ Workbook ดังกล่าว สามารถ Hide ได้นะครับ)

ผิดถูกอย่างไรช่วยชี้แนะด้วยนะครับ:p

Ubolwan
28 May 2007, 21:31
ขอเสนอความคิดนะคะ
จากความคิดของคุณที่จะแยกโค้ดลงใน Personal Macro Workbook นั้น ลองนึกปัญหาว่า

ถ้าสมมุติว่ามีคอมพิวเตอร์หลายเครื่องต้องใช้แมโครเดียวกัน คุณต้อง Copy แฟ้มนั้นไปวางทุกเครื่องใช่หรือไม่
ถ้าผู้ใช้งานเผลอสั่งแสดงด้วยคำสั่ง Windows -> Unhide แล้วสั่งปิดโดยตอบ No แมโครจะทำงานหรือไม่
มีโอกาสหรือไม่ที่ User ที่รู้มากไปหน่อยจะเข้าไปลบแฟ้ม Personal Macro Workbookด้วยความปรารถนาดี

nutty
28 May 2007, 23:13
ขอบคุณ คุณ Ubolwan มากครับ ที่ให้คำแนะนำ โดยส่วนตัวแล้วผมยังไม่เคยได้ทดลองใช้ ทั้ง 2 วิธี นะครับ
ขอถามต่อได้ไหมครับ ว่า
1 ถ้าเราตั้ง Password ให้กับ Personal Macro Workbook จะแก้ไขได้ไหมครับ แล้วมันทำได้หรือเปล่าครับ
2 ถ้าเราใช้ Add Ins แล้ว จำเป็นหรือไม่ครับ ที่จะต้องรันบนเครื่องนั้นตลอดทุกครั้ง ผมหมายถึง หากสร้าง Add Ins ไว้ในเครื่องที่ทำงาน แล้วเกิดจะทำงานกลับมาทำที่บ้าน จะได้ไหมครับ

ขอบคุณมากครับ:)

มิตรภาพ
29 May 2007, 00:49
เข้ามาเพิ่มเติมข้อมูลอีกครั้งนะครับ:)
ถ้าจะลองทำตามวิธีที่ผมใช้อยู่ จะต้องเตรียมการ 2 ส่วนครับ คือ ส่วนของระบบเน็ตเวิร์ค และส่วนของไฟล์เอ็กเซลครับ

1. ในส่วนของระบบเน็ตเวิร์ค ผมให้ความสำคัญกับเรื่องต่างๆดังนี้ครับ

1.1 ต้องเซ็ตระบบให้ทุกๆเครื่อง สามารถทำงานร่วมกันได้เป็นอย่างดีก่อน และควรจะเป็นระบบ Fix IP โดยจะต้องมีการ Log-In ด้วย UserName ทุกๆครั้งที่ในแต่ละเครื่อง
1.2 จะต้องมีเครื่องใดเครื่องหนึ่ง ทำหน้าที่เป็น "ตัวแม่" ในการเ็ก็บโค้ดงาน ซึ่งอาจจะเป็นเครื่อง Server ของระบบ หรือเป็นเครื่องที่เรานั่งประจำเองก็ได้ แต่แนะนำว่าให้เก็บไว้ใน Server จะดีกว่า เพราะเครื่องเราเอง อาจจะต้องมีการทดลองแล้ว Restart บ้างในบางครั้ง อาจจะรบกวนการทำงานของส่วนรวมได้
1.3 เมื่อได้เครื่องที่ทำหน้าที่เป็น "ตัวแม่" ได้แล้ว ก็สร้างโฟลเดอร์ไว้สำหรับเก็บไฟล์โค้ดงานนี้มาสักโฟลเดอร์หนึ่ง แล้วกำหนด "สิทธิ์" ในการเข้าใช้โฟลเดอร์นี้ คือให้เฉพาะ Username ของเราเท่านั้น ที่จะเข้าไปเปลี่ยนแปลง/แก้ไขไฟล์ภายในได้ ส่วน UserName อื่นๆให้เข้าไปอ่านได้อย่างเดียว
1.4 และที่โฟลเดอร์นี้ ให้สั่ง Share ด้วยชื่อที่มี $ ต่อท้าย ย้ำว่า ไม่ใช่ชื่อโฟลเดอร์นะครับ เป็นชื่อในการ Share เท่านั้น ผลของการทำแบบนี้ จะทำให้ User จากเครื่องอื่นๆมองไม่เห็นโฟลเดอร์นี้
1.5 จากนั้นก็นำไฟล์โค้ดหลักของเรามาเก็บไว้ที่โฟลเดอร์นี้ครับ
1.6 ทีนี้ก็วิ่งไปที่เครื่องของ User แต่ละเครื่อง เข้าไปที่โฟลเดอร์ XLSTART ของ MicrosoftOffice ซึ่งปกติ Office2003 จะอยู่ที่ C:\Program Files\Microsoft Office\OFFICE11\XLSTART ครับ จากนั้นก็สร้าง ShortCut ผ่านระบบเน็ตเวิร์คเข้าไปที่ "ตัวแม่" แ้ล้วชี้ไปที่ไฟล์ Excel ที่เป็นโค้ดหลักของเรานั่นเอง
จากวิธีนี้จะเห็นว่า ยุ่งยากเพียงแค่การเซ็ตระบบและวางแผนงานครั้งแรกเท่านั้น หลังจากทุกอย่างเข้าที่เข้าทางแล้ว เมื่อ User เปิดเอ็กเซลเพื่อทำงาน ไฟล์โค้ดหลักก็จะถูกเปิดขึ้นโดยอัตโนมัติทันที เราจะปรับปรุงแก้ไขโค้ดงานอย่างไร ก็ทำที่"ตัวแม่"เพียงไฟล์เดียวเท่านั้น ซึ่งสำหรับผมนั้น ผมจะทดลองจนแน่ใจว่าโค้ดสามารถใช้งานได้ในเครื่องผมก่อน จากนั้นจึงค่อย Save ลงไปแทนที่ตัวเดิมในตัวแม่ครับ

2. ในส่วนของไฟล์โค้ดงานหลัก

2.1 ไฟล์นี้ ผมจะเก็บ Module ทั้งหมด และมีชีทงานสำหรับเก็บฐานข้อมูล ที่ใช้อ้างอิงกับระบบงานของผม (ใครส่งไฟล์/รับไฟล์ จากเครื่องใหนไปเครื่องใหน ฯลฯ)
2.2 ก่อนจะบันทึกไฟล์โค้ดหลักนี้ ผมจะ Hide Workbook ก่อน เพื่อให้เวลาที่ User เปิดใช้งาน ก็จะมองไม่เห็นว่ามีไฟล์โค้ดหลักนี้เปิดอยู่ด้วย และถึงแม้ว่าเราจะ Hide Workbook แล้ว เราก็ยังสามารถเข้าไปแก้ไข Code ใน Module ได้อยู่ครับ
2.3 ไม่จำเป็นต้องตั้งรหัสผ่านสำหรับการแก้ไขไฟล์นี้ก็ได้ครับ เพราะเรากำหนดสิทธิ์ไว้ตั้งแต่ขั้นตอนการสร้างโฟลเดอร์ในเครื่องแม่แล้ว แต่จะตั้งไว้ก็ไม่เป็นไร จะแน่นหนามากขึ้นอีกขั้นครับ
2.4 ในการเรียกใช้งานคำสั่งหรือมาโครต่างๆ ผมจะใช้การ"สร้างเมนูู"ขึ้นมาเป็นการเฉพาะ แทนการใช้"ปุ่ม"บนชีทงาน เพราะการใช้ปุ่มจะผูกติดกับไฟล์โดยตรง เมื่อมีการบันทึกหรือเปลี่ยนแปลงโฟลเดอร์ใดๆ อาจทำให้เกิดปัญหายุ่งยากได้ แต่เมนูสามารถทำงานกับ Workbook ใดๆก็ได้ จะบันทึกหรือย้ายที่ไปใหนก็ไม่เกี่ยวกับไฟล์โค้ดหลักครับ

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

ต่างจากการใช้ Personal Workbook ซึ่งจะต้องไปติดตั้งลงทุกเครื่อง จะแก้ไขกันที ก็ต้องวิ่งไปทำใหม่ในทุกเครื่อง หรือการทำเป็น Addin ก็อาจจะไม่สะดวกนักกับการต้องแก้ไขเพิ่มเติมโค้ดงานบ่อยๆครับ

ผมย้อนกลับไปดูคำถาม เห็นว่ามีการสร้างฟอร์มให้กรอกข้อมูลด้วย ตรงนี้ผมก็แนะนำว่า สามารถใช้วิธีเดียวกันนี้ สร้างฟอร์มเพียงไฟล์เดียว แล้ว Share ให้ User แต่ละเครื่องได้ใช้งาน ส่วนข้อมูลจากฟอร์ม ก็ให้เขียนชุดคำสั่งไว้ในไฟล์โค้ดหลัก เพื่อนำข้อมูลไปเก็บลงไฟล์ฐานข้อมูลอีกไฟล์ต่างหากครับ อ้อ...เวิร์คบุ๊คทุกๆเวิร์คบุ๊คสามารถ Hide ได้หมดละครับ ไม่จำเป็นจะต้องเป็น Personal Workbook เท่านั้น

ตอบซะยาวเลย :p เป็นเรื่องที่ตรงกับผมทำอยู่พอดีก็เลยมีข้อมูลครับ แต่อาจจะเรียบเรียงได้ไม่ชัดเจนนักก็ต้องขออภัยครับผม (ผมอ่านเองยังงงๆเลย:confused:)

nutty
26 Jun 2007, 18:10
ก่อนอื่น ผมต้องขออภัยคุณมิตรภาพด้วยนะครับ ที่ปล่อยกระทู้นี้โดยไม่ได้กลับมาตอบเป็นเวลานานมาก เนื่องจาก ผมได้ลองไปพยายามศึกษาและสร้างแฟ้ม Add Ins (เลือกทำที่ละอย่างนะครับ อีกอย่างคือ ผมไม่ค่อยมีความรู้เกี่ยวกับ ระบบเน็ทเวิร์ค ด้วยนะครับ) แต่ก็ยังทำไม่ได้สักที

ไม่ทราบคุณมิตรภาพพอจะเคยใช้งาน Add Ins ไหมครับ หากเคย ผมอยากจะรบกวนให้ลองไขปัญหาที่ผมติดอยู่จากกระทู้ที่ได้ให้ อาจารย์สมเกียรติ ให้คำแนะนำมานะครับ ตามข้างล่างนี้นะครับ
http://www.excelexperttraining.com/forums/showthread.php?t=225

เพราะหากสุดท้ายแล้ว การใช้งาน Add Ins ไม่เหมาะกับลักษณะงานของผมแล้ว จะได้ไปศึกษาตามวิธีของคุณมิตรภาพแนะนำไว้นะครับ

ขอบคุณมากครับ

มิตรภาพ
26 Jun 2007, 21:48
ผมแนะนำ 2 ลิ้งก์นะครับ
1. อันแรก สอนสร้าง Addin ที่น่าจะเป็นประโยขน์ก็คือ การตั้งรหัสผ่านสำหรับเข้าไปดูหรือแก้ไขโค้ด ที่นี่ครับ
http://www.fontstuff.com/vba/vbatut03.htm ขั้นตอนต่างๆ เขาเขียนได้กระชับและได้ใจความดีมากครับ ผมทดลองแล้ว ยืนยันว่าทำได้จริงครับ ส่วนสำคัญคือ การ Save ให้เป็น .xla และให้เรารู้ที่ที่ไฟล์นี้อยู่จริงๆ
2. เมื่อทำข้อ 1. ได้แล้ว มาอ่านต่อที่ลิ้งก์นี้นะครับ
http://www.fontstuff.com/vba/vbatut08.htm ตรงนี้ มีส่วนสำคัญก็คือ การตั้งชื่อให้ไฟล์ .xla ที่สร้างจากข้อ 1. ครับ เพื่อให้การอ้างอิงนำไปใช้ในเครื่องอื่นๆได้ง่ายขึ้น

จากข้อ 1. ที่ผมบอกให้จดจำที่อยู่ของไฟล์ .xla ที่เราสร้างขึ้นไว้ ก็เพราะว่าผมจะแนะนำว่า ให้ share folder ที่เก็บไฟล์ .xla นี้ จากนั้น ก็ไปทำ Set a Reference to the Add-In จากลิ้งก์ในข้อ 2. เพื่อให้ Excel ในเครื่องต่างๆภายในวงแลน สามารถอ้างอิงผ่้านระบบแลน เข้ามาใช้ ไฟล์ .xla ที่เราสร้างขึ้นครับ

ผมทดลองดูแล้วจากทั้ง 2 ลิ้งก์ รวมทั้งการ Set a Reference to the Add-In เพื่อเข้ามาใช้งาน Addin ที่เก็บอยู่ในเครื่องกลาง สามารถทำตามขั้นตอนนั้นได้เลยครับ แต่อาจจะตรงหรือไม่ตรงกับงานของท่านเจ้าของกระทู้ก็ยังไม่แน่ใจนัก ก็ยินดีให้คำปรึกษาเท่าที่จะพอมีความรู้อยู่บ้างเล็กๆน้อยๆครับผม

nutty
2 Jul 2007, 14:10
ขอบคุณ คุณมิตรภาพ มากครับ
ตอนนี้ ผมสามารถทำ Add-In ได้ตามความต้องการแล้วนะครับ
ได้ความรู้เพิ่มขึ้นมากเลยครับ :D

คราวนี้เลยคิดต่อไปอีกนะครับ ถึงในส่วนของการป้องกันการคัดลอกไฟล์ที่เป็นหน้าฟอร์มนะครับ ซึ่งตอนนี้ ผมมองแนวทางการป้องกันออกเป็น 2 แนวทางนะครับ (เท่าที่นึกได้ตอนนี้นะครับ)
1. การป้องกันการคัดลอกทั้งไฟล์ โดยไม่ต้องเปิดไฟล์
2. การป้องกันการคัดลอกไฟล์ ที่ได้เปิดไฟล์แล้ว Save , Save as เป็นชื่ออื่นๆ

โดยถ้า Workbook นั้นกำลังจะถูกคัดลอก ให้มีการถามหา password ก่อนนะครับ และ/หรือถ้าบุคคลนั้นสามารถคัดลอกไปได้จริง ก็ให้ Format ทั้งหมดในทุก Worksheet ถูกเคลียร์ไปทั้งหมด หรือ Worksheet ทั้งหมดถูก Delete ไปนะครับ

ไม่ทราบพอจะมีทางทำได้ไหมครับ

ปล. จริงๆแล้ว จากในลิงค์ที่คุณมิตรภาพให้อ่านนั้น ก็พอทราบได้นะครับว่า ไฟล์หน้าแบบฟอร์มนั้น ถึงแม้จะคัดลอกไปก็จะไม่สามารถใช้งานได้ เพราะไม่ได้คัดลอก Code ในไฟล์ Add-In ไปด้วย แต่ผมอยากจะลองสร้างให้มีระบบการป้องกันให้เหนียวแน่นที่สุดนะครับเท่าที่จะทำได้นะครับ :cool:

มิตรภาพ
10 Jul 2007, 00:36
การป้องกันการ Save และ Save As ผมต้องใช้พอดี สามารถหาอ่านได้จากกระทู้ที่ผมเขียนเข้ามาปรึกษาในนี้นะครับ เท่าที่ลองดูแล้ว รู้สึกว่าจะป้องกันได้เป็นอย่างดีครับ

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