Page 1 of 3

สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Fri Oct 06, 2017 8:19 am
by nisit2559
คือผมต้องการดึงข้อมูลที่เป็นไฟล์ .csv มาแล้วพอผมเขียนโค้ดให้มันดึงได้แล้วแต่ว่าต้องการดึงทุก1 ชม.มาที่ละสองไฟล์แต่พอมันดึงแล้วช่วงรอ มันจะไม่สามารถทำอย่างอื่นได้เหมือนเครื่องจะค้างแต่ไม่ค้างพอดึงเสร็จก็หายไปทั้งๆที่ CPU ผมก็ I7 ครับแล้วดูในโปรแกรม task manager ก็ใช้ทั้ง ram และ cpu ไม่ถึง 50 %เลยครับจึงอยากจะทราบสาเหตุและวิธีการแก้ไข้ครับ
นี้ครับตัวอย่างโค้ด

Code: Select all

Sub Macro1()
'
' Macro1 Macro
'

'
     Set cell_to = Cells(1, 1)
     Set active_workbook = ActiveWorkbook
     Set active_sheet = ActiveSheet
     Application.DisplayAlerts = False
     File_Path = "D:\MMCT\MMCT\excel\"
     strName = Dir(File_Path & "\" & "*.csv")
     Dim X
     Dim Y
     Dim z
     Y = 2
     X = 2
     Do While strName <> vbNullString
    
        If active_workbook.Name <> strName And strName <> "" Then
            Workbooks.Open Filename:=File_Path & "\" & strName
            Set dataset_workbook = ActiveWorkbook
            Range("Z2:BG31").Select
            RowInc = Selection.Rows.Count
            Selection.Copy
            Windows("workbook1.xlsm").Activate
            Sheets("RawData").Select
            Cells(Y, 2).Select
            ActiveSheet.Paste
            Worksheets("RawData").Cells(X, 1).Value = Now()
            Y = Y + RowInc
            X = X + RowInc
            dataset_workbook.Close
            UserForm1.Hide
            delay 10000
        End If
     strName = Dir
     Loop
     Application.DisplayAlerts = True
     
    End Sub
' Sub Macro2()
ผมทำใน userform ครับเรียกใช้งาน macro1 ครับใช้ 64 bit ครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Fri Oct 06, 2017 8:07 pm
by snasui
:D การทำงานลักษณะนี้จะใช้ Delay หรือใช้การจับเวลาจาก Excel เองแล้วค่อยทำงานมันจะทำให้ Excel ทำงานอยู่ตลอดเวลา เพียงแต่รอคอยเมื่อถึงเวลาที่กำหนดแล้วค่อยทำงานต่อ จึงเป็นอุปสรรคกับการทำงานอย่างอื่น

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

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Mon Oct 09, 2017 7:38 am
by nisit2559
แล้วจะต้องเปิด Excel 2 โปรแกรมนีคือต้องเปิดที่เขียน vba เดียวกันใช่ไหมครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 8:59 am
by snasui
:D คำวา่เปิด 2 โปรแกรมคือเปิด Excel 2 รอบ จะได้ Excel 2 โปแกรม หากเป็น 100 รอบก็จะได้ Excel 100 โปรแกรม คนละอย่างกับเปิด 2 ไฟล์และ 100 ไฟล์ ทั้งสองโปรแกรมจะเปิดไฟล์เดียวกันหรือไม่ก็ดูตามความจำเป็น ปกติถ้าไฟล์ใดเปิดอยู่แล้ว ถ้าเปิดซ้ำมันก็จะฟ้องว่าเปิดอยู่แล้วและสามารถเปิดซ้ำอีกได้

ถ้าหากเปิดโปรแกรม 2 โปรแกรม โดยทั้ง 2 โปรแกรมเปิดไฟล์จับเวลามันก็จะจับเวลาทั้ง 2 โปรแกรม ก็จะค้างทั้ง 2 โปรแกรมเพื่อรอคอย ในเมื่อเปิด 2 โปรแกรมแล้วก็ควรทำงานคนละงานกันไปในแต่ละโปรแกรม เช่น โปรแกรมแรกเปิดไฟล์ทำงาน 100 ไฟล์ โปรแกรมที่สองเปิดเฉพาะไฟล์ที่เป็น VBA ให้ทำงานตามรอบเวลาที่กำหนด เช่นนี้เป็นต้น วิธีเปิดหลายโปรแกรมอ่านจากที่ผมโพสต์ไว้ใน #2 :roll: ครับ

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

การตั้ง Job เข้าเมนู Start > Taks Schedule > Action > Create Task ซึ่งจะไม่ขอลงในรายลเอียดเนื่องจากไม่ใช่ Scope ของ Excel ครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 9:07 am
by nisit2559
ขอบคุณครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 9:28 am
by nisit2559
ผมลองทำตามแล้วครับแยกเปิด2โปรแกรมแต่ก็ยังค้างอยู่ครับแต่ค้างเฉพาะ excel นะครับแต่โปรแกรมอื่นใช้ได้ตามปกติครับมีรูปตัวอย่างในไฟล์แนบครับ
IMG_0817[1].png
IMG_0818[1].png

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 9:38 am
by snasui
:D ภาพเล็กมาก มองไม่ออกว่าเป็นสองโปรแกรม กรณียังติดปัญหาลองใช้วิธีตั้ง Job แทนครับ

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

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 11:03 am
by nisit2559
รูปใหม่ครับ แล้วถ้าจะรันเป็น job นี้ต้องทำอย่างไรบ้างครับ
IMG_0819[1].jpg
IMG_0820[1].jpg

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 11:25 am
by snasui
:D เข้าใจว่าเป็นที่ Version ของ Excel ซึ่งตั้งแต่ 2013 เป็นต้นไปจะมีการจัดการใหม่ เปิดหลายโปรแกรมก็กลายเป็นโปรแกรมเดียวกัน สามารถคัดลอกข้อมูลระหว่างกันได้ตามปกติ ซึ่งใน Version 2010 ลงไปไม่สามารถทำได้

กรณีตั้ง Job เป้นสิ่งที่นอกเหนือ Scope ของ Excel ลอง Search จาก Google หรือ Youtube แล้วทำมาเองก่อน ติดแล้วค่อยถามกันต่อ แต่จะเป็นหมวด Other ไม่ใช่หมวด Excel นี้ ซึ่งเราสามารถตั้ง Job ให้โปรแกรมใด ๆ ทำงานก็ได้ตามต้องการครับ

ความรู้เกี่ยวกับ Task Schedule ครับ :arrow: Windows Task Schedule

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Wed Oct 11, 2017 11:29 am
by nisit2559
ขอบคุณครับงั้นเดียวผมไปศึกษามาแล้วถ้าติดจะมาถามครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Thu Oct 12, 2017 9:19 am
by nisit2559
ผมทำได้แล้วครับแต่จะให้มันเปิดไฟล์ใหม่ได้อย่างไรครับหรือต้องไปสั่งให้มันเปิดทุกวันครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Thu Oct 12, 2017 7:34 pm
by snasui
:D การตั้ง Job สามารถตั้งให้ทำงานเป็นรายระยะเวลาได้ตามต้องการ ไม่ว่าจะราย วัน รายชม. ฯลฯ แต่การที่มันจะทำงานได้ เครื่องที่ตั้ง Job ไว้จะต้องเปิดอยู่เสมอ่ครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Mon Oct 16, 2017 9:18 am
by nisit2559
คือว่าผมต้องการดึงข้อมูลใหม่ตลอด ผมอยากจะทราบว่าเมื่อเปิดไฟล์มาแล้วต้องเขียน VBA อย่างไรให้มันดึงข้อมูลที่เปิดครับโดยชื่อไฟล์จะไม่ซ้ำกันครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Mon Oct 16, 2017 11:15 am
by logic
การใช้ VBA คุณ nisit2559 กรุณาช่วยเขียนมาก่อน เพื่อสมาชิกจึงพอจะช่วยเหลือได้ เป็นกฎของบอร์ดที่ต้องเขียนกันมาเองเสียก่อนครับ :)

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Mon Oct 16, 2017 4:17 pm
by nisit2559
เขียนแล้วครับ

Code: Select all

Sub Macro1()
'
' Macro1 Macro
'

'
     Set cell_to = Cells(1, 1)
     Set active_workbook = ActiveWorkbook
     Set active_sheet = ActiveSheet
     Application.DisplayAlerts = False
     File_Path = "D:\MMCT\MMCT\excel\"
     strName = Dir(File_Path & "\" & "*.csv")
     Dim X
     Dim Y
     Dim z
     Y = 2
     X = 2
     Do While strName <> vbNullString
    
        If active_workbook.Name <> strName And strName <> "" Then
            Workbooks.Open Filename:=File_Path & "\" & strName
            Set dataset_workbook = ActiveWorkbook
            Range("Z2:BG31").Select
            RowInc = Selection.Rows.Count
            Selection.Copy
            Windows("workbook1.xlsm").Activate
            Sheets("RawData").Select
            Cells(Y, 2).Select
            ActiveSheet.Paste
            Worksheets("RawData").Cells(X, 1).Value = Now()
            Y = Y + RowInc
            X = X + RowInc
            dataset_workbook.Close
            UserForm1.Hide
            delay 10000
        End If
     strName = Dir
     Loop
     Application.DisplayAlerts = True
     
    End Sub

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Mon Oct 16, 2017 6:37 pm
by snasui
:D Code ที่เขียนมามัน Loop ทุกไฟล์ซึ่งไม่น่าจะซ้ำกันได้อยู่แล้ว

ช่วยลำดับปัญหาที่เป็นมาอีกรอบว่าเป็นปัญหาตรงไหน อย่างไร จะได้เข้าใจตรงกันครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Tue Oct 17, 2017 8:04 am
by nisit2559
โค้ดของพอมันวนลูปเพื่อเปิดไฟล์แล้วมันจะต้องมีตัวนับเวลาเพื่อเป็นดีเลย์แล้วมันค้างครับผมเลยจะเปลี่ยนไปใช้ job ตามที่อาจารย์บอกแล้วที่นี้ผมอยากจะทราบว่าเมื่อใช้ job เปิดไฟล์แทน VBA แล้วจต้องแก้ไขโค้ดที่ใช้ในการก็อบปี้ไฟล์แล้ววางอย่างไรครับ และใน job นี้เราต้องตั้งให้เปิดไฟล์ทุกครั้งเลยใช่ไหมครับหรือเราสามารถตั้งให้มันวนลูปเปิดไฟล์เองได้หรือไม่ครับ ขอบคุณครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Tue Oct 17, 2017 8:25 pm
by snasui
:D เรื่องการ Delay ให้ลบทิ้งไป ไม่จำเป็นต้องใช้เพราะใช้ Job ในการจัดการ เมื่อถึงเวลา Job จะเปิดไฟล์นี้เอง เมื่อไฟล์นี้ถูกเปิด Code จะทำงานอัตโนมัติ

การให้ Code ทำงานอัตโนมัติจะต้องเขียน Code เพิ่มโดยใช้ Event ที่ชื่อว่า Workbook_Open (Double Click ที่ ThisWorkbook ใน VBA Project ที่ ComboBox Object เลือก Workbook > ที่ ComboBox Procedure เลือก Open) ให้เขียน Code เรียก Code ที่ สำหรับการเปิดไฟล์ไว้ที่ Procedure นี้ดูตัวอย่างตามภาพด้านล่าง
WBOpen.png
ส่วน Job กำหนดให้เปิดไฟล์ในเวลาใดก็ได้ มีความถี่เท่าไรก็ได้แล้วแต่ต้องการ สิ่งสำคัญเมื่อเปิดไฟล์มาแล้ว ไฟล์ทำงานเรียบร้อยแล้ว ให้เขียน Code สำหรับปิดไฟล์เอาไว้ด้วย Job ที่กำหนดไว้จะได้ไม่เปิดไฟล์ซ้ำ ๆ จนเกินความจำเป็นครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Thu Oct 19, 2017 11:38 am
by nisit2559
ขอสอบถามเพิ่มนะครับจากโค้ดผมพอมันเปิดโปรแกรมมารอบสองมันก็ยังไปดึงไฟล์ข้อมูลเก่าครับ ควรจะแก้โค้ดอย่างไรให้ไม่สามรถดึงข้อมูลเก่าได้ครับ

Re: สอบถามเกี่ยวกับโค้ดดึงข้อมูลครับ

Posted: Thu Oct 19, 2017 5:43 pm
by snasui
:D หากไม่ต้องการให้ดึงไฟล์เดิมก็ต้องเขียน Code เพิ่มโดยเก็บข้อมูลไฟล์ที่ดึงเอาไว้แล้วไว้ที่ใดสักที่ ยกตัวอย่างเช่น เก็บไว้ที่ Sheet1 เมื่อมีการดึงใหม่ก็ให้ตรวจสอบกับข้อมูลใน Sheet1 ว่ามีหรือไม่ หากมีก็ให้ข้ามไป เช่นนี้เป็นต้นครับ