Copy dữ liệu từ nhiều Sheet vào Sheet "TH" (1 người xem)

Liên hệ QC

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

Hoàng Tuyên

Thành viên mới
Tham gia
10/6/08
Bài viết
39
Được thích
4
Mình đang cần copy toàn bộ số liệu từ các sheet 2 tới sheet 18 vào sheet TH. Sau đó từ sheet TH sẽ tự động sắp xếp theo trường Năm sinh. Nếu dữ liệu trong các sheet từ 2 đến 18 trùng với dữ liệu đã có trong sheet TH thì không copy vào.
Nhờ các thầy viết code giúp ạ.
Mình gửi file đính kèm chỉ lấy 4 sheet từ 2 đến 5 và sheet TH thôi.
 

File đính kèm

Trước hết bạn có thể set Name cho vùng copy như sau
range1 = OFFSET(Sheet2!A3,0,0,COUNTA(Sheet2!A:A)-1,7)
Thực hiện tương tự với các sheet còn lại
Sau đó dùng lệnh
range("range"&i).copy để paste sang sheet TH
Cuối cùng là xài lệnh RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7 _), Header:=xlNo
Cái này là mình dùng record để thử. Bạn áp dụng thử xem
Còn việc sort thì cũng làm tương tự như vậy
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đang cần copy toàn bộ số liệu từ các sheet 2 tới sheet 18 vào sheet TH. Sau đó từ sheet TH sẽ tự động sắp xếp theo trường Năm sinh. Nếu dữ liệu trong các sheet từ 2 đến 18 trùng với dữ liệu đã có trong sheet TH thì không copy vào.
Nhờ các thầy viết code giúp ạ.
Mình gửi file đính kèm chỉ lấy 4 sheet từ 2 đến 5 và sheet TH thôi.
Với dữ liệu ngày sinh kiểu text như file bạn thì thử chạy code này xem sao:
PHP:
Public Sub TongHop()
Dim Dic As Object, Ws As Worksheet, sArr(), dArr(1 To 50000, 1 To 8), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TH" Then
        sArr = Ws.Range(Ws.[A4], Ws.[A65536].End(xlUp)).Resize(, 7).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, Empty
                K = K + 1
                For J = 1 To 7
                    dArr(K, J) = sArr(I, J)
                Next J
                dArr(K, 8) = Right(sArr(I, 2), 4)
            End If
        Next I
    End If
Next Ws
With Sheets("TH")
    .[B:C].NumberFormat = "@"
    .[A4:G50000].ClearContents
    .[A4].Resize(K, 8).Value = dArr
    .[A4].Resize(K, 8).Sort Key1:=.[H4], Key2:=.[B4]
    .[H4].Resize(K).ClearContents
End With
Set Dic = Nothing
End Sub
 

File đính kèm

Upvote 0
Cảm ơn bạn Ba Tê. Mình muốn hỏi thêm là:
Trong file excel của mình còn có nhiều sheet có tên khác không cùng quy luật tên như các sheet từ 2 đến 5. Vậy mình phải đặt điều kiện lọc hơi dài. VD: If Ws.Name <> "TH" And Ws.Name <> "Data" And Ws.Name <> "Team" And Ws.Name <> "Baocao" And ... The
Bạn có thể có cách nào khác không?
 
Upvote 0
Cảm ơn bạn Ba Tê. Mình muốn hỏi thêm là:
Trong file excel của mình còn có nhiều sheet có tên khác không cùng quy luật tên như các sheet từ 2 đến 5. Vậy mình phải đặt điều kiện lọc hơi dài. VD: If Ws.Name <> "TH" And Ws.Name <> "Data" And Ws.Name <> "Team" And Ws.Name <> "Baocao" And ... The
Bạn có thể có cách nào khác không?
Bạn đưa hết tên các sheet lên đây, sheet nào cần lấy, sheet nào không.
Tìm được quy luật chung sẽ có cách, bằng không thì tạo 1 danh sách tên các sheet cần lấy vào 1 cột nào đó rồi "chạy code".
Nói chung là "thấy" mới được.
 
Upvote 0
Bạn đưa hết tên các sheet lên đây, sheet nào cần lấy, sheet nào không.
Tìm được quy luật chung sẽ có cách, bằng không thì tạo 1 danh sách tên các sheet cần lấy vào 1 cột nào đó rồi "chạy code".
Nói chung là "thấy" mới được.
- Đây là tên các sheet: TH, D01,D02,D03, ..., D18, DATA, Baocao, BC_Cty, Team, KHTP, HDBH (tổng cộng là 25 sheet).
- Bạn có thể sửa cho mình khi Tổng hợp sang sheet TH thì kiểu dữ liệu giữ nguyên gốc được không?
- Code bạn gửi cho mình có chỗ sắp xếp mình chưa hiểu rõ lệnh nào cho sort ở cột B?
 
Upvote 0
- Đây là tên các sheet: TH, D01,D02,D03, ..., D18, DATA, Baocao, BC_Cty, Team, KHTP, HDBH (tổng cộng là 25 sheet).
- Bạn có thể sửa cho mình khi Tổng hợp sang sheet TH thì kiểu dữ liệu giữ nguyên gốc được không?
- Code bạn gửi cho mình có chỗ sắp xếp mình chưa hiểu rõ lệnh nào cho sort ở cột B?
Vẫn chưa trả lời đầy đủ:
... sheet nào cần lấy, sheet nào không.
Nếu tất cả các sheet cần lấy đều có tên sheet bắt đầu bằng chữ "D", các sheet không cần lấy dữ liệu tổng hợp thì không được bắt đầu bằng chữ "D" thì dễ rồi.
Đổi tên sheet "Data" thành tên khác đi.
PHP:
Public Sub TongHop()
Dim Dic As Object, Ws As Worksheet, sArr(), dArr(1 To 50000, 1 To 8), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In ThisWorkbook.Worksheets
    If Left(Ws.Name, 1) = "D" Then                                "---------------Lấy các sheet này"
        sArr = Ws.Range(Ws.[A4], Ws.[A65536].End(xlUp)).Resize(, 7).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, Empty
                K = K + 1
                For J = 1 To 7
                    dArr(K, J) = sArr(I, J)
                Next J
                dArr(K, 8) = Right(sArr(I, 2), 4)
            End If
        Next I
    End If
Next Ws
With Sheets("TH")
    .[B:C].NumberFormat = "@"
    .[A4:G50000].ClearContents
    .[A4].Resize(K, 8).Value = dArr
    .[A4].Resize(K, 8).Sort Key1:=.[H4], Key2:=.[B4]           "----------------Cái này là Sort theo cột B nè"
    .[H4].Resize(K).ClearContents
End With
Set Dic = Nothing
End Sub
Híc! Mấy bài rồi vẫn chưa ra ngô ra khoai gì cả.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi bạn. Các sheet cần lấy là từ D01, D02, ..., D18 bạn à.
Cảm ơn bạn nhiều.
 
Upvote 0
Thầy Ba Tê dạy học viên kiểu này :

"Với dữ liệu ngày sinh kiểu text như file bạn thì thử chạy code này xem sao"

Có mà hại thêm học viên không hà!

/_í ra nên bày vẽ để đưa dữ liệu về qui chuẩn, lại đi nuôi những sai trái không đáng có!

Thật tệ đó thầy 3 Tê!
 

File đính kèm

  • BachDuong.jpg
    BachDuong.jpg
    55 KB · Đọc: 120
Upvote 0
Thầy Ba Tê dạy học viên kiểu này :

"Với dữ liệu ngày sinh kiểu text như file bạn thì thử chạy code này xem sao"

Có mà hại thêm học viên không hà!

/_í ra nên bày vẽ để đưa dữ liệu về qui chuẩn, lại đi nuôi những sai trái không đáng có!

Thật tệ đó thầy 3 Tê!
Thực ra mình để dữ liệu ngày sinh kiểu text cung nhằm thuận tiện thôi.
Do có 18 máy nhập dữ liệu cho từng sheet D01 tới D18 (có thể có nhiều người nhập cho một sheet D..) mà mỗi người nhập trường ngày tháng lại khác nhau.
VD: Có người nhập dd/mm/yyyy, nhưng có máy hiện đúng như ngày 13/12/2014 sẽ là kiểu text; nếu nhập 12/10/2014 thì có máy hiểu 12 là ngày, 10 là tháng; trong khi đó nhiều máy hiểu 10 là ngày, 12 là tháng.
Mình rất mong các bạn giúp mình tổng hợp các sheet từ D01 tới D18 vào sheet TH mà vẫn giữ nguyên kiểu dữ liệu giống như dữ liệu có trong các sheet D01 -> D18.
* Mình cũng muốn hỏi thêm là ngoài cách viết Sh = Worksheets("D01") thì có thể lấy chữ "D01" tại một cells nào đó trong sheet DATA không?
 
Upvote 0
Thực ra mình để dữ liệu ngày sinh kiểu text cung nhằm thuận tiện thôi.
Do có 18 máy nhập dữ liệu cho từng sheet D01 tới D18 (có thể có nhiều người nhập cho một sheet D..) mà mỗi người nhập trường ngày tháng lại khác nhau.
VD: Có người nhập dd/mm/yyyy, nhưng có máy hiện đúng như ngày 13/12/2014 sẽ là kiểu text; nếu nhập 12/10/2014 thì có máy hiểu 12 là ngày, 10 là tháng; trong khi đó nhiều máy hiểu 10 là ngày, 12 là tháng.
Mình rất mong các bạn giúp mình tổng hợp các sheet từ D01 tới D18 vào sheet TH mà vẫn giữ nguyên kiểu dữ liệu giống như dữ liệu có trong các sheet D01 -> D18.
* Mình cũng muốn hỏi thêm là ngoài cách viết Sh = Worksheets("D01") thì có thể lấy chữ "D01" tại một cells nào đó trong sheet DATA không?

Giữ nguyên kiểu dữ liệu là sao, Sau khi chạy code thì cột nào dòng nào không còn đúng kiểu dữ liệu?
Mình cũng muốn hỏi thêm là ngoài cách viết Sh = Worksheets("D01") thì có thể lấy chữ "D01" tại một cells nào đó trong sheet DATA không?
Ô A1 sheet Data = "D01" thì thay Sheets("D01") thành Sheets(Sheets("Data").range("A1"))

Code trên bài #7 là lấy tất cả các sheet có tên bắt đầu bằng chữ "D" về sheet("TH"), bạn đã thử Thay tên sheet "Data" rồi chạy thử chưa?
Ví dụ "Data" thành "_Data".
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giữ nguyên kiểu dữ liệu là sao, Sau khi chạy code thì cột nào dòng nào không còn đúng kiểu dữ liệu?

Ô A1 sheet Data = "D01" thì thay Sheets("D01") thành Sheets(Sheets("Data").range("A1"))
Nghĩa là cột ngày tháng hay số chứng minh thư mình để ở sheet D01 là kiểu text thì khi copy sang sheet TH cũng kiểu text.

Code trên bài #7 là lấy tất cả các sheet có tên bắt đầu bằng chữ "D" về sheet("TH"), bạn đã thử Thay tên sheet "Data" rồi chạy thử chưa?
Ví dụ "Data" thành "_Data".
Code này mình đã chạy thử thấy OK rồi. Cũng may mình chỉ có 1 sheet không copy sang sheet TH có chữ "D" ở đầu.
 
Upvote 0
Giữ nguyên kiểu dữ liệu là sao, Sau khi chạy code thì cột nào dòng nào không còn đúng kiểu dữ liệu?
Nghĩa là cột ngày tháng hay số chứng minh thư mình để ở sheet D01 -> D18 là kiểu text thì khi copy sang sheet TH cũng kiểu text.
 
Upvote 0
File của bạn fục vụ cho việc quản lí thành viên tham gia bảo hiểm

Vậy thì lúc nào đó bạn cũng sẽ fải chuyển [NgaySinh] sang dạng vốn có của nó để tính toán.

Lúc đó bạn sẽ fải làm sao?

/-(ơn nữa, chắc gì nhập như bạn đang iêu cầu sẽ không sai? (Mình thấy có người chỉ có năm sinh thôi, thì sao đây?)
 
Upvote 0
Thực ra mình để dữ liệu ngày sinh kiểu text cung nhằm thuận tiện thôi.
Do có 18 máy nhập dữ liệu cho từng sheet D01 tới D18 (có thể có nhiều người nhập cho một sheet D..) mà mỗi người nhập trường ngày tháng lại khác nhau.
VD: Có người nhập dd/mm/yyyy, nhưng có máy hiện đúng như ngày 13/12/2014 sẽ là kiểu text; nếu nhập 12/10/2014 thì có máy hiểu 12 là ngày, 10 là tháng; trong khi đó nhiều máy hiểu 10 là ngày, 12 là tháng.
...

Có người chỉ có năm sinh như trong dữ liệu là do người nhập sai. Mình đã yêu cầu trước đó là có những người trong CMT chỉ có năm sinh thì phải nhập cho người đó sinh ngày "01/01/năm sinh".

Theo như cách diễn tả của bạn thì dư liệu ngày khi nhập vào hoàn toàn không đáng tin cậy.
Thứ nhất, bạn không bắt được người nhập cài máy theo đúng 1 chuẩn - ddmm hoặc mmdd, chỉ một kiểu thôi - thì khả năng máy hiểu lầm là 50% (hoặc phần trăm của số người đặt máy theo kiểu mmdd).
Thứ hai, một khi dữ liệu của bạn có khả năng khuyết ngày thỉ làm sao bạn phân biệt được thực sự ngày sinh là 01/01 hay do chỉ được nhập năm?

Với tình trạng của bạn, chỉ có 2 cách giải quyết:
1. phân hẳn chúng ra thành 3 cột ngày tháng năm.
2. dùng ngày sinh là text, dạng yyyymmdd

...
Mình rất mong các bạn giúp mình tổng hợp các sheet từ D01 tới D18 vào sheet TH mà vẫn giữ nguyên kiểu dữ liệu giống như dữ liệu có trong các sheet D01 -> D18.
* Mình cũng muốn hỏi thêm là ngoài cách viết Sh = Worksheets("D01") thì có thể lấy chữ "D01" tại một cells nào đó trong sheet DATA không?

Trong ô A1, ghi "D01,D02,.....,D18"
Code VBA sẽ đọc ô A1, dùng hàm split để tách chuỗi ra thành mảng tên các sheets cần lấy dữ liệu. Và ò theo mảng ấy để làm việc.
 
Upvote 0
Copy dữ liệu từ file excel "So_lieu.xls" vào file excel "Tong_hop.xls"

Nhân tiện đây cho mình hỏi:
Có 18 người nhập, mỗi người nhập vào một sheet "D.." (cho file chỉ có 2 sheet là "D.." và "_DATA"). Giờ mình muốn lấy dữ liệu từ file của người đó vào đúng fle của mình với đầy đủ các sheet từ D01 đến D18 và "_DATA" với điều kiện như sau:
- Sheet "_DATA" thì lấy vào đúng sheet "_DATA", sheet "D.." lấy đúng vào sheet "D.." của mình.
- Dữ liệu gốc của mình không bị xóa đi mà chỉ bổ sung dữ liệu của người ta vào. Nếu có dòng dữ liệu nào bị trùng thì bỏ qua không lấy nữa.
Mình biết là không thuộc đề tài này nhưng không biết cách đổi tên đề tài.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chạy thử bài 11 mình nhập họ lót sai nhừng cùng số chừng minh nhân dân mà vẫn nhập thành 02 người
theo quan điểm của mình lấy cột sô CMND để lộc duy nhất mới đúng chứ
 
Lần chỉnh sửa cuối:
Upvote 0
Với dữ liệu ngày sinh kiểu text như file bạn thì thử chạy code này xem sao:
PHP:
Public Sub TongHop()
Dim Dic As Object, Ws As Worksheet, sArr(), dArr(1 To 50000, 1 To 8), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TH" Then
        sArr = Ws.Range(Ws.[A4], Ws.[A65536].End(xlUp)).Resize(, 7).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, Empty
                K = K + 1
                For J = 1 To 7
                    dArr(K, J) = sArr(I, J)
                Next J
                dArr(K, 8) = Right(sArr(I, 2), 4)
            End If
        Next I
    End If
Next Ws
With Sheets("TH")
    .[B:C].NumberFormat = "@"
    .[A4:G50000].ClearContents
    .[A4].Resize(K, 8).Value = dArr
    .[A4].Resize(K, 8).Sort Key1:=.[H4], Key2:=.[B4]
    .[H4].Resize(K).ClearContents
End With
Set Dic = Nothing
End Sub

Anh Ba Tê cho em hỏi với: cùng với nội dung như trên nhưng không xóa dữ liệu trùng nhau thì mình phải làm như thế nào?
Cái này em đang rất cần, anh giúp em với...!
Em gửi kèm file mẫu anh xem giúp em với!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hỏi về nối các sheet

Với dữ liệu ngày sinh kiểu text như file bạn thì thử chạy code này xem sao:
PHP:
Public Sub TongHop()
Dim Dic As Object, Ws As Worksheet, sArr(), dArr(1 To 50000, 1 To 8), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TH" Then
        sArr = Ws.Range(Ws.[A4], Ws.[A65536].End(xlUp)).Resize(, 7).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, Empty
                K = K + 1
                For J = 1 To 7
                    dArr(K, J) = sArr(I, J)
                Next J
                dArr(K, 8) = Right(sArr(I, 2), 4)
            End If
        Next I
    End If
Next Ws
With Sheets("TH")
    .[B:C].NumberFormat = "@"
    .[A4:G50000].ClearContents
    .[A4].Resize(K, 8).Value = dArr
    .[A4].Resize(K, 8).Sort Key1:=.[H4], Key2:=.[B4]
    .[H4].Resize(K).ClearContents
End With
Set Dic = Nothing
End Sub

Bạn cho hỏi nếu như số cột là 10 hoặc 15 thì mình sẽ thay đổi như thế nào
 
Upvote 0

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

Back
Top Bottom