Code VBA tổng hợp dữ liệu nhiều sheet vào 1 sheet (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hungvinhhao

Thành viên mới
Tham gia
19/1/08
Bài viết
28
Được thích
1
Em có 1 file báo cáo như file đính kèm. Mỗi mỗi ngày tương ứng với 1 sheet. Các sheet có cấu trúc giống nhau. Sheet "TONGHOP" là tổng hợp dữ liệu của các sheet để báo cáo tháng. Em không biết về VBA lắm mà tổng hợp thủ công thì file chạy chậm. Em nhờ các tiền bối giúp em viết code VBA để:
1 - Hàng Ngày em vào dữ liệu ở các sheet (Sheet 1 .......sheet 31) thì dữ liệu tự cập nhật vào sheet " TONGHOP". Vùng dữ liệu i3:U5000 là tổng Sum (sheet1:sheet 31). với điều kiện đúng mã cửa hàng và mặt hàng.
2 - Khi chèn thêm cột, hoặc dòng ở bất kỳ sheet nào (sheet1,....sheet31) thì ở Sheet "TONGHOP" cũng tự động được chèn thêm đúng như nội dung được thêm vào ở sheet đó và dữ liệu cũng được cập nhật như bước 1.
Rất mong các bậc tiền bối giúp đỡ. Em cảm ơn nhiều.
Ghi chú: Em cũng đã làm theo theo cách dùng code copy dữ liệu các sheet thành 1 sheet nhưng nó lại copy luôn dư liệu của cả sheet "TONGHOP". Mà hơn nữa khi dùng hàm SUMIF tại sheet TONGHOP để cập nhật dữ liệu thì file chạy rất chậm.
Nếu không viết được code theo yêu cầu ở trên thì các tiền bối cho em xin code để mình copy dữ liệu từ sheet 1 đến sheet 31 sang 1 sheet mới. Không copy dữ liệu của sheet TONGHOP. Và code VBA để tổng hợp dữ liệu từ Sheet mới sang Sheet TONGHOP để em không phải dùng hàm SUMIF. Hàm SUMIF chạy rất chậm. Em dùng excel 2003.
 

File đính kèm

File của bạn chỉ là 32 cái Form, chả có số liệu minh họa gì cả thì biết sao lần?!

Mà có khi có số liệu thì bạn sẽ được góp í là 31 trang sẽ là không thích hợp.
Bạn có thể nghĩ đến cách 31 trang đó gôm lại thành 1 trang thôi;
Tất nhiên lúc đó sẽ tăng lên thêm vài trường; Nhưng như vậy sẽ thích hợp hơn với excel.

Tên trang tính vẫn còn dài, nhưng có gần chục tên vẫn là ngắn; Nên là S01, S02,. . . , S09, S10,. . . ,S31. Có vậy mới thích nghi với VBA
 
Upvote 0
Vì em sợ nội dung lớn quá nên bỏ bớt số liệu. File của em nếu có số liệu sẽ như file đính kèm. Còn việc đặt S01......, S31 cũng không ảnh hưởng.Vieecj 31 trang gộp lại thành 1 trang thì em cũng đã nêu ở phần cuối. Nhưng em dùng lệnh copy cả 31 sheet san 1 sheet thì nó lại copy luôn cả sheet tổng hợp. Nếu copy thành 1 sheet thì mong tiền bối ChanhTQ@ sửa cho em cái code copy để nó không copy tất cả các sheet mà chỉ copy Sheet1 đến sheet 31. vaf code vba tương đươngg hàm sumif. Em cảm ơn nhiều!
 
Upvote 0
chưa có tiền bối nào giúp được em ạ? Nếu không viết được code theo đề nghị của em thì cho em code VBA tương đương như hàm SUMIF() và code copy các sheet thành 1 Sheet ( không copy sheet "TONGHOP" ). Em cảm ơn nhiều!
 
Upvote 0
Em có 1 file báo cáo như file đính kèm. Mỗi mỗi ngày tương ứng với 1 sheet. Các sheet có cấu trúc giống nhau. Sheet "TONGHOP" là tổng hợp dữ liệu của các sheet để báo cáo tháng. Em không biết về VBA lắm mà tổng hợp thủ công thì file chạy chậm. Em nhờ các tiền bối giúp em viết code VBA để:
1 - Hàng Ngày em vào dữ liệu ở các sheet (Sheet 1 .......sheet 31) thì dữ liệu tự cập nhật vào sheet " TONGHOP". Vùng dữ liệu i3:U5000 là tổng Sum (sheet1:sheet 31). với điều kiện đúng mã cửa hàng và mặt hàng.
2 - Khi chèn thêm cột, hoặc dòng ở bất kỳ sheet nào (sheet1,....sheet31) thì ở Sheet "TONGHOP" cũng tự động được chèn thêm đúng như nội dung được thêm vào ở sheet đó và dữ liệu cũng được cập nhật như bước 1.
Rất mong các bậc tiền bối giúp đỡ. Em cảm ơn nhiều.
Ghi chú: Em cũng đã làm theo theo cách dùng code copy dữ liệu các sheet thành 1 sheet nhưng nó lại copy luôn dư liệu của cả sheet "TONGHOP". Mà hơn nữa khi dùng hàm SUMIF tại sheet TONGHOP để cập nhật dữ liệu thì file chạy rất chậm.
Nếu không viết được code theo yêu cầu ở trên thì các tiền bối cho em xin code để mình copy dữ liệu từ sheet 1 đến sheet 31 sang 1 sheet mới. Không copy dữ liệu của sheet TONGHOP. Và code VBA để tổng hợp dữ liệu từ Sheet mới sang Sheet TONGHOP để em không phải dùng hàm SUMIF. Hàm SUMIF chạy rất chậm. Em dùng excel 2003.
Thử code này coi sao. Trúng trật gì thì từ từ tính tiếp
PHP:
Sub tong_hop()
Dim Source(), Result(1 To 10000, 1 To 21)
Dim Dic As Object, I As Long, j As Long, k As Long, n As Byte
Set Dic = CreateObject("scripting.dictionary")
For n = 1 To 31
    With Sheets("sheet" & n)
        Source = .Range(.[A3], .[A65536].End(3)).Resize(, 21).Value
    End With
    For I = 1 To UBound(Source)
        If Source(I, 2) <> "" Then
            If Not Dic.exists(Source(I, 2)) Then
                k = k + 1
                Dic.Add Source(I, 2), k
                Result(k, 1) = k
                For j = 2 To 21
                    Result(k, j) = Source(I, j)
                Next
            Else
                c = Dic.Item(Source(I, 2))
                For j = 9 To 21
                    Result(c, j) = Result(c, j) + Source(I, j)
                Next
            End If
        End If
    Next
Next
For j = 8 To 21
    Result(k + 1, j) = "=SUM(R3C:R[-1]C)"
Next
Sheets("TONGHOP").[A3].Resize(k + 1, 21) = Result
End Sub
 
Upvote 0
Code này ổn luôn anh ạ. Em cảm ơn anh nhiều nhiều! Nhờ code này mà bây giờ khối lượng công việc của em sẽ đỡ đi nhiều. Nhân đây em xin anh Quanghai1969 code copy dữ liệu từ Sheet 1 đến sheet 31 sang một sheet mới được không ạ. Và em còn vướng trường hợp này nữa. Ở file em gửi lên diễn đàn ở cột F (Ho Ten NV ) trong tháng có thể đứng ở các cửa hàng khác nhau ( không cố định ). Em cũng muốn tổng hợp số liệu như Sheet " TONGHOP" ở trên nhưng theo Ho Ten NV sang sheet " THNV" Thì sửa code trên như thế nào anh nhỉ. Em nhờ anh giúp với. em cảm ơn anh nhiều!
 
Upvote 0
Mấy bác giúp e cái này nhá.
VD: e có 2 file là BCA và TH, trong BCA có 3 sheet là T1, T2, T3. E muốn tổng hợp T1, T2, T3 của BCA vào TH, dữ liệu nào trùng thì lấy 1 thôi, k trùng thì vẫn lấy. Nếu dùng công thức thì dùng thế nào, còn nếu dùng VBA thì viết thế nào?
Thank các bác trước!
 

File đính kèm

Upvote 0
Mấy bác giúp e cái này nhá.
VD: e có 2 file là BCA và TH, trong BCA có 3 sheet là T1, T2, T3. E muốn tổng hợp T1, T2, T3 của BCA vào TH, dữ liệu nào trùng thì lấy 1 thôi, k trùng thì vẫn lấy. Nếu dùng công thức thì dùng thế nào, còn nếu dùng VBA thì viết thế nào?
Thank các bác trước!
Sau sheet T3, bạn thêm một sheet tên TH rồi dùng code trên
PHP:
Sub copy()
Dim Ws As Worksheet, Sarr, Arr(1 To 65000, 1 To 1), i As Long, k As Long
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In Worksheets
    If Ws.Name <> "TH" Then
        Sarr = Ws.Range("A1", Ws.[A65000].End(xlUp)).Resize(, 1).Value2
            For i = 1 To UBound(Sarr, 1)
                If Not Dic.exists(Sarr(i, 1)) Then
                    k = k + 1
                    Dic.Add Sarr(i, 1), k
                    Arr(k, 1) = Sarr(i, 1)
                End If
            Next
    End If
Next
With Sheets("TH")
    .[A1:A65000].ClearContents
    .[A1].Resize(k, 1).Value = Arr
    .[A1].Resize(k, 1).Borders.LineStyle = 1
End With
Set Dic = Nothing
End Sub
 
Upvote 0
truoc tien mih xin cam on ban comet_1701 rat nhieu! Minh muon file TH nam wordsheet rieng de sau nay con tong hop cac file khac nhu: BCB, BCC, BCD... va cho minh hoi them la khi thay doi du lieu o cac sheet trong BCA thi du lieu trong file TH co thay doi k?
 
Lần chỉnh sửa cuối:
Upvote 0
Bài viết tiếng Việt fải có dấu.

Câu này dù có dấu tiếng Việt cũng sẽ khó hiểu: "Minh muon file TH nam wordsheet rieng de sau nay con tong hop cac file khac nhu: BCB, BCC, BCD..."
 
Upvote 0
ý mình là sheet TH phải nằm riêng biệt ở worksheet khác chứ k thêm vào sau sheet T3, đoạn mã của bạn comet_1701 chỉ hiện dữ liệu k trùng còn dữ liệu trùng thì k hiện, mình muốn hiển thị tất cả giống như file TH mình đính kèm, thank!
 
Lần chỉnh sửa cuối:
Upvote 0
chưa có bác nào giúp mình hết,-\\/.
 
Upvote 0
Các bác giúp dùm e nhé, gửi bài viết lâu rồi mà chưa có ai giúp hết
 
Upvote 0
Anh Quanhhai1969 ơi anh giúp em file này được không ạ, Em có 1 file báo cáo như file đính kèm. Mỗi mỗi ngày tương ứng với 1 sheet. Các sheet có cấu trúc giống nhau. Sheet "TONGHOP" là tổng hợp dữ liệu của các sheet. Em không biết về VBA lắm mà tổng hợp thủ công thì file chạy chậm. Em nhờ các anh ch giúp em viết code VBA để: Hàng Ngày em vào dữ liệu ở các sheet (Sheet 1 .......> sheet 31) thì dữ liệu tự cập nhật vào sheet " TONGHOP".
 

File đính kèm

Upvote 0
Nhờ các anh chị giúp em tạo một code vba làm sao em có thể tự động lấy dữ liệu từ các sheet sang sheet tổng hợp, đống thời nếu dữ liệu của nhưng sheet kia thay đổi thì nó sẽ tự động thay đổi dự liệu ở sheet tổng hợp. em có gửi file đính kèm. nhờ các anh chị giúp đỡ, em cảm ơn nhiều.
 

File đính kèm

Upvote 0
Nhờ các anh chị giúp em tạo một code vba làm sao em có thể tự động lấy dữ liệu từ các sheet sang sheet tổng hợp, đống thời nếu dữ liệu của nhưng sheet kia thay đổi thì nó sẽ tự động thay đổi dự liệu ở sheet tổng hợp. em có gửi file đính kèm. nhờ các anh chị giúp đỡ, em cảm ơn nhiều.
Muốn cập nhật thì chạy code, tự động chạy khi có sự thay đổi của các khác chưa làm được
Mã:
Sub TongHop()
Dim i As Long, lR As Long
Application.ScreenUpdating = False
Sheets("TONGHOP").Move before:=Sheets(1)
Sheets("TONGHOP").Range("A3:H" & Sheets("TONGHOP").Range("B3").End(xlDown).Row).Clear
For i = 2 To Sheets.Count
    lR = Sheets("TONGHOP").Cells.Find("*", SearchDirection:=xlPrevious).Row + 1
    With Sheets(i)
        .Range("A3:H" & .Range("B3").End(xlDown).Row).Copy Sheets("TONGHOP").Cells(lR, 1)
    End With
Next
With Sheets("TONGHOP")
    For i = 3 To .Range("B3").End(xlDown).Row
        If .Cells(i, 1) = "" Then .Cells(i, 1) = .Cells(i - 1, 1) + 1
    Next i
.Range("A3:H" & .Range("B3").End(xlDown).Row).Borders.LineStyle = 1
End With
ActiveWorkbook.Worksheets("tonghop").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("tonghop").Sort.SortFields.Add Key:=Range("A3"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("tonghop").Sort
    .SetRange Range("A3:h196")
    .Apply
End With
Application.ScreenUpdating = True
End Sub
 
Upvote 0
chẳng nhẻ không có cách nào vừa lấy dữ liệu vừa limk được ư.nhờ mọi người giúp với nhé.
 
Upvote 0
chẳng nhẻ không có cách nào vừa lấy dữ liệu vừa limk được ư.nhờ mọi người giúp với nhé.
Không hiểu ý bạn là như thế nào, mình thấy nếu bạn muốn khi sủa dữ liệu ở sheet khác và quay trở lại sheet tổng hợp thì dữ liệu sẽ đc tổng hợp thì bạn đặt code trong sự kiện worksheet_active nhé.
 
Upvote 0
chẳng nhẻ không có cách nào vừa lấy dữ liệu vừa limk được ư.nhờ mọi người giúp với nhé.
chạy tự động vẫn làm được, nhưng có hạn chế của nó
- mỗi lần bạn nhập liệu code tự chạy, nếu dữ liệu nhiều sẽ cà giựt ... giựt rất khó chịu
- bạn nhập dữ liệu mỗi sheet một ít không đầy đủ rồi lại nhảy qua sheet khác nhập tiếp, tổng hợp có thể không đúng
- Cách đánh số thứ tự của bạn rất dể nhầm lẫn
- có thể mỗi sheet bạn phải tạo một code chạy tự động
mình nghĩ nhập liệu đầy đủ rồi chạy 1 lần cho gọn
 
Upvote 0
vậy thì thôi để vậy rồi cứ làm xong lại chạy tổng hợp không chậm thì cũng rất giở vì lần trước em cũng có một macro link nhung chậm lắm.
 
Upvote 0
Mấy Bác giúp em với
VD: em có 2 file file1 và file2 như mẫu,em muốn copy mỗi cột trong file 1 vào cột tương ứng với từng sheet trong file 2 thì code sao ạ?.em cảm ơn.
 

File đính kèm

Upvote 0
Mấy Bác giúp em với
VD: em có 2 file file1 và file2 như mẫu,em muốn copy mỗi cột trong file 1 vào cột tương ứng với từng sheet trong file 2 thì code sao ạ?.em cảm ơn.

Chạy thử code này xem sao.
PHP:
Public Sub GPE()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Ws As Worksheet, Cll As Range, dArr(), K As Long, Col As Long
Dim MyWb As String, Pat As String, FName As String
FName = "File2.xlsx"
MyWb = ThisWorkbook.Name
Pat = ThisWorkbook.Path & "\"
    Workbooks.Open Filename:=Pat & FName
    With ActiveWorkbook
        ReDim dArr(1 To 11, 1 To .Worksheets.Count)
            For Each Ws In .Worksheets
                Col = Col + 1
                K = 1: dArr(K, Col) = Ws.Name
                For Each Cll In Ws.Range("C12:C21")
                    K = K + 1
                    dArr(K, Col) = Cll.Value
                Next Cll
            Next Ws
        .Close False
    End With
Workbooks(MyWb).Activate
Sheet1.Range("B2").Resize(11, Col) = dArr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chạy thử code này xem sao.
PHP:
Public Sub GPE()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Ws As Worksheet, Cll As Range, dArr(), K As Long, Col As Long
Dim MyWb As String, Pat As String, FName As String
FName = "File2.xlsx"
MyWb = ThisWorkbook.Name
Pat = ThisWorkbook.Path & "\"
    Workbooks.Open Filename:=Pat & FName
    With ActiveWorkbook
        ReDim dArr(1 To 11, 1 To .Worksheets.Count)
            For Each Ws In .Worksheets
                Col = Col + 1
                K = 1: dArr(K, Col) = Ws.Name
                For Each Cll In Ws.Range("C12:C21")
                    K = K + 1
                    dArr(K, Col) = Cll.Value
                Next Cll
            Next Ws
        .Close False
    End With
Workbooks(MyWb).Activate
Sheet1.Range("B2").Resize(11, Col) = dArr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Mình copy dữ lieu vào file 1 và chạy thử thì báo lỗi thế này là như thế nào vậy bạn?mình mù tịt cái khoản này.bạn xem giúp,cảm ơn bạn nhiều
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    41 KB · Đọc: 75
Lần chỉnh sửa cuối:
Upvote 0
Mình copy dữ lieu vào file 1 và chạy thử thì báo lỗi thế này là như thế nào vậy bạn?cảm ơn bạn nhiều
2 file phải cùng Folder. Tên file cũng phải như tên file bạn gởi.
Bạn phải đưa 2 file của bạn lên, chạy code thử mới biết sai do đâu.
Nhìn hình sao biết lỗi từ đâu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
2 file phải cùng Folder. Tên file cũng phải như tên file bạn gởi.
Bạn phải đưa 2 file của bạn lên, chạy code thử mới biết sai do đâu.
Nhìn hình sao biết lỗi từ đâu.

2 file của mình đây bạn.vì mình làm báo cáo theo ngày.mỗi ngày là 1 file2,nhưng nhiều lắm,copy dán thì lâu quá
 

File đính kèm

Upvote 0
2 file phải cùng Folder. Tên file cũng phải như tên file bạn gởi.
Bạn phải đưa 2 file của bạn lên, chạy code thử mới biết sai do đâu.
Nhìn hình sao biết lỗi từ đâu.
Cảm ơn bác,cái này chạy ok.nhưng bị ngược với yêu cầu em đưa ra.code này nó copy các sheets trong file co tên File2 vào các cột của bang trong File1,mình cần copy ngược lại bác ơi.hihi cảm ơn bác nhờ bác xem sửa lại giúp mình với nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các anh chị giúp em tạo một code vba làm sao em có thể tự động lấy dữ liệu từ các sheet sang sheet tổng hợp, đống thời nếu dữ liệu của nhưng sheet kia thay đổi thì nó sẽ tự động thay đổi dự liệu ở sheet tổng hợp. em có gửi file đính kèm. nhờ các anh chị giúp đỡ, em cảm ơn nhiều.​
paperclip.png
Tập tin đính kèm
  • xls.gif
    gui giai phap excel.xls (96.5 KB, 3 lần tải)
  • nhờ cả nhà làm giúp em cái code tự động copy mà có link với. chứ copy mà không link thì không chuẩn.
 
Upvote 0
Cảm ơn bác,cái này chạy ok.nhưng bị ngược với yêu cầu em đưa ra.code này nó copy các sheets trong file có tên File2 vào các cột của bảng trong File1,mình cần copy ngược lại bác ơi.hihi cảm ơn bác nhờ bác xem sửa lại giúp mình với nhé.

Vậy thì chạy Sub này từ File1 (phải có đuôi .xlsm hoặc .xlsb), File2.xlsx phải cùng Folder với File1
PHP:
Public Sub GPE()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
    Dim Ws As Worksheet, sArr(), dArr(), I As Long, J As Long
    sArr = Sheet1.Range("B2:I12").Value
    Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "File2.xlsx"   '<----
    With ActiveWorkbook
        For Each Ws In .Worksheets
            ReDim dArr(1 To 10, 1 To 1)
            For J = 1 To UBound(sArr, 2)
                If sArr(1, J) = Ws.Name Then
                    For I = 2 To UBound(sArr)
                        dArr(I - 1, 1) = sArr(I, J)
                    Next I
                    Ws.Range("C12:C21") = dArr
                    Exit For
                End If
            Next J
        Next Ws
        .Save
    End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người,
Mình đang có một việc muốn nhờ mọi người giúp đỡ. Hiện mình đang có các báo cáo của cơ sở (khoảng 20 báo cáo), mỗi báo cáo có khoảng 29 bảng khác nhau. Mình muốn nhờ một bạn tư vấn giúp mình cách viết code VBA để có thể tổng hợp báo cáo tự động.
Mình rất muốn được học VBA nên nếu trong quá trình làm các bạn cho mình tham gia cùng thì tốt quá. Mình xin gửi các bạn 1 chút kinh phí để cảm ơn, Các bạn nào quan tâm xin liên hệ với mình qua email phuonghsph@gmail.com hoặc số điện thoại 0985909660

Thank you so much

Phương
 
Upvote 0
Mình đang có một việc muốn nhờ mọi người giúp đỡ. Hiện mình đang có các báo cáo của cơ sở (khoảng 20 báo cáo), mỗi báo cáo có khoảng 29 bảng khác nhau. Mình muốn nhờ một bạn tư vấn giúp mình cách viết code VBA để có thể tổng hợp báo cáo tự động.
Mình rất muốn được học VBA nên nếu trong quá trình làm các bạn cho mình tham gia cùng thì tốt quá. Mình xin gửi các bạn 1 chút kinh phí để cảm ơn, Các bạn nào quan tâm xin liên hệ với mình qua email phuonghsph@gmail.com hoặc số điện thoại 0985909660
Thứ nhất, bạn không được chen ngang vào chủ đề của người khác.
Thứ hai, việc để lại email/ số điện thoại ở những bài cần trợ giúp là không nên.
Thứ ba, với yêu cầu này, bạn vào chuyên mục "Thành viên giúp nhau" lập chủ đề rồi đề xuất yêu cầu.
 
Upvote 0
Nhờ các anh chị giúp mình viết một đoạn code VBA để tra cứu dữ liệu lập kế hoạch của một mã số chi tiết từ ngày 01 đến ngày 31 trong một tháng. VD: mình cần tra mã chi tiết 221PRI-CL-B-8000 với các thong tin như Sheet "Tra cứu CT".
Tương tự đối với Sheet "Tra cứu Máy".
Rất mong mọi người giúp em với.
 

File đính kèm

Upvote 1

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

Back
Top Bottom