Page 1 of 1

คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Wed Sep 07, 2022 11:20 am
by sosadboy
ผมใช้โค๊ด VBA ในการคัดลอกข้อมูลจากสมุดงานที่พึ่งสร้างใหม่ ซึ่งเป็นสมุดงานที่ออกมาจากโปรแกรมของทางบริษัทในรูปแบบของสมุด
งาน excel ปัญหาที่พบคือ โค๊ดที่เขียนใช้กับเครื่องตัวเองได้ตามปกติ แต่พอเอาโค๊ดไปใช้กับบางเครื่องในเครือข่าย พบว่าโค๊ดไม่ทำงาน
โค๊ดที่ใช้คือ

Code: Select all

Sub ดึงข้อมูล()
    Application.ScreenUpdating = False
        Windows("Sheet1").Activate
        Cells.Select
        Selection.Copy
        Windows("2.ตัดสรุป จ่ายแหล่งผลิต.xlsm").Activate '<<สมุดงานนี้จะเปิดอยู่ตอนรันโค๊ดครับ
        Cells.Select
        ActiveSheet.Paste
        Range("A1").Select
        Application.ScreenUpdating = True
End Sub 
Windows("Sheet1") คือ รายงานที่ออกมาจากโปรแกรมในรูปแบบสมุดงาน Excel ครับ โดยที่ยังไม่ได้ทำการ Save ครับ เท่าที่สังเกตการทำงานของโค๊ดในเครื่องที่ติดปัญหา เหมือนว่าโค๊ดมองไม่เห็นหน้าต่าง ("Sheet1") ครับ ผมจึงสงสัยว่าเป็นปัญหาที่การตั้งค่าของ Excel
หรือไม่ครับทำให้ใช้งานโค๊ดในบางเครื่องไม่ได้ จึงมาสอบถามผู้รู้ครับผม MS ที่ใช้เวอร์ชั่น 2016 ครับ

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Wed Sep 07, 2022 11:27 am
by snasui
:D ลอง Debug ดูว่าเกิดจากปัญหาที่บรรทัดไหน วิธีการ Debug ดูจากโพสต์นี้ครับ viewtopic.php?f=3&t=17483&p=103247#p103247

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Wed Sep 07, 2022 4:39 pm
by sosadboy
snasui wrote: Wed Sep 07, 2022 11:27 am :D ลอง Debug ดูว่าเกิดจากปัญหาที่บรรทัดไหน วิธีการ Debug ดูจากโพสต์นี้ครับ viewtopic.php?f=3&t=17483&p=103247#p103247
error ตรงบรรทัดนี้ครับ

Code: Select all

     Windows("Sheet1").Activate 
ขึ้นข้อความ Alert ว่า "Run-time error '9': Subscript out of range" ครับ

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Wed Sep 07, 2022 4:55 pm
by snasui
:D ลองทำดังนี้ครับ

เปิดไฟล์โปรแแกรมและไฟล์ Sheet1 แค่ 2 ไฟล์ > ไปที่ไฟล์โปรแกรม > เข้าหน้าต่าง VBE (หากอยู่ที่ Excel กดแป้น Alt+F11) > กดแป้น Ctrl+G เพื่อเปิดหน้าต่าง Immediate Windows > คีย์ ?Windows("Sheet1").Name > Enter สังเกตผลลัพธ์ที่ได้

คีย์เป็น ?Windows(1).Name > Enter สังเกตผลลัพธ์ที่ได้

เปลี่ยนเลข 1 เป็น 2 สังเกตดูผล

คำตอบที่ควรได้คือ ชื่อไฟล์ Book1 ที่ถูกต้องกับชื่อไฟล์โปรแกรมที่ถูกต้อง เมื่อได้ชื่อไฟล์ Sheet1 ที่ถูกต้องแล้วค่อยนำไปแทนที่ใน Statement Windows("Sheet1").Activate

Code นี้ยังขาดบรรทัดที่ควรมีอีก 1 บรรทัด นั่นคือเมื่อWindows("Sheet1").Activate เป็นการทำให้ไฟล์ Sheet1 Active ขึ้นมาเพื่อใช้งาน ก่อนที่จะ เป็น Cells.Select ควรเป็น Worksheets("xyz").Select เสียก่อนเพื่อบอกว่าทำงานกับชีต xyz หากไม่มีบรรทัดนี้โปรแกรมจะทราบได้อย่างไรว่าทำงานกับชีตไหน ลองบันทึก Macro ดูใหม่เพื่อตรวจสอบว่ามีการ Generate Code มาครบถ้วนแล้วครับ

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Fri Sep 09, 2022 10:26 am
by sosadboy
ขอบคุณครับ จะลองทำตามที่อาจารย์ แล้วรายงานผลให้ทราบครับ

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Fri Sep 09, 2022 4:02 pm
by sosadboy
snasui wrote: Wed Sep 07, 2022 4:55 pm :D ลองทำดังนี้ครับ

เปิดไฟล์โปรแแกรมและไฟล์ Sheet1 แค่ 2 ไฟล์ > ไปที่ไฟล์โปรแกรม > เข้าหน้าต่าง VBE (หากอยู่ที่ Excel กดแป้น Alt+F11) > กดแป้น Ctrl+G เพื่อเปิดหน้าต่าง Immediate Windows > คีย์ ?Windows("Sheet1").Name > Enter สังเกตผลลัพธ์ที่ได้

คีย์เป็น ?Windows(1).Name > Enter สังเกตผลลัพธ์ที่ได้

เปลี่ยนเลข 1 เป็น 2 สังเกตดูผล

คำตอบที่ควรได้คือ ชื่อไฟล์ Book1 ที่ถูกต้องกับชื่อไฟล์โปรแกรมที่ถูกต้อง เมื่อได้ชื่อไฟล์ Sheet1 ที่ถูกต้องแล้วค่อยนำไปแทนที่ใน Statement Windows("Sheet1").Activate

Code นี้ยังขาดบรรทัดที่ควรมีอีก 1 บรรทัด นั่นคือเมื่อWindows("Sheet1").Activate เป็นการทำให้ไฟล์ Sheet1 Active ขึ้นมาเพื่อใช้งาน ก่อนที่จะ เป็น Cells.Select ควรเป็น Worksheets("xyz").Select เสียก่อนเพื่อบอกว่าทำงานกับชีต xyz หากไม่มีบรรทัดนี้โปรแกรมจะทราบได้อย่างไรว่าทำงานกับชีตไหน ลองบันทึก Macro ดูใหม่เพื่อตรวจสอบว่ามีการ Generate Code มาครบถ้วนแล้วครับ
ลองทำตามที่อาจารย์แนะนำแล้วพบว่ายังพบปัญหาเหมือนเดิมครับ เลยลองค้นหาในเพจต่างชาติ จากที่ผมลองทำตามเท่าที่แปลได้ปรากฏว่าเขาแนะนำให้เปิดไฟล์ที่เป็นไฟล์โปรแกรมผ่านเมนู File>Open แล้วกดรันโค๊ดถึงจะสามารถรันโค๊ดได้โดยไม่มี error ครับ เนื่อง
จากไม่เก่งภาษาอังกฤษผมเลยไม่แน่ใจว่าจะอธิบายวิธีการแก้ไขนี้ว่าอย่างไรครับ เพียงแค่ทำตามที่เขาแนะนำเท่าที่พอแปลออกครับผม
ถ้าเป็นไปได้ อยากขอให้อาจารย์อธิบายเพิ่มในส่วนนี้ให้หน่อยครับ ว่าการที่เราเปิดไฟล์ผ่านเมนู File>Open แตกต่างจากที่เราเปิดไฟล์
โปรแกรมผ่านไอคอนของไฟล์อย่างไรครับผม เพื่อเป็นแนวทางในการศึกษาเรื่อง VBA ต่อไปครับ ขอบคุณครับผม

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Fri Sep 09, 2022 11:25 pm
by snasui
:o ผมลืมแก้คำว่า Windows เป็น Workbooks แต่ก็ยินดีด้วยที่ได้คำตอบแล้วครับ

สำหรับการเปิดด้วยการ Double Click จะแตกต่างจากการเปิดผ่านเมนู File เพราะเราสามารถกำหนดใน Excel ได้ว่าให้ปฏิเสธการเปิดด้วย Application อื่นที่ใช้ DDE หรือไม่ โดยเข้าผ่านเมนู File > Options > Advanced > ที่ General คลิกที่ Ignore other applications that use Dynamic Data Exchange (DDE)

การเปิดด้วยการ Double click ใน File Explorer ถือเป็นการเปิดด้วย Other Application การส่งผ่านข้อมูลด้วย Protocol DDE อาจถูกปิดกั้น ใน Version ก่อน ๆ ในอดีต หากกำหนดไว้เช่นนี้จะเปิดไฟล์ไม่ขึ้น ปัจจุบันลองด้วย O365 สามารถเปิดไฟล์ได้แต่ยังไม่เคยทดสอบว่าเรียกใช้ด้วย VBA แล้วจะมีปัญหาเช่นที่ถามมานี้หรือไม่ครับ

Re: คัดลอกข้อมูลจากสมุดงานที่สร้างใหม่ไปยังสมุดงานอื่นไม่ได้

Posted: Sat Sep 10, 2022 4:08 pm
by sosadboy
snasui wrote: Fri Sep 09, 2022 11:25 pm :o ผมลืมแก้คำว่า Windows เป็น Workbooks แต่ก็ยินดีด้วยที่ได้คำตอบแล้วครับ

สำหรับการเปิดด้วยการ Double Click จะแตกต่างจากการเปิดผ่านเมนู File เพราะเราสามารถกำหนดใน Excel ได้ว่าให้ปฏิเสธการเปิดด้วย Application อื่นที่ใช้ DDE หรือไม่ โดยเข้าผ่านเมนู File > Options > Advanced > ที่ General คลิกที่ Ignore other applications that use Dynamic Data Exchange (DDE)

การเปิดด้วยการ Double click ใน File Explorer ถือเป็นการเปิดด้วย Other Application การส่งผ่านข้อมูลด้วย Protocol DDE อาจถูกปิดกั้น ใน Version ก่อน ๆ ในอดีต หากกำหนดไว้เช่นนี้จะเปิดไฟล์ไม่ขึ้น ปัจจุบันลองด้วย O365 สามารถเปิดไฟล์ได้แต่ยังไม่เคยทดสอบว่าเรียกใช้ด้วย VBA แล้วจะมีปัญหาเช่นที่ถามมานี้หรือไม่ครับ
ขอบคุณครับผม สำหรับความรู้และคำแนะนำ จะนำไปปรับปรุงและใช้งานต่อไปครับผม