Lấy dữ liệu từ 1 file Excel khách đang đóng

Liên hệ QC

Cuongnv0920

Thành viên chính thức
Tham gia
24/3/18
Bài viết
62
Được thích
8
Giới tính
Nam
Mã:
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 ạ?
.......
Nếu đã lưu file ở một Folder khác thì nên dùng :
Mã:
Application.FileDialog(msoFileDialogFolderPicker).SelectedItems.item(1)
để lấy Path folder.


--> @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
----------------------------------------------------------------------
Kiểm thử kết quả Mảng trong Immediate với hàm dbPrint
----------------------------------------------------------------------
 
Lần chỉnh sửa cuối:
Upvote 0
--> @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

Nếu đã lưu file ở một Folder khác thì nên dùng :
Mã:
Application.FileDialog(msoFileDialogFolderPicker).SelectedItems.item(1)
để lấy Path folder.


--> @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

Xin chào minahnh0011,
Wow trong topic này thấy OT code nhiều đấy
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.
 
Upvote 0
Upvote 0
--> @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

Nếu đã lưu file ở một Folder khác thì nên dùng :
Mã:
Application.FileDialog(msoFileDialogFolderPicker).SelectedItems.item(1)
để lấy Path folder.


--> @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 ạ

Em xin cảm ơn nhiều ơi là nhiều
 
Upvote 0
Chào các anh /chi

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ị.

Trân trọng
 

File đính kèm

  • QLHV - 1.xlsx
    24.1 KB · Đọc: 1
  • Tong QLHV.xlsx
    25 KB · Đọc: 1
Upvote 0
Xin chào anh79_ct, bạn thử như sau:
Trong cửa sổ VBA, tại ThisWorkbook bạn thêm đoạn code:
Mã:
Private Sub Workbook_Open()
    Call Button2_Click
End Sub
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?
 
Upvote 0
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?
Thì tìm kiếm chủ đề khác, hoặc lập chủ đề mới để hỏi, còn ở đây chủ đề
Lấy dữ liệu từ 1 file Excel khác đang đóng
 
Upvote 0
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?

Theo những gì Oanh Thơ đang biết thì không thể sảy ra trường hợp này:
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.
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 ạ.
 
Upvote 0
@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.
 
Upvote 0
@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.

Oanh Thơ cũng chỉ tạm hiểu theo cách gọi như ở bài #18 ạ.

Phải chăng ý của HeSanbi là OT sử dụng tiếng Việt và Anh lẫn lộn ạ?

Hic...
 
Upvote 0
Oanh Thơ cũng chỉ tạm hiểu theo cách gọi như ở bài #18 ạ.

Phải chăng ý của HeSanbi là OT sử dụng tiếng Việt và Anh lẫn lộn ạ?

Hic...
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ứ
 
Lần chỉnh sửa cuối:
Upvote 0
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 ạ :)
 
Upvote 0
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ở :)
 

File đính kèm

  • Book1-1.xlsm
    668.9 KB · Đọc: 13
  • Part list (Updated).xls
    947.5 KB · Đọc: 12
Upvote 0
@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ở :)

Trong Sub importData_test(ten_bat_ky As String) của file "Book1-1.xlsm"
Bạn xóa dòng:

là được
 
Upvote 0
Upvote 0
Thế này mất chức năng đóng file rồi.Sao không kiểm tra điều kiện.Nếu File đã mở rồi thì không đóng.Mà file mở bằng code thì sẽ đóng.
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
 
Upvote 0
Web KT
Back
Top Bottom