Khi copy sang thì sau mỗi khách hàng có phải ghi tên nhóm đằng sau không. Số nhóm chính xác là 3 hay còn nhiều hơn.tôi có 1 copy dữ liệu ở workbook hiện tại sang 1 workbook mới theo 1 số điều kiện như file đính kèm. Nhờ các bác giúp hộ, thanks
Mở File nhấn nút "TACH...", xem kết quả đã đúng ý chưa nhé! Có gì hồi âm lại cho tôi!tôi có 1 copy dữ liệu ở workbook hiện tại sang 1 workbook mới theo 1 số điều kiện như file đính kèm. Nhờ các bác giúp hộ, thanks
Tôi chỉ viết code theo file mẫu bạn gửi. Muốn áp dụng vào file thật bạn phải túy biến cho phù hợp chứ. Mà bạn có biết nhiều về vba không? Liệu có sửa được code không?có 2 vấn đề
1. Nếu trên workbook không tồn tại 3 worksheet thì sẽ bị báo lỗi khi chạy ( và tên các worksheet như code của bạn bắt buộc phải đúng tên: Sheet2,Sheet3,Sheet4)
2.KHi tôi thay đổi dữ liệu nhóm mã tổ và chạy lại code thì dữ liệu không đúng
+ Khi tôi chạy lần 1 ( chưa thay đổi nhóm mã tổ);
![]()
+ Khi thay đổi nhóm mã tổ và chạy lại
![]()
Nếu không biết gì về VBA thì tôt hơn hết là gửi File thật nên để tôi làm giúp luôn cho. Nếu biết sửa hoặc tùy biến code thì mới đưa File file giả lập chứ. Nếu File bí mật sợ nhiều người biết thì gừi vào mail của tôi: chuot0106@gmail.com (nếu tin tưởng) còn không thì bạn tự làm vậy.nhờ bạn sửa code hộ mình với vì mình cũng amateur về vba lắm![]()
Nhưng trong file bạn gửi cho tôi đâu có nhóm tổ này? Bạn gửi lại file khác có kèm cả nhóm mã tổ nhé!các nhóm mã tổ được phân biệt với nhau bằng mỗi ô trống
![]()
Như trên thì nhóm 1 là từ LLG200800001->LLG200800004, nhóm 2 là LLG200800005->LLG200800007,.......
Tôi tưởng nhóm mã tổ phải cố định và biết trước chứ. Nếu không biết trước thì tôi không viết code được đâu. Điều kiện các nhóm mã tổ cách nhau 1 dòng trống như bạn nói chỉ có bạn mới hiểu chứ máy tính làm sao nó hiểu được. Thế nhóm mã tổ của bạn không cố định hay sao mà bạn không đưa nên được?các nhóm mã tổ được phân biệt với nhau bằng mỗi ô trống
Như trên thì nhóm 1 là từ LLG200800001->LLG200800004, nhóm 2 là LLG200800005->LLG200800007,.......
Bạn tải file đính kèm về chạy thử. Muốn thay đổi nhóm gì đó thì cứ thay đổi. Bài toán không khó nhưng cơ sở dữ liệu kỳ quá. Vì kỳ quá nên code dài lê thê. Các file mới tạo ra sẽ lưu trong cùng thư mục của file gốc. Các file trước đó cùng tên sẽ bị ghi đè.tôi có 1 copy dữ liệu ở workbook hiện tại sang 1 workbook mới theo 1 số điều kiện như file đính kèm. Nhờ các bác giúp hộ, thanks
Sub TachTach()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim GroupCode(), dataSource(), Temp(), kq(1 To 10000, 1 To 5)
Dim D1 As Object, D2 As Object, path As String, k, j, i, iTem
path = ThisWorkbook.path & "\"
Set D1 = CreateObject("scripting.dictionary")
Set D2 = CreateObject("scripting.dictionary")
With Sheets("data")
dataSource = .Range(.[A2], .[E65536].End(3)).Value
End With
ReDim Temp(1 To UBound(dataSource), 1 To 6)
With Sheets("GroupCode")
GroupCode = .Range(.[A2], .[A65536].End(3)).Resize(, 2).Value
End With
For i = 1 To UBound(GroupCode)
If GroupCode(i, 1) <> "" Then
If GroupCode(i, 2) = "" Then
GroupCode(i, 2) = GroupCode(i - 1, 2)
If Not D1.exists(GroupCode(i, 1)) Then
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
If Not D2.exists(GroupCode(i, 2)) Then
D2.Add GroupCode(i, 2), ""
End If
Else
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
End If
Next
ReDim Preserve dataSource(1 To UBound(dataSource), 1 To 6)
For i = 1 To UBound(dataSource)
If D1.exists(dataSource(i, 5)) Then
dataSource(i, 6) = D1.iTem(dataSource(i, 5))
End If
Next
For Each iTem In D2.keys
For i = 1 To UBound(dataSource)
If dataSource(i, 6) = iTem Then
k = k + 1
For j = 1 To 5
kq(k, j) = dataSource(i, j)
Next
End If
Next
With Workbooks.Add
.ActiveSheet.[A1].Resize(k, 5) = kq
.SaveAs path & iTem, 51
.Close
End With
k = 0
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Done"
End Sub
không hiểu sao khi chạy trên dữ liệu thật thì bị lỗi như hình:
Nhóm thứ nhất thì bạn biết lấy địa chỉ rồi. Giả sử bạn biết nhóm thứ n từ G10:G20 chẳng hạn, ô đầu tiên của nhóm n+1 là G22 hoặc range("G"& range("g20").end(xldown).row). Ô cuối nhóm này là range("g" & range("g22").end(xldown).row)Tôi tưởng nhóm mã tổ phải cố định và biết trước chứ. Nếu không biết trước thì tôi không viết code được đâu. Điều kiện các nhóm mã tổ cách nhau 1 dòng trống như bạn nói chỉ có bạn mới hiểu chứ máy tính làm sao nó hiểu được. Thế nhóm mã tổ của bạn không cố định hay sao mà bạn không đưa nên được?
Bạn thay code này vào chắc là được. Nếu chưa được thì tính tiếpmình up lại file rồi đó
https://www.dropbox.com/s/dkwo79azmu2by9b/gui_quanghai.xlsx
Sub TachTach()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim GroupCode(), dataSource(), kq(1 To 10000, 1 To 65)
Dim D1 As Object, D2 As Object, path As String, k, j, i, iTem
path = ThisWorkbook.path & "\"
Set D1 = CreateObject("scripting.dictionary")
Set D2 = CreateObject("scripting.dictionary")
With Sheets("data")
dataSource = .Range(.[A2], .[BM65536].End(3)).Value
End With
With Sheets("GroupCode")
GroupCode = .Range(.[A2], .[A65536].End(3)).Resize(, 2).Value
End With
For i = 1 To UBound(GroupCode)
If GroupCode(i, 1) <> "" Then
If GroupCode(i, 2) = "" Then
GroupCode(i, 2) = GroupCode(i - 1, 2)
If Not D1.exists(GroupCode(i, 1)) Then
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
If Not D2.exists(GroupCode(i, 2)) Then
D2.Add GroupCode(i, 2), ""
End If
Else
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
End If
Next
ReDim Preserve dataSource(1 To UBound(dataSource), 1 To 66)
For i = 1 To UBound(dataSource)
If D1.exists(dataSource(i, 65)) Then
dataSource(i, 66) = D1.iTem(dataSource(i, 65))
End If
Next
For Each iTem In D2.keys
For i = 1 To UBound(dataSource)
If dataSource(i, 66) = iTem Then
k = k + 1
For j = 1 To 65
kq(k, j) = dataSource(i, j)
Next
End If
Next
With Workbooks.Add
.ActiveSheet.[A1].Resize(k, 65) = kq
.SaveAs path & iTem, 51
.Close
End With
k = 0
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Done"
End Sub
Em Test thử nhưng code vẫn báo lỗi, phiền anh xem giúp ạ!Bạn thay code này vào chắc là được. Nếu chưa được thì tính tiếp
PHP:Sub TachTach() Application.ScreenUpdating = False Application.DisplayAlerts = False Dim GroupCode(), dataSource(), kq(1 To 10000, 1 To 65) Dim D1 As Object, D2 As Object, path As String, k, j, i, iTem path = ThisWorkbook.path & "\" Set D1 = CreateObject("scripting.dictionary") Set D2 = CreateObject("scripting.dictionary") With Sheets("data") dataSource = .Range(.[A2], .[BM65536].End(3)).Value End With With Sheets("GroupCode") GroupCode = .Range(.[A2], .[A65536].End(3)).Resize(, 2).Value End With For i = 1 To UBound(GroupCode) If GroupCode(i, 1) <> "" Then If GroupCode(i, 2) = "" Then GroupCode(i, 2) = GroupCode(i - 1, 2) If Not D1.exists(GroupCode(i, 1)) Then D1.Add GroupCode(i, 1), GroupCode(i, 2) End If If Not D2.exists(GroupCode(i, 2)) Then D2.Add GroupCode(i, 2), "" End If Else D1.Add GroupCode(i, 1), GroupCode(i, 2) End If End If Next ReDim Preserve dataSource(1 To UBound(dataSource), 1 To 66) For i = 1 To UBound(dataSource) If D1.exists(dataSource(i, 65)) Then dataSource(i, 66) = D1.iTem(dataSource(i, 65)) End If Next For Each iTem In D2.keys For i = 1 To UBound(dataSource) If dataSource(i, 66) = iTem Then k = k + 1 For j = 1 To 65 kq(k, j) = dataSource(i, j) Next End If Next With Workbooks.Add .ActiveSheet.[A1].Resize(k, 65) = kq .SaveAs path & iTem, 51 .Close End With k = 0 Next Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "Done" End Sub
Thêm cho bạn cái tiêu đề. Lưu ý đừng gởi tin riêng, cần gì cứ gởi trực tiếp lên diễn đàn sẽ có nhiều người giúpiamhatinh đã viết:http://www.giaiphapexcel.com/forum/...-sang-workbook-mới-theo-nhiều-điều-kiện/page3
Bạn cho mình hỏi thêm 1 tí trong code của bạn
Mình muốn để nguyên cả phần tiêu đề (header ) khi tách thành 3 nhóm mã tổ thì trong code của bạn sửa như thế nào ? cảm ơn !
Sub TachTach()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim GroupCode(), dataSource(), kq(1 To 10000, 1 To 65), tieude()
Dim D1 As Object, D2 As Object, path As String, k, j, i, iTem
path = ThisWorkbook.path & "\"
Set D1 = CreateObject("scripting.dictionary")
Set D2 = CreateObject("scripting.dictionary")
With Sheets("data")
dataSource = .Range(.[A2], .[BM65536].End(3)).Value
tieude = .[A1:BM1].Value
End With
With Sheets("GroupCode")
GroupCode = .Range(.[A2], .[A65536].End(3)).Resize(, 2).Value
End With
For i = 1 To UBound(GroupCode)
If GroupCode(i, 1) <> "" Then
If GroupCode(i, 2) = "" Then
GroupCode(i, 2) = GroupCode(i - 1, 2)
If Not D1.exists(GroupCode(i, 1)) Then
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
If Not D2.exists(GroupCode(i, 2)) Then
D2.Add GroupCode(i, 2), ""
End If
Else
D1.Add GroupCode(i, 1), GroupCode(i, 2)
End If
End If
Next
ReDim Preserve dataSource(1 To UBound(dataSource), 1 To 66)
For i = 1 To UBound(dataSource)
If D1.exists(dataSource(i, 65)) Then
dataSource(i, 66) = D1.iTem(dataSource(i, 65))
End If
Next
For Each iTem In D2.keys
For i = 1 To UBound(dataSource)
If dataSource(i, 66) = iTem Then
k = k + 1
For j = 1 To 65
kq(k, j) = dataSource(i, j)
Next
End If
Next
With Workbooks.Add
.ActiveSheet.[A1].Resize(, 65) = tieude
.ActiveSheet.[A2].Resize(k, 65) = kq
.SaveAs path & iTem, 51
.Close
End With
k = 0
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Done"
End Sub