Sub importData_test()
Dim owb As Workbook
Dim sh As Worksheet
Set sh = Sheet1
'mở file cần lấy dữ liệu
Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
'copy vùng dữ liệu cần lấy
owb.Sheets("Data").Range("C1:G200").Copy
'dán vào vũng cần lấy kết quá
sh.Range("A1").PasteSpecial xlPasteAll
owb.Close False
End Sub
Trong trường hợp này thì sheet cần lấy dữ liệu phải có tên là "Data"
nhưng mình muốn nhờ mọi người giúp trong trường hợp Sheets"Data" là 1 cái tên bất kỳ mà vẫn lấy được dữ liệu
mong mọi người giúp ạ.
Bạn thử chạy code sau xem có đúng ý không ạ, bạn chú ý cho tất cả các file source có cấu trúc giống nhau vào cùng thư mục với file target nhé:
Mã:
Sub LayDuLieu_2()
Dim WB As Workbook, Fso As Object, FileItem As Object, MainWB As Workbook, sh As Worksheet
Const source_SheetName As String = "Checked Data": Const target_SheetName As String = "Develop-for-SC"
Set MainWB = ThisWorkbook: Set Fso = CreateObject("Scripting.FileSystemObject")
For Each FileItem In Fso.GetFolder(ThisWorkbook.Path).Files
If FileItem.Name <> ThisWorkbook.Name And Left(FileItem.Name, 1) <> "~" Then
Set WB = Workbooks.Open(FileItem.Path): Set sh = MainWB.Worksheets(target_SheetName)
WB.Sheets(source_SheetName).Range("e16:q28").Copy sh.Range("e" & sh.Range("e65000").End(3).Row + 1)
WB.Close False
End If
Next FileItem
Set FileItem = Nothing: Set Fso = Nothing
End Sub
--> @Nguyễn Hoàng Oanh Thơ
Wow trong topic này thấy OT code nhiều đấy.
Vì chỉ đọc các dữ liệu nên:
Mã:
Set WB = Workbooks.Open(FileItem.Path, True, True)
Để chỉ đọc và không mở Workbook
Tìm một hướng khác thay cho Copy
Và OT nên liệt kê các Path của file cần lấy dữ liệu vào 1 sheet.
dùng Event Selection để chọn Path / All Path rồi lấy dữ liệu. Để đạt yêu cầu dưới
Dạ, mình lại "đòi xôi gấc ạ" nghĩa là click Button "Upload data" và cho chọn file để upload các dòng này được không ạ? file mới nhất sẽ upload vào các dòng kế tiếp các dòng này – được không ạ?
.......
--> @chuotpt3
Sau khi đã thực hiện lấy dữ liệu xong tôi nghĩ bạn cần có 1 sheet lưu lại lịch sử. Để nhở mà dữ liệu đến vài ngàn, chục ngàn. thì còn biết file đó ai làm, ai upload
Nếu bạn muốn excel tự động chạy tìm duyệt Nếu có file mới thì tự động get vào thì dùng:
Mã:
'Code Events cho Sheet2'
'Chọn ô A1 để tự động On / Off'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([A1], Target) Is Nothing And Not IsArray(Selection) Then
If LCase([A1]) = "off" Then
[A1] = "on"
StartFind_1
Else
[A1] = "off"
End If
End If
End Sub
'Code Module'
Sub StartFind_1()
If Sheet2.[A1].value = "off" Then StopTimer: Exit Sub
'Code / Sub tìm file mới ở đây
StartFind_2
End Sub
Sub StartFind_2()
'Thay đổi' thời gian mỗi lần duyệt TimeValue("00:00:01")
Application.OnTime Now + TimeValue("00:00:01"), "StartFind_1"
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), Procedure:="StartFind_1", Schedule:=False
End Sub
--> @Nguyễn Hoàng Oanh Thơ
Wow trong topic này thấy OT code nhiều đấy.
Vì chỉ đọc các dữ liệu nên:
Mã:
Set WB = Workbooks.Open(FileItem.Path, True, True)
Để chỉ đọc và không mở Workbook
Tìm một hướng khác thay cho Copy
Và OT nên liệt kê các Path của file cần lấy dữ liệu vào 1 sheet.
dùng Event Selection để chọn Path / All Path rồi lấy dữ liệu. Để đạt yêu cầu dưới
--> @chuotpt3
Sau khi đã thực hiện lấy dữ liệu xong tôi nghĩ bạn cần có 1 sheet lưu lại lịch sử. Để nhở mà dữ liệu đến vài ngàn, chục ngàn. thì còn biết file đó ai làm, ai upload
Nếu bạn muốn excel tự động chạy tìm duyệt Nếu có file mới thì tự động get vào thì dùng:
Mã:
'Code Events cho Sheet2'
'Chọn ô A1 để tự động On / Off'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([A1], Target) Is Nothing And Not IsArray(Selection) Then
If LCase([A1]) = "off" Then
[A1] = "on"
StartFind_1
Else
[A1] = "off"
End If
End If
End Sub
'Code Module'
Sub StartFind_1()
If Sheet2.[A1].value = "off" Then StopTimer: Exit Sub
'Code / Sub tìm file mới ở đây
StartFind_2
End Sub
Sub StartFind_2()
'Thay đổi' thời gian mỗi lần duyệt TimeValue("00:00:01")
Application.OnTime Now + TimeValue("00:00:01"), "StartFind_1"
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), Procedure:="StartFind_1", Schedule:=False
End Sub
Chỉ là OT copy code của các anh chị trên đây rồi sửa sửa thôi ạ
Nhiều code nhưng chưa có đoạn nào vừa ý @chuotpt3 cả hihi
Cảm ơn các đoạn code trên của bạn, hiện OT chưa hiểu những đoạn code đó, nhưng OT sẽ cố gắng dành thời gian để tìm hiểu.
Một lần nữa cảm ơn minahnh0011 đã quan tâm.
Ôi....mình cảm ơn cả nhà nhiều ơi là nhiều ạ........Đúng ý luôn ạ
==========
Vì chỗ này đang có topic nên mình post vào đây – mình có post một trường hợp nữa kính nhờ các bạn giúp đỡ với ạ – mình post ở đây
--> @Nguyễn Hoàng Oanh Thơ
Wow trong topic này thấy OT code nhiều đấy.
Vì chỉ đọc các dữ liệu nên:
Mã:
Set WB = Workbooks.Open(FileItem.Path, True, True)
Để chỉ đọc và không mở Workbook
Tìm một hướng khác thay cho Copy
Và OT nên liệt kê các Path của file cần lấy dữ liệu vào 1 sheet.
dùng Event Selection để chọn Path / All Path rồi lấy dữ liệu. Để đạt yêu cầu dưới
--> @chuotpt3
Sau khi đã thực hiện lấy dữ liệu xong tôi nghĩ bạn cần có 1 sheet lưu lại lịch sử. Để nhở mà dữ liệu đến vài ngàn, chục ngàn. thì còn biết file đó ai làm, ai upload
Nếu bạn muốn excel tự động chạy tìm duyệt Nếu có file mới thì tự động get vào thì dùng:
Mã:
'Code Events cho Sheet2'
'Chọn ô A1 để tự động On / Off'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([A1], Target) Is Nothing And Not IsArray(Selection) Then
If LCase([A1]) = "off" Then
[A1] = "on"
StartFind_1
Else
[A1] = "off"
End If
End If
End Sub
'Code Module'
Sub StartFind_1()
If Sheet2.[A1].value = "off" Then StopTimer: Exit Sub
'Code / Sub tìm file mới ở đây
StartFind_2
End Sub
Sub StartFind_2()
'Thay đổi' thời gian mỗi lần duyệt TimeValue("00:00:01")
Application.OnTime Now + TimeValue("00:00:01"), "StartFind_1"
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), Procedure:="StartFind_1", Schedule:=False
End Sub
Trong post nào đó em có ghi nhận là trường hợp mình copy dòng cuối cùng của từng File source vào File Target được không ạ?
Vì khi đó file Target đã có hòm hòm dữ liệu rồi ạ
Mình có 1 file tổng và 1 file con, Không biết làm cách nào đề chuyển dữ liệu từ sheet của file con vào sheet của file tổng. Minh có áp dụng code trên nhưng khi chạyma61a61t luôn tiêu đề của các cot và dữ liệu cũng không gọp được. Rất mong được sự giúp đỡ của các anh chị.
Bạn ơi, ví dụ file nguồn đang mở, khi mở file đích thì nó tự đóng file nguồn luôn, như vậy lại ảnh hưởng đến người khác đang mở file nguồn. Vậy có cách nào nó chỉ lấy dữ liệu (lưu cuối cùng) bất kể file nguồn đang mở hay đóng không?
Bạn ơi, ví dụ file nguồn đang mở, khi mở file đích thì nó tự đóng file nguồn luôn, như vậy lại ảnh hưởng đến người khác đang mở file nguồn. Vậy có cách nào nó chỉ lấy dữ liệu (lưu cuối cùng) bất kể file nguồn đang mở hay đóng không?
Bạn ơi, ví dụ file nguồn đang mở, khi mở file đích thì nó tự đóng file nguồn luôn, như vậy lại ảnh hưởng đến người khác đang mở file nguồn. Vậy có cách nào nó chỉ lấy dữ liệu (lưu cuối cùng) bất kể file nguồn đang mở hay đóng không?
Khi mở tập tin ở chế độ share full nếu có người đang mở thì người mở sau chỉ là chế độ readonly thôi chứ làm sao mà ảnh hưởng đến người khác đang mở file nguồn được nhỉ.
Bạn kiểm tra lại xem sao ạ.
@Nguyễn Hoàng Oanh Thơ
OT có thể giải thích cho tôi được hiểu tí về các cách gọi, vì tôi chậm hiểu thuật ngữ lắm:
1. File nguồn
2. File Đích
3. share full
bạn anh79_ct hỏi gì mà đích đích nguồn nguồn. Vậy mà OT hiểu.
@Nguyễn Hoàng Oanh Thơ
OT có thể giải thích cho tôi được hiểu tí về các cách gọi, vì tôi chậm hiểu thuật ngữ lắm:
1. File nguồn
2. File Đích
3. share full
bạn anh79_ct hỏi gì mà đích đích nguồn nguồn. Vậy mà OT hiểu.
Hỏi thật. Anh VIệt gì đâu. Không hiểu các thuật ngữ đấy. Thấy OT đọc hiểu nên hỏi. File nguồn là file như thế nào. File gì gọi là file đích
Hiểu mới trả lời bạn ấy được chứ
Hỏi thật. Anh VIệt gì đâu. Không hiểu các thuật ngữ đấy. Thấy OT đọc hiểu nên hỏi. File nguồn là file như thế nào. File gì gọi là file đích
Hiểu mới trả lời bạn ấy được chứ
OT đã tham gia từ đầu chủ đề này nên cũng hiểu máy móc như sau ạ:
File nguồn là file chứa dữ liệu nguồn cần đưa sang một file khác, file khác này gọi là file đích.
Trong chủ đề cũng có bạn gọi là file soure hay file target v. v..
Còn OT hiểu share full: là vì bài 46 bạn ấy mô tả khi mở file đích lên code sẽ tự động lấy dữ liệu ở file nguồn (có trích dẫn code) rồi code tự động đóng file nguồn nên sợ sẽ ảnh hưởng đến người nào đó đang mở.
...
Không biết hiểu như vậy có đúng ý bạn hỏi không ạ
OT đã tham gia từ đầu chủ đề này nên cũng hiểu máy móc như sau ạ:
File nguồn là file chứa dữ liệu nguồn cần đưa sang một file khác, file khác này gọi là file đích.
Trong chủ đề cũng có bạn gọi là file soure hay file target v. v..
Còn OT hiểu share full: là vì bài 46 bạn ấy mô tả khi mở file đích lên code sẽ tự động lấy dữ liệu ở file nguồn (có trích dẫn code) rồi code tự động đóng file nguồn nên sợ sẽ ảnh hưởng đến người nào đó đang mở.
...
Không biết hiểu như vậy có đúng ý bạn hỏi không ạ
@Nguyễn Hoàng Anh Thơ
Ý mình hỏi đúng như bạn nghĩ. Mình giải thích rõ hơn chút.
File đích: là file cần chép dữ liệu đến, và viết code trên file này.
File nguồn: theo như chủ đề ở đây là file đang đóng, cần lấy dữ liệu từ file này. File này mình xuất dữ liệu ra từ phần mềm khác và cập nhập (update) chép đè lên file này hàng tuần nên không thể share full được. Thông thường thì cũng ít khi phải mở ra nhưng vì lúc chạy thử code mình thấy xuất hiện sự việc là nếu đang mở thì nó sẽ bị đóng lại khi mở file đích nên mình có suy nghĩ có cách nào vẫn lấy dữ liệu từ file nguồn và vẫn không đóng nó lại hay không?
Mình gởi 2 file bạn xem thử. Bạn tải xuống và đổi đường dẫn ở ô B1 nhé.
Và tức là thêm một chút cho chủ đề này là lấy dữ liệu từ file đang đóng hoặc mở
@Nguyễn Hoàng Anh Thơ
Ý mình hỏi đúng như bạn nghĩ. Mình giải thích rõ hơn chút.
File đích: là file cần chép dữ liệu đến, và viết code trên file này.
File nguồn: theo như chủ đề ở đây là file đang đóng, cần lấy dữ liệu từ file này. File này mình xuất dữ liệu ra từ phần mềm khác và cập nhập (update) chép đè lên file này hàng tuần nên không thể share full được. Thông thường thì cũng ít khi phải mở ra nhưng vì lúc chạy thử code mình thấy xuất hiện sự việc là nếu đang mở thì nó sẽ bị đóng lại khi mở file đích nên mình có suy nghĩ có cách nào vẫn lấy dữ liệu từ file nguồn và vẫn không đóng nó lại hay không?
Mình gởi 2 file bạn xem thử. Bạn tải xuống và đổi đường dẫn ở ô B1 nhé.
Và tức là thêm một chút cho chủ đề này là lấy dữ liệu từ file đang đóng hoặc mở
Vậy thì copy toàn bộ code sau vào module1 của file "Book1-1.xlsm" xem thế nào ạ:
Mã:
Sub importData_test(ten_bat_ky As String)
Dim owb As Workbook, sh As Worksheet, tenfile As String, source_FileName As String
Application.ScreenUpdating = False
Set sh = ThisWorkbook.Worksheets("Sheet1")
tenfile = sh.Range("B1")
source_FileName = Mid(tenfile, InStrRev(tenfile, "\") + 1)
If bIsBookOpen(source_FileName) Then
Set owb = Workbooks(source_FileName)
owb.Sheets(ten_bat_ky).Range("A1:L30000").Copy
sh.Range("A3").PasteSpecial xlPasteAll
Application.CutCopyMode = False
Else
Set owb = Workbooks.Open(tenfile)
owb.Sheets(ten_bat_ky).Range("A1:L30000").Copy
sh.Range("A3").PasteSpecial xlPasteAll
Application.CutCopyMode = False
owb.Close False
End If
Application.ScreenUpdating = False
End Sub
Function bIsBookOpen(ByRef szBookName As String) As Boolean
On Error Resume Next
bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function
Sub ImportData()
Dim tenSheet As String
tenSheet = ThisWorkbook.Worksheets("Sheet1").Range("B2")
Call importData_test(tenSheet)
End Sub