Cập nhập dữ liệu từ 1 workbook khác vào báo cáo tổng hợp

Liên hệ QC

Kool_Kool

Thành viên chính thức
Tham gia
12/6/15
Bài viết
83
Được thích
1
Nhờ các cao thủ ghé ngang giúp đỡ vấn đề sau :
Mình muốn cập nhập dữ liệu từ một File Data vào File tổng hợp. File Data có nhiều tháng. Mình muốn nhập tháng 1 vào file tổng hợp và kích cập nhập dữ liệu sẽ được dò tìm ở File Data và cập nhập. Mong Anh Chị giúp đỡ VBA code . Cám ơn.
 

File đính kèm

  • Data.xlsx
    10.5 KB · Đọc: 20
  • Report1.xlsx
    11.1 KB · Đọc: 19
Cám ơn @huonglien1901 đã trợ giúp. Tuy nhiên File dữ liêu Chi nhánh được lưu ở nhiều Folder của Chi nhánh và được cập nhập liên tục . Do đó mình cần bấm vào nut input xong se xuất hiện link chon đường dẫn click vào File thì dữ liệu sẽ dò tìm và copy paste vào File báo cáo tổng hợp.
Cả nhà hướng dẫn giúp .
Tôi làm vui thôi, tôi để chung folder cho đơn giản, chứ connect khác folder dù Local hay Cloud đều được tạo thêm cái list path.

Anh có thể hướng dẫn cách làm hoặc quay video được không Anh?
Em cảm ơn Anh nhiều!
Bạn xem video này:
 
Upvote 0
- Mục đính của mình cần là chỉ cần lấy dữ liệu tổng của chi nhánh điền vào báo cáo tổng hợp ( Chi nhánh có 12 tháng , Báo cáo tổng hợp chọn tháng nào thì lấy dữ liệu tháng đó từ Data Chi nhánh"
- Mình có nhiều Chi nhánh nên các bạn tư vấn giúp Code để bấm vào nút Input1 thi sẽ hiện lên đường dẫn để chọn Data của chi nhánh đó
Cảm phiền diễn đàn giúp đỡ thêm.

Gửi các bạn @ongke0711, @Kiều Mạnh, @thuyyeu99 là ta có thể dùng ADO để làm bài toán này không?

Thử làm cách khác dùng kết hợp ADO nhé. Cách thức tôi xử lý là:
- Mở Workbook chi nhánh, dò cột B để lấy thông tin các tháng có trong đó và vị trí dòng bắt đầu của tháng đó (lưu vào Dictionary). Mục đích để xác định Range lấy dữ liệu theo tháng cho ADO Recordset.
dict.png
- Lấy toàn bộ dữ liệu các tháng của chi nhánh vào ADO Recordset lưu vào bộ nhớ có kèm cột ngày tháng để dùng Filter sau này. Duyệt qua Dict và dùng Union query để nối recordset các tháng.
- Chọn tháng để gán dữ liệu từ ADO Recorset.Filter xuống Sheet.
Để chạy không bị sai, bị lỗi thì các bảng dữ liệu phải đồng nhất, tên Sheet không dấu, không khoảng trắng, cột chứa thông số Tháng luôn là cột B.

 

File đính kèm

  • TrichDuLieuWBkhac_ADO.zip
    305.5 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Thử làm cách khác dùng kết hợp ADO nhé. Cách thức tôi xử lý là:
- Mở Workbook chi nhánh, dò cột B để lấy thông tin các tháng có trong đó và vị trí dòng bắt đầu của tháng đó (lưu vào Dictionary). Mục đích để xác định Range lấy dữ liệu theo tháng cho ADO Recordset.
View attachment 250942
- Lấy toàn bộ dữ liệu các tháng của chi nhánh vào ADO Recordset lưu vào bộ nhớ có kèm cột ngày tháng để dùng Filter sau này. Duyệt qua Dict và dùng Union query để nối recordset các tháng.
- Chọn tháng để gán dữ liệu từ ADO Recorset.Filter xuống Sheet.
Để chạy không bị sai, bị lỗi thì các bảng dữ liệu phải đồng nhất, tên Sheet không dấu, không khoảng trắng, cột chứa thông số Tháng luôn là cột B.

Máy tôi khi chọn ngày 01/04/2020 thì nó hỏng có ra. Có thể do khác định dạng kiểu ngày tháng?
Tôi áp dụng bài này để tìm kiếm, có thể ra kết quả tương đối.
 
Upvote 0
Upvote 0
Oh..có thể lỗi là do tôi quên trả lại Recordset ban đầu để thực hiện nhiệm vụ Filter kế tiếp.
rs.Filter = adFilterNone
Cách khác là tôi áp dụng tìm kiếm như bài trên tôi đưa liên kết. Khi tìm được ngày thì sẽ di chuyển con trỏ xuống 2 dòng rồi lấy 76 dòng tiếp theo. Tuy nhiên chỉ là tương đối.
 
Upvote 0
Cách khác là tôi áp dụng tìm kiếm như bài trên tôi đưa liên kết. Khi tìm được ngày thì sẽ di chuyển con trỏ xuống 2 dòng rồi lấy 76 dòng tiếp theo. Tuy nhiên chỉ là tương đối.

Theo tôi biết thì Find nó sẽ trả về vị trí record nó tìm thấy đầu tiên thoả điều kiện. Nếu dữ liệu không được sắp xếp theo điều kiện thì tôi chưa biết nó có trả về recordset đúng không? Tôi chưa thử nghiệm trường hợp này. Dùng Find nếu điều kiện tìm kiếm là duy nhất thì chắc chắn đúng.
 
Upvote 0
Theo tôi biết thì Find nó sẽ trả về vị trí record nó tìm thấy đầu tiên thoả điều kiện. Nếu dữ liệu không được sắp xếp theo điều kiện thì tôi chưa biết nó có trả về recordset đúng không? Tôi chưa thử nghiệm trường hợp này. Dùng Find nếu điều kiện tìm kiếm là duy nhất thì chắc chắn đúng.
Chính xác là sẽ tìm thấy và trả về giá trị đầu tiên thỏa điều kiện. Còn nếu tìm đến vị trí tiếp theo thì phải dùng vòng lặp duyệt qua.
 
Upvote 0
Cái này theo mình dùng query tổng hợp là ngon. Chắc file Data của bạn chủ topic là Record của chương trình, dữ liệu đầu vào đã chuẩn hóa rồi.
 
Upvote 0
Tôi làm vui thôi, tôi để chung folder cho đơn giản, chứ connect khác folder dù Local hay Cloud đều được tạo thêm cái list path.


Bạn xem video này:
Anh ơi! Cho em hỏi trường hợp mình muốn tổng hợp nhiều bảng sử dụng power query được không Anh?
 
Upvote 0
Thử làm cách khác dùng kết hợp ADO nhé. Cách thức tôi xử lý là:
- Mở Workbook chi nhánh, dò cột B để lấy thông tin các tháng có trong đó và vị trí dòng bắt đầu của tháng đó (lưu vào Dictionary). Mục đích để xác định Range lấy dữ liệu theo tháng cho ADO Recordset.
View attachment 250942
- Lấy toàn bộ dữ liệu các tháng của chi nhánh vào ADO Recordset lưu vào bộ nhớ có kèm cột ngày tháng để dùng Filter sau này. Duyệt qua Dict và dùng Union query để nối recordset các tháng.
- Chọn tháng để gán dữ liệu từ ADO Recorset.Filter xuống Sheet.
Để chạy không bị sai, bị lỗi thì các bảng dữ liệu phải đồng nhất, tên Sheet không dấu, không khoảng trắng, cột chứa thông số Tháng luôn là cột B.

Máy tôi khi chọn ngày 01/04/2020 thì nó hỏng có ra. Có thể do khác định dạng kiểu ngày tháng?
Tôi áp dụng bài này để tìm kiếm, có thể ra kết quả tương đối.
Cám ơn bạn đã trợ giúp.
 
Upvote 0
Thử làm cách khác dùng kết hợp ADO nhé. Cách thức tôi xử lý là:
- Mở Workbook chi nhánh, dò cột B để lấy thông tin các tháng có trong đó và vị trí dòng bắt đầu của tháng đó (lưu vào Dictionary). Mục đích để xác định Range lấy dữ liệu theo tháng cho ADO Recordset.
View attachment 250942
- Lấy toàn bộ dữ liệu các tháng của chi nhánh vào ADO Recordset lưu vào bộ nhớ có kèm cột ngày tháng để dùng Filter sau này. Duyệt qua Dict và dùng Union query để nối recordset các tháng.
- Chọn tháng để gán dữ liệu từ ADO Recorset.Filter xuống Sheet.
Để chạy không bị sai, bị lỗi thì các bảng dữ liệu phải đồng nhất, tên Sheet không dấu, không khoảng trắng, cột chứa thông số Tháng luôn là cột B.

đang suy nghĩ tại sao xài ADO rồi ko xài luôn đi mà còn Workbooks.Open
 
Upvote 0
Upvote 0
Anh đã có kết quả dùng ADO chưa, nếu chưa thì có thể theo gợi ý của bài viết bên trên của em đó.
đang tính viết lại cái Workbooks.Open của bài số 23 xong tính tiếp vì thấy 2 file có cấu trúc Data và tên Sheet giống nhau
thay nó là SQL sau xong cho vào Array duyệt lấy Date cho vào Combobox

Mã:
SQL = "SELECT [F2] FROM [CHI_NHANH_1$]"

thấy bài này cũng hay nếu có thời gian viết lại thành SQL tùy chọn cũng hay
 
Upvote 0
đang tính viết lại cái Workbooks.Open của bài số 23 xong tính tiếp vì thấy 2 file có cấu trúc Data và tên Sheet giống nhau
thay nó là SQL sau xong cho vào Array duyệt lấy Date cho vào Combobox

Mã:
SQL = "SELECT [F2] FROM [CHI_NHANH_1$]"

thấy bài này cũng hay nếu có thời gian viết lại thành SQL tùy chọn cũng hay
Kiểu dữ liệu của F2 không phải dạng ngày tháng nên cần phải lưu ý thêm.
 
Upvote 0
Kiểu dữ liệu của F2 không phải dạng ngày tháng nên cần phải lưu ý thêm.
đang thử vầy nè ... xem sao xong tính tiếp
Mã:
Public Sub GetDate()
    Dim Rst As Object, SQL As String
    Dim Strcon As String, ExcelPath As String
    Dim RecCount  As Long
    Dim dArr() As Variant, Arr() As Variant
    Dim i As Long, J As Long, k As Long
    ExcelPath = ThisWorkbook.Path & "\DATA_CHI_NHANH_1.xlsx"
    SQL = "SELECT [F2] FROM [CHI_NHANH_1$]"
    
    Set Rst = CreateObject("ADODB.Recordset")
    Strcon = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ExcelPath _
                & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";")
                
    Rst.Open SQL, Strcon, 3, 1
    RecCount = Rst.RecordCount
    If Not Rst.EOF Then
        Arr = Rst.GetRows(RecCount)
        For i = 0 To UBound(Arr, 2)
            If IsDate(Arr(0, i)) Then
                MsgBox Arr(0, i)
            End If
        Next i
    End If
    Rst.Close: Set Rst = Nothing
End Sub
 
Upvote 0
đang thử vầy nè ... xem sao xong tính tiếp
Mã:
Public Sub GetDate()
    Dim Rst As Object, SQL As String
    Dim Strcon As String, ExcelPath As String
    Dim RecCount  As Long
    Dim dArr() As Variant, Arr() As Variant
    Dim i As Long, J As Long, k As Long
    ExcelPath = ThisWorkbook.Path & "\DATA_CHI_NHANH_1.xlsx"
    SQL = "SELECT [F2] FROM [CHI_NHANH_1$]"
   
    Set Rst = CreateObject("ADODB.Recordset")
    Strcon = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ExcelPath _
                & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";")
               
    Rst.Open SQL, Strcon, 3, 1
    RecCount = Rst.RecordCount
    If Not Rst.EOF Then
        Arr = Rst.GetRows(RecCount)
        For i = 0 To UBound(Arr, 2)
            If IsDate(Arr(0, i)) Then
                MsgBox Arr(0, i)
            End If
        Next i
    End If
    Rst.Close: Set Rst = Nothing
End Sub
Chưa thử, nhưng anh hãy kiểm tra kỹ lại lần nữa xem sao nhé.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom