Phương Phương mito
Thành viên thường trực
- Tham gia
- 1/5/19
- Bài viết
- 275
- Được thích
- 65
Cột E, F là bạn tự điền trước à.Hay thế nàoKính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
Cái đó em cũng cần code lấy ra đó ạ.Cột E, F là bạn tự điền trước à.Hay thế nào
Vậy là chỉ điền vào cột số lượng và cái cột none gì ấy à. Bạn có thể nói logic cột cuối cùng cho mình hiểu được khôngCột E, F là bạn tự điền trước à.Hay thế nào
Vậy cái chỗ bôi xanh đâu có đúng đâuCái đó em cũng cần code lấy ra đó ạ.
Chẳng giải thích gì cho người khác hiểu cách nào ra kết quả. Ngẫm mãi mới hiểu thế này.Kính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
Code chạy đúng rồi ạ. Em cảm ơn anh đã giúp đỡ ạ!Chẳng giải thích gì cho người khác hiểu cách nào ra kết quả. Ngẫm mãi mới hiểu thế này.
Bạn xem file nhé!
Cột đó chia làm 3 trường hợp khi so sánh ạ. So sánh mảng lấy ra tại E và F và mảng tại cột I, J ạ. Không có thì là NONE, có nhưng khác Code thì là DIFF còn lại là có và bằng thì là SAME ạ.Vậy là chỉ điền vào cột số lượng và cái cột none gì ấy à. Bạn có thể nói logic cột cuối cùng cho mình hiểu được không
Bài đã được tự động gộp:
Vậy cái chỗ bôi xanh đâu có đúng đâu
Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.Chẳng giải thích gì cho người khác hiểu cách nào ra kết quả. Ngẫm mãi mới hiểu thế này.
Đẹp nhất là Sort 3 cột A,B,C theo điều kiện cột A rồi B từ A-Z
Bạn xem file nhé!
Bài nầy khá phức tạp và hayKính gửi anh chị và các bạn
Em có File đính kèm. Vùng màu xanh em làm bằng tay và hàm. Nhờ anh chị hỗ trợ code VBA ạ!
WLD | 606, 611, 623 |
Sub XYZ()
Dim aTmp(), aCode(), sArr(), res(), dic As Object
Dim sRow&, i&, k&, sMa$, sCode$
With Sheets("Sheet1")
aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code
aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu
sRow = UBound(aTmp)
.Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu
sArr = .Range("A2:C2").Resize(sRow).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(aCode)
dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "")
Next i
ReDim res(1 To sRow, 1 To 4)
For i = 1 To sRow
If sMa <> sArr(i, 1) Then
k = k + 1
sMa = sArr(i, 1)
res(k, 1) = sMa
res(k, 2) = CStr(sArr(i, 2))
sCode = res(k, 2)
ElseIf sCode <> sArr(i, 2) Then
sCode = sArr(i, 2)
res(k, 2) = res(k, 2) & ", " & sCode
End If
res(k, 3) = res(k, 3) + sArr(i, 3)
Next i
For i = 1 To k
sCode = dic.Item(res(i, 1))
If sCode = Empty Then
res(i, 4) = "NONE"
ElseIf Replace(res(i, 2), " ", "") = sCode Then
res(i, 4) = "SAME"
Else
res(i, 4) = "DIFF"
End If
Next i
With Sheets("Sheet1")
.Range("B2").Resize(sRow).NumberFormat = "@"
.Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc
i = .Range("E" & Rows.Count).End(xlDown).Row
If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu
.Range("F2").Resize(k).NumberFormat = "@"
.Range("E2:H2").Resize(k) = res 'Gan ket qua
.Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua
End With
End Sub
Code hay quá ạ ! Cảm ơn anh đã trợ giúp ạ !Bài nầy khá phức tạp và hay
Yêu cầu bảng Ma_DT và CODE phải nhập chuẩn và cột CODE có nhiều code phải xếp theo thứ tự, ví dụ thêm dòng 8
606, 611, 623 được xếp thứ tự từ thấp đến cao
WLD 606, 611, 623
Mã:Sub XYZ() Dim aTmp(), aCode(), sArr(), res(), dic As Object Dim sRow&, i&, k&, sMa$, sCode$ With Sheets("Sheet1") aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu sRow = UBound(aTmp) .Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu sArr = .Range("A2:C2").Resize(sRow).Value End With Set dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(aCode) dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "") Next i ReDim res(1 To sRow, 1 To 4) For i = 1 To sRow If sMa <> sArr(i, 1) Then k = k + 1 sMa = sArr(i, 1) res(k, 1) = sMa res(k, 2) = CStr(sArr(i, 2)) sCode = res(k, 2) ElseIf sCode <> sArr(i, 2) Then sCode = sArr(i, 2) res(k, 2) = res(k, 2) & ", " & sCode End If res(k, 3) = res(k, 3) + sArr(i, 3) Next i For i = 1 To k sCode = dic.Item(res(i, 1)) If sCode = Empty Then res(i, 4) = "NONE" ElseIf Replace(res(i, 2), " ", "") = sCode Then res(i, 4) = "SAME" Else res(i, 4) = "DIFF" End If Next i With Sheets("Sheet1") .Range("B2").Resize(sRow).NumberFormat = "@" .Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc i = .Range("E" & Rows.Count).End(xlDown).Row If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu .Range("F2").Resize(k).NumberFormat = "@" .Range("E2:H2").Resize(k) = res 'Gan ket qua .Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua End With End Sub
Em muốn tô màu cho các dòng SAME, DIFF, NONE theo 3 màu và em thử thêm đoạn này dArr(I, 4).Interior.Color = 255 thì không được. Có cách gì tô màu để highlight lên không ạ !Bài nầy khá phức tạp và hay
Yêu cầu bảng Ma_DT và CODE phải nhập chuẩn và cột CODE có nhiều code phải xếp theo thứ tự, ví dụ thêm dòng 8
606, 611, 623 được xếp thứ tự từ thấp đến cao
WLD 606, 611, 623
Mã:Sub XYZ() Dim aTmp(), aCode(), sArr(), res(), dic As Object Dim sRow&, i&, k&, sMa$, sCode$ With Sheets("Sheet1") aCode = .Range("J2", .Range("K2").End(xlDown)).Value 'Ma & Code aTmp = .Range("A2", .Range("C2").End(xlDown)).Value 'Du lieu sRow = UBound(aTmp) .Range("A2:C2").Resize(sRow).Sort .[A2], 1, .[B2], , 1, Header:=xlNo 'Sort Du Lieu sArr = .Range("A2:C2").Resize(sRow).Value End With Set dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(aCode) dic.Item(aCode(i, 1)) = Replace(aCode(i, 2), " ", "") Next i ReDim res(1 To sRow, 1 To 4) For i = 1 To sRow If sMa <> sArr(i, 1) Then k = k + 1 sMa = sArr(i, 1) res(k, 1) = sMa res(k, 2) = CStr(sArr(i, 2)) sCode = res(k, 2) ElseIf sCode <> sArr(i, 2) Then sCode = sArr(i, 2) res(k, 2) = res(k, 2) & ", " & sCode End If res(k, 3) = res(k, 3) + sArr(i, 3) Next i For i = 1 To k sCode = dic.Item(res(i, 1)) If sCode = Empty Then res(i, 4) = "NONE" ElseIf Replace(res(i, 2), " ", "") = sCode Then res(i, 4) = "SAME" Else res(i, 4) = "DIFF" End If Next i With Sheets("Sheet1") .Range("B2").Resize(sRow).NumberFormat = "@" .Range("A2:C2").Resize(sRow).Value = aTmp 'Tra Du Lieu Goc i = .Range("E" & Rows.Count).End(xlDown).Row If i > 2 Then .Range("E2:H" & i).ClearContents 'Xoa ket qua cu .Range("F2").Resize(k).NumberFormat = "@" .Range("E2:H2").Resize(k) = res 'Gan ket qua .Range("E2:H2").Resize(k).Sort Key1:=Range("E2") 'Sort ket qua End With End Sub
Tô màu phải tô trên Range của Sheet, không tô trong mảng được đâu.Em muốn tô màu cho các dòng SAME, DIFF, NONE theo 3 màu và em thử thêm đoạn này dArr(I, 4).Interior.Color = 255 thì không được. Có cách gì tô màu để highlight lên không ạ !
For I = 1 To K
Txt = dArr(I, 1) & "#"
If Not .Exists(Txt) Then
dArr(I, 4) = "NONE"
dArr(I, 4).Interior.Color = 255
Else
If dArr(I, 2) = .Item(Txt) Then
dArr(I, 4) = "SAME"
Else
dArr(I, 4) = "DIFF"
End If
End If
Next I
Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.Tô màu phải tô trên Range của Sheet, không tô trong mảng được đâu.
Dấu "chấm" đầu dòng 2 là thay cho cái With bên trên - With CreateObject("Scripting.Dictionary")Anh cho em hỏi chút ạ: Cái vòng lặp em bôi đậm trong ngay đầu code của anh có ý nghĩa gì ạ ? Em chưa hiểu tác dụng của vòng lặp này ạ.
sArr = Range("J2", Range("K2").End(xlDown)).Value
Rws = UBound(sArr)
For I = 1 To Rws
.Item(sArr(I, 1) & "#") = sArr(I, 2)
Next I
Không ạ. Em muốn hỏi ý nghĩa của vòng lặp này cơ ạ. Và mối liện hệ của nó tới tổng thể code của anh ấy ạ.Dấu "chấm" đầu dòng 2 là thay cho cái With bên trên - With CreateObject("Scripting.Dictionary")
Đó là Nạp cái mảng J2:K7 vào Dictionary, Key là cột J (thêm dấu #), Item là cột K. Nếu bạn chưa biết Dictionary thì giải thích bạn cũng không hiểu. Bạn tìm bài viết về Dictionary trên GPE này để đọc.Không ạ. Em muốn hỏi ý nghĩa của vòng lặp này cơ ạ. Và mối liện hệ của nó tới tổng thể code của anh ấy ạ.
Dạ, em có đọc về DIC rồi ạ, nhưng để hiểu sâu thì khó. Em thấy sArr(I, 2) xuất hiện tổng 4 lần trong tất cả code của anh. Em hỏi chút là sArr(I, 2) đầu tiên và 3 lần sau có phải là một không ạ.Đó là Nạp cái mảng J2:K7 vào Dictionary, Key là cột J, Item là cột K. Nếu bạn chưa biết Dictionary thì giải thích bạn cũng không hiểu. Bạn tìm bài viết về Dictionary trên GPE này để đọc.
Tổng quan về Scripting.Dictionary
Với những ai yêu thích Excel nói chung và yêu thích VBA nói riêng thì chắc hẳn cũng đã biết qua các khái niệm về mảng, về công thức điều kiện, vòng lặp,..., những thứ rất quen thuộc mà gần như là sử dụng thường xuyên trong từng bài toán lập trình. Tuy nhiên, có lẽ sẽ rất ít người biết về...www.giaiphapexcel.com
Bạn đọc code thì phải xem sArr(I, 2) của từng dòng lệnh nó là gì, ở đâu.Dạ, em có đọc về DIC rồi ạ, nhưng để hiểu sâu thì khó. Em thấy sArr(I, 2) xuất hiện tổng 4 lần trong tất cả code của anh. Em hỏi chút là sArr(I, 2) đầu tiên và 3 lần sau có phải là một không ạ.
Em cảm ơn anh nhiều ạ !Bạn đọc code thì phải xem sArr(I, 2) của từng dòng lệnh nó là gì, ở đâu.
Tôi không phải người chuyên VBA mà chỉ là học lóm được trên GPE này, hiểu sao làm vậy.
Code này tôi có ghi chú những dòng lệnh tôi hiểu, bạn xem và nghiên cứu chứ giải thích hơn nữa thì tôi chịu.