Page 1 of 1

อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Tue Feb 10, 2015 10:02 pm
by yangkodza
Sub Macro3()
'
' Macro3 แมโคร
'


'
Range("C3").Select
ActiveCell.FormulaR1C1 = _
"='C:\Users\Admin\Desktop\ป.2\รายชื่อประถม.xlsx]».2.2'!R3C3:R52C5"
Range("C3").Select
Selection.AutoFill Destination:=Range("C3:E3"), Type:=xlFillDefault
Range("C3:E3").Select
Selection.AutoFill Destination:=Range("C3:E52")
Range("C3:E52").Select
Range("C3").Select
End Sub

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

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Tue Feb 10, 2015 10:30 pm
by snasui
:D การเปลี่ยนแปลงตำแหน่งไฟล์แล้วให้ Code ค้นหาตำแหน่งมาให้นั้นเป็นการทำเรื่องยาก เพราะต้องหาทุก Drive ทุก Folder ในเครื่อง โดยปกติแล้วเราจะไม่เขียน Code ในลักษณะนี้ เพราะจะเสียเวลาไปโดยไม่จำเป็น ควรทำความตกลงกับผู้ทำงานให้ Save ลงในตำแหน่งที่กำหนด หรือเขียน VBA ให้เลือก Save ในตำแหน่งที่กำหนดจะเป็นทางเลือกที่ดีกว่า

สำหรับ Event ที่ใช้ตรวจสอบเมื่อมีการ Save คือ Workbook_BeforeSave อยู่ใน ThisWorkbook ซึ่งจะอยู่ในรูปแบบตามด้านล่าง

Code: Select all

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Your code
End Sub
ตรง Your code คือคำสั่งที่ต้องเขียนขึ้นเองให้ทำการใด ๆ เช่นให้ Save ในตำแหน่งที่ต้องการไว้ครั้งหนึ่งก่อนเมื่อผู้ใช้งานมีการ Save ไฟล์ เป็นต้น

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Tue Feb 10, 2015 11:07 pm
by yangkodza
อาจาร์ครับ
ยกตัวอย่างได้ไหมครับ
ถ้าจะเป็นการบันทึกไว้หน้าเดสทอป เครื่องแต่ละเครื่องอ้างอิงตำแหน่งไม่เหมือนกัน
แล้วถ้าต้องการเก็บไว้ C:\data ครับ ต้องเขียนอย่างไรครับ

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Tue Feb 10, 2015 11:52 pm
by snasui
:D ช่วยแนบไฟล์ตัวอย่างที่เขี่ยน Code มาด้วยครับ

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

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Wed Feb 11, 2015 8:16 am
by yangkodza
snasui wrote::D ช่วยแนบไฟล์ตัวอย่างที่เขี่ยน Code มาด้วยครับ

ตัวสีแดงที่ระบายมานั้น ดูเหมือนจะไม่ถูกต้อง ชื่อไฟล์จะต้องมีก้ามปูครอบ ไม่ใช่ก้ามปูเปิดหายไปเหมือนที่ยกมาด้านบนครับ
ไฟล์แนบครับ
http://www.upload-thai.com/dl/120db53b0 ... 5ca6cda19f

ความตั้งใจจริงคือ งานมี 2 ไฟล์

Image

ไฟล์ฐานข้อมูลที่เป็นรายชื่อ

Image

และได้แบ่งห้องโดยทำเป็น sheet แต่ละแผ่น ซึ่งตรงส่วนนี้วิชาการเป็นคนทำ ทำทุกปี และบางครั้งมีการอัพเดทรายชื่อเป็นช่วงๆ กรณ๊เด็กเข้าใหม่
ผมเลยคิดว่าถ้ามีการอัพเดทรายชื่อ ก็แค่เอาไฟล์ต้นฉบับที่ทางวิชาการทำมา copy ทับ

Image

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

Image

และเมื่อรายชื่อขึ้นมาแล้ว รายชื่อจะไปแสดงในแผ่นงานอื่นๆด้สย ตามรายวิชา
ตอนนี้ผมให้รายชื่อไปแสดงในรายวิชาได้แล้วโดยใช้สูตร
ิb8=รายชื่อนักเรียน!C3
c8=รายชื่อนักเรียน!d3
d8=รายชื่อนักเรียน!e3
ดังภาพ
Image

สิ่งที่ผมเจอคือ
ถ้าเราไม่ใช้มาโครใช้วิธีแมนวลสามารถทำงานได้
แล้วเราจะเอาไฟล์ไปไว้ที่ไหนก็ได้ โดยฐานข้อมูลจะตามตลอด
วิธีการของผมคือ
ที่หน้ารายชื่อในไฟล์งานจริงเลือก cell C3 แล้วแก้ไขแถบสูตร
เช่นจากเดิมเป็น =[รายชื่อประถม.xlsx]ป.2.1!$C$3:$E$52
ผมแก้ไขให้เป็น ป.2.2 แล้วกด Enter (ตรงส่วนนี้ทำให้มีช่องเซลคอยรับค่าห้องแล้วนำมาประมวลผลไหมครับ)เพราะการแก้ไขแถบสูตรมีความเสี่ยงพอสมควร
จากนั้นลาก autofill จาก Cell c3 ไปถึง cell e3
และลาก autofill จาก cell e3 ลงไปถึง cell e52 (ตรงนี้ใช้ ดับเบิ้ลคลิกเมาส์ได้ครับ)
ผมทำแบบนี้สามาถทำงานได้ปกติ แต่ว่าคนที่จะเอาไฟล์งานไปใช้เป็นครูในโรงเรียน 100 กว่าคน
แต่ละคนก็รุ่รป้าๆ ซะส่วนใหญ่ ส่วนผมเองสอนคอมเด็กๆมา 16 ปีแล้วครับ 555+

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

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Wed Feb 11, 2015 8:50 pm
by snasui
yangkodza wrote:เช่นจากเดิมเป็น =[รายชื่อประถม.xlsx]ป.2.1!$C$3:$E$52
ผมแก้ไขให้เป็น ป.2.2 แล้วกด Enter (ตรงส่วนนี้ทำให้มีช่องเซลคอยรับค่าห้องแล้วนำมาประมวลผลไหมครับ)เพราะการแก้ไขแถบสูตรมีความเสี่ยงพอสมควร
:D สามารถกดแป้น Ctrl+H เพื่อเปิดกล่อง Replace จากนั้นช่องบนคีย์ค่าเดิม เช่น ป.2.1 ช่องล่างคีย์ ป.2.2 จากนั้นกดปุ่ม Replace All

สำหรับไฟล์แนบให้แนบมาที่ฟอรัม โดยปรับให้มีขนาดไม่เกิน 300kb กรณีไฟล์ขนาดใหญ่ ให้ลบข้อมูลที่ไม่เกี่ยวกับคำถามทิ้งไปก่อนครับ

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Thu Feb 12, 2015 9:18 am
by menem
น่าจะประมาณนี้ครับ แต่ปัญหาที่จะตามมาคือ ไฟล์ที่ใช้บันทึกคะแนน มีเพียงไฟล์เดียว
ดังนั้น เวลาบันทึกก็จะเหลือเฉพาะข้อมูลของห้องล่าสุดเท่านั้น เว้นแต่จะมีการสั่งบันทึก
ลงในไฟล์ใหม่ต่างหาก (หรือใช้ VBA กำหนดชื่อไฟล์เพื่อทำการบันทึกให้อัตโนมัติอีกที)

** การบันทึกทั้งหมด อยู่ใน Folder เดียวกัน
** หากต้องการให้อยู่คนละ Folder ได้ จะต้องมีการระบุไว้อย่างชัดเจนว่า ไฟล์ไหนอยู่ที่ไหนนะครับ

Code: Select all

Sub Macro2()
'
' Macro2 áÁâ¤Ã
'

    CurrDir = Application.ActiveWorkbook.Path
    ClassRoom = InputBox("ËéͧàÃÕ¹ àªè¹ 1.1 ¤×Í ».1/1")

'
    Range("C3").Select
'    ActiveCell.FormulaR1C1 = _
'        "='D:\Documents\Desktop\Ẻà¡çº 57¤Ðá¹¹ ¾ÔàÈÉ\».2\[ÃÒª×èÍ»ÃжÁ.xlsx]».2'!R3C3:R52C5"
    ActiveCell.FormulaR1C1 = "='" & CurrDir & "\[ÃÒª×èÍ»ÃжÁ.xlsx]»." & ClassRoom & "'!R3C3:R52C5"
    Range("C3").Select
    Selection.AutoFill Destination:=Range("C3:E3"), Type:=xlFillDefault
    Range("C3:E3").Select
    Selection.AutoFill Destination:=Range("C3:E52")
    Range("C3:E52").Select
    Range("C3").Select
End Sub

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Thu Feb 12, 2015 4:21 pm
by yangkodza
menem wrote:น่าจะประมาณนี้ครับ แต่ปัญหาที่จะตามมาคือ ไฟล์ที่ใช้บันทึกคะแนน มีเพียงไฟล์เดียว
ดังนั้น เวลาบันทึกก็จะเหลือเฉพาะข้อมูลของห้องล่าสุดเท่านั้น เว้นแต่จะมีการสั่งบันทึก
ลงในไฟล์ใหม่ต่างหาก (หรือใช้ VBA กำหนดชื่อไฟล์เพื่อทำการบันทึกให้อัตโนมัติอีกที)

** การบันทึกทั้งหมด อยู่ใน Folder เดียวกัน
** หากต้องการให้อยู่คนละ Folder ได้ จะต้องมีการระบุไว้อย่างชัดเจนว่า ไฟล์ไหนอยู่ที่ไหนนะครับ

Code: Select all

Sub Macro2()
'
' Macro2 áÁâ¤Ã
'

    CurrDir = Application.ActiveWorkbook.Path
    ClassRoom = InputBox("ËéͧàÃÕ¹ àªè¹ 1.1 ¤×Í ».1/1")

'
    Range("C3").Select
'    ActiveCell.FormulaR1C1 = _
'        "='D:\Documents\Desktop\Ẻà¡çº 57¤Ðá¹¹ ¾ÔàÈÉ\».2\[ÃÒª×èÍ»ÃжÁ.xlsx]».2'!R3C3:R52C5"
    ActiveCell.FormulaR1C1 = "='" & CurrDir & "\[ÃÒª×èÍ»ÃжÁ.xlsx]»." & ClassRoom & "'!R3C3:R52C5"
    Range("C3").Select
    Selection.AutoFill Destination:=Range("C3:E3"), Type:=xlFillDefault
    Range("C3:E3").Select
    Selection.AutoFill Destination:=Range("C3:E52")
    Range("C3:E52").Select
    Range("C3").Select
End Sub
Image

Image
ผมพยายามแก้เป็นชั่วโมงก็ไม่ผ่าน ผมแก้จุดที่ขีดเส้นใต้สีแดงครับ
test มัธยม.xls
รายชื่อมัธยม.xls

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Thu Feb 12, 2015 4:25 pm
by menem
ชื่อไฟล์ของ รายชื่อมัธยม เป็น .xlsx หรือว่า .xls ครับ ?

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Thu Feb 12, 2015 4:27 pm
by yangkodza
menem wrote:ชื่อไฟล์ของ รายชื่อมัธยม เป็น .xlsx หรือว่า .xls ครับ ?
เวนกำ ถึงบางอ้อครับ เป็น xls ครับ

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

Re: อยากให้มาโครทำงานถูกต้องโดยไม่ต้องปรับปรุงค่า

Posted: Thu Feb 12, 2015 11:10 pm
by snasui
yangkodza wrote:เวนกำ ถึงบางอ้อครับ เป็น xls ครับ

ขอบคุณมากๆครับ
:D คุณกำลังทำผิดกฎข้อ 1 ด้านบน ช่วยระมัดระวังด้วยครับ