code VBA lấy dữ liệu từ nhiều file vào 1 file

alex-luu

Thành viên thường trực
Tham gia ngày
10 Tháng ba 2015
Bài viết
224
Được thích
46
Điểm
185
Xin nhờ các anh chị trên diễn dàn giúp em,

Mỗi tuần lễ, trên văn phòng chính sẽ xuất 1 file báo cáo xuống (mỗi file khoảng 7.000 dòng), cuối tháng em phải lấy nội dung của từng file ( chỉ lấy 9 cột trong mỗi file : cột K , cột R đến cột Y) rồi dán hết vào file tổng hợp .

Kết quả cuối cùng là lấy nội dung cột K, cột R, S , T , U ..... Y (lấy từ hàng thứ 6 trở xuống đến hết nội dung file), dán kết quả này vào sheet KDN của file tổng hợp, (bắt đầu dán ở ô C3), chuyển các số liệu thành number.
tiếp tục hiện lên bảng hỏi mình xem có muốn lấy nữa không, nếu không thì thoát là xong, nếu có thì hỏi đường dẫn đến file kế tiếp, rồi làm như trên, chú ý là dán tiếp theo kể từ hàng cuối cùng của lần dán thứ 1 nhé.
Làm xong hỏi tiếp xem có muốn lấy dữ liệu nữa không..... cứ như thế đến khi nào mình chọn không thì thoát.

Hiện nay em đang phải copy bằng tay từng cột trong từng file rất thủ công (dùng công thức thì không biết trước file 1 kết thúc ở hàng nào để tiếp theo là file thứ 2, với lại, mỗi file report là 1 tên khác nhau (vd : KDN_21_10_2019 2019 09 23 , KDN_21_10_2019 2019 10 14.... )

Có cách nào để tạo 1 nút cập nhật, khi nhấn vào thì nó sẽ hỏi file 1 ở đâu, chỉ đường dẫn đến thì nó chỉ copy đúng nội dung của 9 cột mà mình chỉ định trước , dán qua file tổng hợp, xong hỏi mình có muốn copy tiếp hay không, chọn có thì tiếp tục hỏi đường dẫn file 2 rồi copy và dán nối tiếp sau phần nội dung của file thứ nhất, chọn không thì thoát ra.

Lưu ý : số liệu lấy ra chuyển qua file tổng hợp phải được định dạng lại là number vì còn phải dùng để tính toán (file report gốc không được định dạng là number nên hiện nay mỗi khi copy qua em lại phải dùng hàm value để chuyển nó lại là number)

em xin cảm ơn ạ
 

File đính kèm

Lần chỉnh sửa cuối:

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
9,185
Được thích
10,661
Điểm
1,560
gom 4 file này lại
..
nó sẽ hỏi file 1 ở đâu,
chọn có thì tiếp tục hỏi đường dẫn file 2
chọn không thì thoát ra.
Sao mệt vậy? Túm lại gom luôn một lúc cả cụm hay thích thì chọn 1 vài trong cụm thôi?

mỗi file report là 1 tên khác nhau (vd : KDN120919, KDN091019....)
Có thấy đúng với file đính kèm đâu? "KDN_21_10_2019 2019 "??

Nhiều files thì gửi tối thiểu 2 files để xác định tính đồng nhất. Hoặc ghi rõ ràng ra.
 

alex-luu

Thành viên thường trực
Tham gia ngày
10 Tháng ba 2015
Bài viết
224
Được thích
46
Điểm
185
Sao mệt vậy? Túm lại gom luôn một lúc cả cụm hay thích thì chọn 1 vài trong cụm thôi?


Có thấy đúng với file đính kèm đâu? "KDN_21_10_2019 2019 "??

Nhiều files thì gửi tối thiểu 2 files để xác định tính đồng nhất. Hoặc ghi rõ ràng ra.
Dạ, cảm ơn anh,
Xin lỗi vì em trình bày chưa rõ ràng.
Tức là cuối tháng em sẽ mở file thứ nhất lên, lấy nội dung của cột K, cột R, S , T , U ..... Y rồi dán vào sheet KDN của file tổng hợp (bắt đầu từ ô C2 nhé (cột A, B của file tổng hợp sử dụng cho việc khác)
rồi lại tiếp tục mở file thứ 2 lên, cũng lấy nội dung như trên, dán xuống hàng kế tiếp trong file tổng hợp, rồi tiếp đến file thứ 3 .....

Sau khi dán em còn phải chuyển các giá trị này về number (không biết phần mềm của văn phòng chính nó xuất như thế nào chứ nếu chỉ đơn thuần là copy và dán thì mấy số liệu này không thể dùng để sum hay sumif gì được hết)
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
9,185
Được thích
10,661
Điểm
1,560
Dạ, cảm ơn anh,
Xin lỗi vì em trình bày chưa rõ ràng.
Tức là cuối tháng em sẽ mở file thứ nhất lên, lấy nội dung của cột K, cột R, S , T , U ..... Y rồi dán vào sheet KDN của file tổng hợp (bắt đầu từ ô C2 nhé (cột A, B của file tổng hợp sử dụng cho việc khác)
rồi lại tiếp tục mở file thứ 2 lên, cũng lấy nội dung như trên, dán xuống hàng kế tiếp trong file tổng hợp, rồi tiếp đến file thứ 3 .....

Sau khi dán em còn phải chuyển các giá trị này về number (không biết phần mềm của văn phòng chính nó xuất như thế nào chứ nếu chỉ đơn thuần là copy và dán thì mấy số liệu này không thể dùng để sum hay sumif gì được hết)
Đấy là bạn mô tả hiện trạng của bạn.
Còn mình đang hỏi: Túm lại bạn muốn thế nào (muốn cái kết quả cuối cùng ấy). Tức là mình ước lên mặt trăng là việc của bạn, còn làm sao lên được mặt trăng/ đi tàu thủy hay tàu bay là việc của ông bụt.

Và có vài vấn đề chờ bạn giải đáp đó. Đọc thật kỹ, đừng bỏ sót.
 

alex-luu

Thành viên thường trực
Tham gia ngày
10 Tháng ba 2015
Bài viết
224
Được thích
46
Điểm
185
Đấy là bạn mô tả hiện trạng của bạn.
Còn mình đang hỏi: Túm lại bạn muốn thế nào (muốn cái kết quả cuối cùng ấy). Tức là mình ước lên mặt trăng là việc của bạn, còn làm sao lên được mặt trăng/ đi tàu thủy hay tàu bay là việc của ông bụt.

Và có vài vấn đề chờ bạn giải đáp đó. Đọc thật kỹ, đừng bỏ sót.
Dạ, cảm ơn anh,

Kết quả cuối cùng là lấy nội dung cột K, cột R, S , T , U ..... Y (lấy từ hàng thứ 6 trở xuống đến hết nội dung file), dán kết quả này vào sheet KDN của file tổng hợp, (bắt đầu dán ở ô C3), chuyển các số liệu thành number.
tiếp tục hiện lên bảng hỏi mình xem có muốn lấy nữa không, nếu không thì thoát là xong, nếu có thì hỏi đường dẫn đến file kế tiếp, rồi làm như trên, chú ý là dán tiếp theo kể từ hàng cuối cùng của lần dán thứ 1 nhé.
Làm xong hỏi tiếp xem có muốn lấy dữ liệu nữa không..... cứ như thế đến khi nào mình chọn không thì thoát.

Không phải lúc nào cũng là 4 file KDN ( có khi giữa tháng cần báo cáo, lúc đó mới có 2 file KDN à, nên mới cần code hỏi mình có muốn lấy dữ liệu nữa hay không là vậy.
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,513
Được thích
2,366
Điểm
360
Xin nhờ các anh chị trên diễn dàn giúp em,

Mỗi tuần lễ, trên văn phòng chính sẽ xuất 1 file báo cáo xuống (mỗi file khoảng 7.000 dòng), cuối tháng em phải lấy nội dung của từng file ( chỉ lấy 9 cột trong mỗi file : cột K , cột R đến cột Y) rồi dán hết vào file tổng hợp .

Hiện nay em đang phải copy bằng tay từng cột trong từng file rất thủ công (dùng công thức thì không biết trước file 1 kết thúc ở hàng nào để tiếp theo là file thứ 2, với lại, mỗi file report là 1 tên khác nhau (vd : KDN_21_10_2019 2019 09 23 , KDN_21_10_2019 2019 10 14.... )

Có cách nào để tạo 1 nút cập nhật, khi nhấn vào thì nó sẽ hỏi file 1 ở đâu, chỉ đường dẫn đến thì nó chỉ copy đúng nội dung của 9 cột mà mình chỉ định trước , qua file tổng hợp, xong hỏi mình có muốn copy tiếp hay không, chọn có thì tiếp tục hỏi đường dẫn file 2 rồi copy và dán nối tiếp sau phần nội dung của file thứ nhất, chọn không thì thoát ra.

Lưu ý : số liệu lấy ra chuyển qua file tổng hợp phải được định dạng lại là number vì còn phải dùng để tính toán (file report gốc không được định dạng là number nên hiện nay mỗi khi copy qua em lại phải dùng hàm value để chuyển nó lại là number)

em xin cảm ơn ạ
Bạn thử.
Mã:
Sub tonghop()
     Application.ScreenUpdating = False
     Application.AskToUpdateLinks = False
     Application.DisplayAlerts = False
     Dim cn As Object, sqlStr As String, i As Long, lr As Long, k, rst As Object, Pro As String, ext As String, arr(), a As Long
     Dim sarr, j As Long, b As Long
     Set cn = CreateObject("ADODB.Connection")
     Set rst = CreateObject("ADODB.recordset")
     With Application.FileDialog(msoFileDialogFilePicker)
quaylai:
       If Not .Show = -1 Then GoTo xong
       k = .SelectedItems(1)
       Pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
       ext = ";Extended Properties=""Excel 12.0;HDR=No;IMEX= 1"";"
       cn.Open (Pro & k & ext)
       sqlStr = "Select f1,f8,f9,f10,f11,f12,f13,f14,f15 from [Page 1$K6:Y50000] where f1 is not null"
       'Debug.Print sqlStr
       sarr = cn.Execute(sqlStr).GetRows
       arr = quydoi(sarr)
       cn.Close
       lr = Sheets("KDN").Range("C" & Rows.Count).End(xlUp).Row + 1
       Sheets("KDN").Range("C" & lr).Resize(UBound(arr), UBound(arr, 2)).Value = arr
       If MsgBox("Ban co lay them nua khong", vbYesNo) = vbYes Then
          GoTo quaylai
       Else
          GoTo xong
       End If
    End With
xong:
     Application.ScreenUpdating = True
     Application.AskToUpdateLinks = True
     Application.DisplayAlerts = True
End Sub
Function quydoi(ByVal arr)
    Dim kq, i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr) + 1)
    For i = 0 To UBound(arr, 2)
        For j = 0 To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    quydoi = kq
End Function
Bài đã được tự động gộp:

 

File đính kèm

alex-luu

Thành viên thường trực
Tham gia ngày
10 Tháng ba 2015
Bài viết
224
Được thích
46
Điểm
185
Bạn thử.
Mã:
Sub tonghop()
     Application.ScreenUpdating = False
     Application.AskToUpdateLinks = False
     Application.DisplayAlerts = False
     Dim cn As Object, sqlStr As String, i As Long, lr As Long, k, rst As Object, Pro As String, ext As String, arr(), a As Long
     Dim sarr, j As Long, b As Long
     Set cn = CreateObject("ADODB.Connection")
     Set rst = CreateObject("ADODB.recordset")
     With Application.FileDialog(msoFileDialogFilePicker)
quaylai:
       If Not .Show = -1 Then GoTo xong
       k = .SelectedItems(1)
       Pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
       ext = ";Extended Properties=""Excel 12.0;HDR=No;IMEX= 1"";"
       cn.Open (Pro & k & ext)
       sqlStr = "Select f1,f8,f9,f10,f11,f12,f13,f14,f15 from [Page 1$K6:Y50000] where f1 is not null"
       'Debug.Print sqlStr
       sarr = cn.Execute(sqlStr).GetRows
       arr = quydoi(sarr)
       cn.Close
       lr = Sheets("KDN").Range("C" & Rows.Count).End(xlUp).Row + 1
       Sheets("KDN").Range("C" & lr).Resize(UBound(arr), UBound(arr, 2)).Value = arr
       If MsgBox("Ban co lay them nua khong", vbYesNo) = vbYes Then
          GoTo quaylai
       Else
          GoTo xong
       End If
    End With
xong:
     Application.ScreenUpdating = True
     Application.AskToUpdateLinks = True
     Application.DisplayAlerts = True
End Sub
Function quydoi(ByVal arr)
    Dim kq, i As Long, j As Long
    ReDim kq(1 To UBound(arr, 2) + 1, 1 To UBound(arr) + 1)
    For i = 0 To UBound(arr, 2)
        For j = 0 To UBound(arr, 1)
            kq(i + 1, j + 1) = arr(j, i)
        Next j
    Next i
    quydoi = kq
End Function
Bài đã được tự động gộp:
Ôi tốt quá, cảm ơn bạn và bạn befaint đã nhiệt tình giúp đỡ
mới chạy thử thì thấy đúng như ý, để mình test thêm xem có phát sinh gì nữa không, đỡ mất rất rất nhiều thời gian làm thủ công luôn bạn ơi.
 

alex-luu

Thành viên thường trực
Tham gia ngày
10 Tháng ba 2015
Bài viết
224
Được thích
46
Điểm
185
bạn befaint ơi,
bài này là dùng cho file Trainer Class Report, nó chỉ có 1 file duy nhất nên không có vụ trùng nhau, với lại cấu trúc hàng, cột của nó khác nhau mà. Em không rành VBA nên không biết cách chỉnh sửa code lại,

Bài đã được tự động gộp:

Ý tưởng hay đó, chắc muốn luyện dẻo tay.
Giữ ctrl khi chọn nhiều files là được.
cách làm này rất hay, sau khi thử cách của bạn và cách của bạn snow25, mình thấy cách này nhanh hơn và hợp lý hơn
 
Top Bottom