Page 1 of 2
ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเดิม
Posted: Mon Apr 29, 2013 9:47 am
by P1649
Data.xls มีการ update ทุก 30 นาที (ไฟล์นี้มีแล้ว)
มีความต้องการให้ Link Data.xls นำข้อมูลจาก Data.xls มาบันทึกเรียงต่อกันไปทุก 30 นาที
ขอความกรุณาจากอาจารย์ด้วยครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Mon Apr 29, 2013 10:44 am
by snasui
หากนำมาต่อกันอัตโนมัติ ต้องใช้ VBA ครับ
ถ้าไม่อัตโนมัติ นั่นหมายถึงว่าบรรทัดที่ 1 จะต้องคีย์ด้วยมือเองเพื่อจะบอกว่าเป็นข้อมูลของไฟล์ไหน ไม่ทราบต้องการแบบใดครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Mon Apr 29, 2013 2:41 pm
by P1649
ข้อมูลมีจำนวนมาก ต้องการดึงโดยอัตโนมัติ บันทึกเรียงต่อกับไปในแนว column ทุก 30 นาทีครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Mon Apr 29, 2013 2:48 pm
by snasui
การทำเช่นนั้นต้องใช้ VBA ในการจัดการ ต้องเขียนมาเอง ติดตรงไหนค่อยถามกันครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Wed May 01, 2013 7:57 am
by P1649
Code: Select all
Sub run_macro()
Dim on_time As Date
on_time = Now + TimeValue("00:01:00") ' currently its 1 min chnage it
Application.OnTime on_time, "run_macro"
Call add_Data
End Sub
Sub add_Data()
Dim wk As Workbook
'Set wk = Workbooks.Open("C:\Users\admin\Downloads\Link Data.xlsx")
Set wk = Workbooks.Open("D:\Test Link\Link Data.xlsx")
'wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = ThisWorkbook.Sheets(1).Range("a1").Value
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
ThisWorkbook.Sheets(1).Range("A1:A25").Copy Destination:=wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
ThisWorkbook.Sheets(1).Range("B1:B25").Copy Destination:=wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
wk.Save
wk.Close
End Sub
จากโคดข้างต้น มีปัญหา ขอการแก้ไขดังนี้ครับ
1. เริ่มเปิดไฟล์มา VBA ไม่ทำงานจนกว่า จะมีการกด run ใน script ขอแก้ไขให้ทำงานตั้งแต่เปิดไฟล์
2. ไม่ต้องการปิดไฟล์ Link Data.xlsx เพื่อการ monitor
ขอบคุณครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Wed May 01, 2013 8:48 am
by snasui
ใน Module
ThisWorkbook
ก็ต้องใส่ Code ที่เคยโพสต์ไว้เดิมด้วยครับ
จาก Code ที่โพสต์มา ลองปรับเป็นตามด้านล่างครับ
Code: Select all
Sub run_macro()
Dim on_time As Date
on_time = Now + TimeValue("00:01:00") ' currently its 1 min change it
Application.OnTime on_time, "run_macro"
Call add_Data
End Sub
Sub add_Data()
Dim wk As Workbook, wb As Workbook
Dim CurrBook As Workbook, CheckFile As Boolean
For Each wb In Workbooks
If wb.Name = "Link Data.xlsx" Then CheckFile = True
Next wb
Set CurrBook = ThisWorkbook
If CheckFile = True Then
Set wk = Workbooks("Link Data.xlsx")
Else
Set wk = Workbooks.Open("D:\Test Link\Link Data.xlsx")
End If
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value _
= Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(1).Range("A1:B25").Copy _
Destination:=wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
wk.Save
'wk.Close
End Sub
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Wed May 01, 2013 10:06 am
by P1649
Module ThisWorkBook
Code: Select all
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Application.OnTime nTime, "SaveFile", , False
Application.OnTime on_time, "run_macro", , False
End Sub
Private Sub Workbook_Open()
'Call SaveFile
Call run_macro
End Sub
run-time error 1004
Close file มี error ครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Wed May 01, 2013 10:20 am
by snasui
ประกาศตัวแปร
on_time
ให้เป็น Public ด้วยครับ ให้สังเกตว่าโพสต์เดิมมีการประกาศและใช้ตัวแปร
nTime
อย่างไร โพสต์นี้ก็ให้ทำลักษณะนั้นครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 2:14 pm
by P1649
CurrBook.Sheets(1).Range("A1:B25").Copy Destination:=wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
ต้องการ copy มาเป็น Data เช่น ตัวอักษร หรือ ตัวเลข ไม่ต้องการ link ไปที่ ข้อมูลครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 2:26 pm
by snasui
อ่านแล้วไม่กระจ่างครับ
การ Copy สามารถวางได้หลายแบบ เช่น วางข้อมูล วางสูตร วางรูปแบบ วางสลับแกน หรือวางแบบ Link ก็ได้
ที่ถามมานี้ต้องการจะวางเฉพาะค่า ไม่ต้องการวางสูตรใช่หรือไม่ครับ หากใช่สามารถปรับ Code เป็น
Code: Select all
CurrBook.Sheets(1).Range("A1:B25").Copy
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 3:30 pm
by P1649
Code: Select all
Public nTime As Double
Sub SaveFile()
Dim nTime As Date
nTime = Now + TimeValue("00:01:00") ' currently its 1 min change it
Application.OnTime nTime, "SaveFile"
Call Copy_Data
End Sub
Sub Copy_Data()
Dim wk As Workbook, wb As Workbook
Dim CurrBook As Workbook, CheckFile As Boolean
For Each wb In Workbooks
If wb.Name = "Link Data.xlsx" Then CheckFile = True
Next wb
Set CurrBook = ThisWorkbook
If CheckFile = True Then
Set wk = Workbooks("Link Data.xlsx")
Else
Set wk = Workbooks.Open("D:\SET Backup\Link Data.xlsx")
End If
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(3).Range("d2:d51").Copy wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
'CurrBook.Sheets(3).Range("j2:j51").Copy wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1)
CurrBook.Sheets(3).Range("d2:d51").Copy wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
'wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(3).Range("d56:d105").Copy wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1)
'CurrBook.Sheets(3).Range("j56:j105").Copy wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1)
'wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(4).Range("d2:d51").Copy wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1)
'CurrBook.Sheets(4).Range("j2:j51").Copy wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1)
'wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(4).Range("d56:d105").Copy wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1)
'CurrBook.Sheets(4).Range("j56:j105").Copy wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1)
wk.Save
'wk.Close
End Sub
ต้องการวางข้อมูลครับ แต่ยัง error ในส่วนของ PasteSpecial xlPasteValues
ขอรบกวนช่วยแนะนำด้วยครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 4:03 pm
by snasui
สังเกตว่า Code ที่ผมเขียนเป็นตัวอย่าง จะแยกการ Copy และการวางไว้คนละบรรทัด ไม่ได้วางต่อในบรรทัดเดียวกันครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 4:52 pm
by P1649
ตามนี้ ผมยังแก้ error เมื่อปิดไฟล์ยังไม่ได้เลย ทั้งที่ประกาศ nTime เป็น Public แล้ว ขอรบกวนด้วยครับ
ThisWorkbook
Code: Select all
Public nTime As Double
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime nTime, "SaveFile", , False
End Sub
Private Sub Workbook_Open()
Call SaveFile
End Sub
Module1
Code: Select all
Sub SaveFile()
Dim nTime As Date
nTime = Now + TimeValue("00:01:00") ' currently its 1 min change it
Application.OnTime nTime, "SaveFile"
Call Copy_Data
End Sub
Sub Copy_Data()
Dim wk As Workbook, wb As Workbook
Dim CurrBook As Workbook, CheckFile As Boolean
For Each wb In Workbooks
If wb.Name = "Link Data.xlsx" Then CheckFile = True
Next wb
Set CurrBook = ThisWorkbook
If CheckFile = True Then
Set wk = Workbooks("Link Data.xlsx")
Else
Set wk = Workbooks.Open("D:\SET Backup\Link Data.xlsx")
End If
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(3).Range("d2:d51").Copy
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(3).Range("j2:j51").Copy
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(3).Range("d56:d105").Copy
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(3).Range("j56:j105").Copy
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(4).Range("d2:d51").Copy
wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(4).Range("j2:j51").Copy
wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(4).Range("d56:d105").Copy
wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(4).Range("j56:j105").Copy
wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Save
'wk.Close
End Sub
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 5:02 pm
by snasui
ลองแนบไฟล์ที่ Update ล่าสุดมาดูกัน แจ้งด้วยว่าปัญหา Error ที่เกิดเป็นแบบใดครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 5:20 pm
by snasui
จาก Code
Code: Select all
Sub SaveFile()
Dim nTime As Date
nTime = Now + TimeValue("00:01:00") ' currently its 1 min change it
Application.OnTime nTime, "SaveFile"
Call Copy_Data
End Sub
ให้นำ nTime ออกไปประกาศไว้ที่ Public ครับ การนำมาประกาศไว้ด้านใน Procedure ถือเป็น Private และใช้ใน Procedure SaveFile เท่านั้น เมื่อปิดไฟล์จึงเป็นปัญหาได้ครับ นอกจากนี้ควรประกาศไว้ที่ใดทีหนึ่ง อย่าประกาศซ้ำซ้อน ไม่เช่นนั้นตัวที่ประกาศเป็น Public จะถูกแทนด้วย Private
คร่าว ๆ สำหรับการประกาศตัวแปรครับ
Public คือประกาศแล้วใช้ร่วมกันทั้ง Project
Private คือประกาศแล้วใช้ใน Module ใด ๆ หรือ Procedure ใด ๆ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Sun May 12, 2013 10:23 pm
by P1649
nTime แยกออกไปก็ใช้งานได้ครับ มีเพิ่มเติมคือ ต้องการปิดไฟล์ เวลา 16.00 โดยการเพิ่มเงื่อนไข พบว่า wk.close ทำงานด้วยการปิดไฟล์ แต่ไฟล์หลักยังคงเปิดทำงาน ขอรบกวนช่วยแนะนำด้วยครับ
Code: Select all
Sub Copy_Data
.
.
.
If Now > TimeValue("16:00:00") Then
wk.Close
Exit Sub
End If
End Sub
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Mon May 13, 2013 5:21 pm
by snasui
กรณีต้องการให้ปิดเมื่อถึงเวลาที่กำหนดลองปรับ Code เป็นตามด้านล่างครับ
Code: Select all
Sub Copy_Data
'Other code
If Now > Date + TimeValue("16:00:00") Then
Application.OnTime nTime, "SaveFile", , False
wk.save
wk.Close
Exit Sub
End If
End Sub
กรณีต้องการจะ Save และปิดหลายไฟล์ก็ระบุไฟล์ที่ต้องการ Save และปิดเอาไว้ใน Code ครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Thu May 16, 2013 10:40 pm
by P1649
เงื่อนไขการปิดไฟล์ เวลาหลังจาก 16.00 ยังไม่ทำงาน ขอรบกวนอีกครั้งครับ
Code: Select all
Public nTime As Date
Sub SaveFile()
nTime = Now + TimeValue("00:15:00") ' currently its 15 min change it
Application.OnTime nTime, "SaveFile"
Call Copy_Data
End Sub
Sub Copy_Data()
Dim wk As Workbook, wb As Workbook
Dim CurrBook As Workbook, CheckFile As Boolean
For Each wb In Workbooks
If wb.Name = "Link Data.xlsx" Then CheckFile = True
Next wb
Set CurrBook = ThisWorkbook
If CheckFile = True Then
Set wk = Workbooks("Link Data.xlsx")
Else
Set wk = Workbooks.Open("D:\SET Backup\Link Data.xlsx")
End If
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(3).Range("d2:d51").Copy
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(3).Range("j2:j51").Copy
wk.Sheets(1).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
CurrBook.Sheets(3).Range("d56:d105").Copy
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
CurrBook.Sheets(3).Range("j56:j105").Copy
wk.Sheets(2).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
'wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(4).Range("d2:d51").Copy
'wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
'CurrBook.Sheets(4).Range("j2:j51").Copy
'wk.Sheets(3).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
'wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(-1, 1).Value = Format(Now, "yyyy-mm-dd hh-mm-ss")
'CurrBook.Sheets(4).Range("d56:d105").Copy
'wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
'CurrBook.Sheets(4).Range("j56:j105").Copy
'wk.Sheets(4).Range("xfd2").End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
wk.Save
'wk.Close
If Now > Date + TimeValue("16:00:00") Then
Application.OnTime nTime, "SaveFile", , False
wk.Save
wk.Close
Exit Sub
End If
End Sub
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Thu May 16, 2013 10:43 pm
by snasui
แนบไฟล์ตัวอย่างมาด้วยเพื่อจะได้ช่วยทดสอบได้ครับ นอกจากนี้ลองตรวจสอบเพิ่มเติมมาด้วยครับว่าเครื่องที่ใช้นั้นกำหนด Regional and Language ไว้เป็นไทยหรือเป็นอย่างอื่นครับ
Re: ดึงข้อมูลจากไฟล์อื่นมาบันทึกทุก 30 นาทีแบบไม่ทับข้อมูลเด
Posted: Thu May 16, 2013 11:28 pm
by P1649
กำหนดให้ ปิดไฟล์หลังจากเวลา 16.00.00 ยังไม่ทำงานครับ