Cô Bé Dễ Thương
Thành viên thường trực




- Tham gia
- 30/9/16
- Bài viết
- 223
- Được thích
- 48
- Giới tính
- Nữ
Em cảm ơn thầy.Không nên viết tiêu đề gợi cảm xúc
Chạy code sau, sau đó CountIf với F là sum C, D, E
View attachment 254072Mã:Sub CellColor() For Each cel In Union(Range("h5:j8"), Range("C5:E14")) cel.Value = cel.Interior.Color cel.Font.Color = cel.Value Next End Sub
Thì cứ dùng phương pháp "cổ điển gia truyền của GPE": đít sần
For Each rg In Range("M5:Q14").Rows
ki = CStr(rg.Cells(1,1).Interior.Color) & "|" & CStr(rg.Cells(1,2).Interior.Color) & "|" & CStr(rg.Cells(1,3).Interior.Color)
ditSan(ki) = ditSan(ki) + 1
Next rg
Set rg = Range("g5:k5").ReSize(ditSan.Count, )
For i = 1 To ditSan.Count
ki = Split(diSan.Keys()(i-1), "|")
rg.Cells(i, 1).Value = i
rg.Cells(i, 2).Interior.Color = CLng(ki(0))
rg.Cells(i, 3).Interior.Color = CLng(ki(1))
rg.Cells(i, 4).Interior.Color = CLng(ki(2))
rg.Cells(i, 5).Value = ditSan.Items()(i-1)
Next i
Cái nào cũng dc ạ!Dùng VBA để viết Sub hay Function?
Public Function CountColors(ByVal rngData As Range, ByVal rngTemp As Range) As Long
Application.Volatile
Dim i As Long, j As Long
Dim col As Long
col = rngData.Columns.Count
For i = 1 To rngData.Rows.Count
For j = 1 To col
If rngData.Cells(i, j).Interior.Color <> rngTemp.Cells(1, j).Interior.Color Then Exit For
Next j
If j > col Then CountColors = CountColors + 1
Next i
End Function
Vâng.Quá tuyệt vời, Phần mềm này Mỹ tạo ra cho người Việt dùng.Code chay thích lắm ạ.Cảm ơn thầy đã giúp em ạ.Thử UDF này:
Trong ô K5 nhập:PHP:Public Function CountColors(ByVal rngData As Range, ByVal rngTemp As Range) As Long Application.Volatile Dim i As Long, j As Long Dim col As Long col = rngData.Columns.Count For i = 1 To rngData.Rows.Count For j = 1 To col If rngData.Cells(i, j).Interior.Color <> rngTemp.Cells(1, j).Interior.Color Then Exit For Next j If j > col Then CountColors = CountColors + 1 Next i End Function
=CountColors($C$5:$E$14,H5:J5)
Dí cái gì vào cái gì và tòi ra cái gì? Toàn dùng từ gợi cảm ... xúc. Tôi có code (cũng đít sần) nhưng không dí cũng không tòiRồi em dí 1 cái nó tòi ra ở cột K không ạ?
Sub CountColor()
Dim Dict, SampleRng As Range, DataRng As Range
Dim LastRw As Long, TotalColor As Long, RArr(), Tmp As Long
With Sheet1
LastRw = .Cells(1000, 2).End(xlUp).Row
Set SampleRng = .Range("H5:J8")
Set DataRng = .Range("C5:E" & LastRw)
Set Dict = CreateObject("Scripting.Dictionary")
For i = 1 To SampleRng.Rows.Count
TotalColor = SampleRng.Cells(i, 1).Interior.Color + _
SampleRng.Cells(i, 2).Interior.Color + _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Next
ReDim RArr(1 To Dict.Count, 1 To 1)
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 1) = RArr(Tmp, 1) + 1
Next
.Range("K5").Resize(Dict.Count, 1) = RArr
End With
End Sub
Mừng quá. Nhân đây em chúc thầy và các thầy hay giúp đỡ các em be bé như chúng em năm mới nhiều sức khỏe và thành đạt, thông công.Dí cái gì vào cái gì và tòi ra cái gì? Toàn dùng từ gợi cảm ... xúc. Tôi có code (cũng đít sần) nhưng không dí cũng không tòi
Nhớ xoá trắng bên dưới dữ liệu cột BPHP:Sub CountColor() Dim DictColor, SampleRng As Range, DataRng As Range Dim LastRw As Long, TotalColor As Long, RArr(), Tmp As Long With Sheet1 LastRw = .Cells(1000, 2).End(xlUp).Row Set SampleRng = .Range("H5:J8") Set DataRng = .Range("C5:E" & LastRw) Set dict = CreateObject("Scripting.Dictionary") For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color + _ SampleRng.Cells(i, 2).Interior.Color + _ SampleRng.Cells(i, 3).Interior.Color dict.Add TotalColor, i Next ReDim RArr(1 To dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color Tmp = dict.Item(TotalColor) RArr(Tmp, 1) = RArr(Tmp, 1) + 1 Next .Range("K5").Resize(dict.Count, 1) = RArr End With End Sub
Em không thấy có mục donate nhỉ. Một diễn đàn tuyệt vời.Lại gợi cảm ... xúc, sao lại thông cống?
Một câu hỏi Hóc và Búa.Lại gợi cảm ... xúc, sao lại thông cống?
Cái búa này hình dạng ra sao? Và cái gì hóc nó?Một câu hỏi Hóc và Búa.![]()
Chú Mỹ ơi!Dí cái gì vào cái gì và tòi ra cái gì? Toàn dùng từ gợi cảm ... xúc. Tôi có code (cũng đít sần) nhưng không dí cũng không tòi
Nhớ xoá trắng bên dưới dữ liệu cột BPHP:Sub CountColor() Dim Dict, SampleRng As Range, DataRng As Range Dim LastRw As Long, TotalColor As Long, RArr(), Tmp As Long With Sheet1 LastRw = .Cells(1000, 2).End(xlUp).Row Set SampleRng = .Range("H5:J8") Set DataRng = .Range("C5:E" & LastRw) Set Dict = CreateObject("Scripting.Dictionary") For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color + _ SampleRng.Cells(i, 2).Interior.Color + _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i Next ReDim RArr(1 To Dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color Tmp = Dict.Item(TotalColor) RArr(Tmp, 1) = RArr(Tmp, 1) + 1 Next .Range("K5").Resize(Dict.Count, 1) = RArr End With End Sub
Tập đọc code cho quen đi chứ. Các câu lệnh tương tự sẽ có ý nghĩa tương tựChú Mỹ ơi!
Em chào các thầy và các anh chị ạ!
Sub CountColor chú và các thầy commet giống bài như trong ảnh giúp cháu(em) với ạ!
Này thì chỉ:Nhân đây nhờ chứ và các thầy chỉ cho cháu(em) bài tập như sau:
Sub thay "chỉ" bằng "viết". Buồn quá chú Mỹ ạ, cháu ngẫm nghĩ mãi không được. Bí bách kiểu như là trên bảo dưới không nghe ấy ạ. Vì ít vốn vba quá, hay dùng chính là excel, cháu mới tự học được dăm bữa vba. Chú làm ơn " run sub viết" cho cháu với.Này thì chỉ:
- Không dùng Dict
- Dùng 1 vòng lặp duyệt qua các dòng của Range Data: nếu color1 = color2 thì tăng biến MN lên, nếu color2 = color3 thì tăng biến NQ lên
- gán 2 biến xuống 2 ô kết quả
Lại dùng từ ngữ gợi cảm ...xúc. Nhỏ này sao sao á.Sub thay "chỉ" bằng "viết". Buồn quá chú Mỹ ạ, cháu ngẫm nghĩ mãi không được. Bí bách kiểu như là trên bảo dưới không nghe ấy ạ.
Sub SumSameColor()
Dim DataRng As Range
Dim LastRw As Long, MN As Long, NQ As Long
With Sheet1
LastRw = .Cells(1000, 3).End(xlUp).Row
Set DataRng = .Range("D23:G" & LastRw)
For i = 1 To DataRng.Rows.Count
If DataRng.Cells(i, 1).Interior.Color = _
DataRng.Cells(i, 2).Interior.Color Then _
MN = MN + DataRng.Cells(i, 4)
If DataRng.Cells(i, 2).Interior.Color = _
DataRng.Cells(i, 3).Interior.Color Then _
NQ = NQ + DataRng.Cells(i, 4)
Next
.[I23].Value = MN
.[J23].Value = NQ
End With
End Sub
Bạn đọc lại Nick name sẽ thấy lạ hơnLại dùng từ ngữ gợi cảm ...xúc. Nhỏ này sao sao á.
Anh đọc hướng dẫn ở bài #4 rồi xem người ta thực hiện ở bài #5 như thế nào. Nhìn kỹ hình *** thì tôi biết là trình độ của người ta có thể ở mức mà gợi ý của anh không đủ đâu. Tôi mà gặp những người như thế thì bỏ qua hoặc cầy hộ từ A đến Z. Không gợi ý nào đủ khi mà người ta còn không biết tự thêm Sub ... End Sub. Chưa kể là có thể phải thêm chút mắm muối (vd. tạo đít sần).Này thì chỉ:
- Không dùng Dict
- Dùng 1 vòng lặp duyệt qua các dòng của Range Data: nếu color1 = color2 thì tăng biến MN lên, nếu color2 = color3 thì tăng biến NQ lên
- gán 2 biến xuống 2 ô kết quả
Tôi có xem hình bài 5, vì bài 4 của lão kia nên tôi đợi lão ấy vào mắng, nhưng lão ấy không thích "em gái mưa ... rào" hay sao ấy. Tuy nhiên khi tải file bài 19 tôi thấy đã bớt chỏng chơ, chỉ thiếu khai báo biến. Không chạy được là do lão kia viết chay nên lỗi.Anh đọc hướng dẫn ở bài #4 rồi xem người ta thực hiện ở bài #5 như thế nào.
***: nhìn một khúc code chỏng chơ mà tôi thấy buồn cười quá.
Thêm sub và end sub vẫn đỏ. Lúc đó em nghĩ thầy VPE chỉ gợi ý nên cố tình viết thiếu. Mà bài 1 bài 2 với vốn ít ỏi bọn em hay gặp kiểu lỗi biên dịch dạng thừa thiếu dấu cách, dấu phảy, cách thể hiện 1 câu lệnh... mỗi cái nho nhỏ khiến tự biên tự diễn rất khó. Nên em hay xin bài mẫu để tự học từng câu.Anh đọc hướng dẫn ở bài #4 rồi xem người ta thực hiện ở bài #5 như thế nào. Nhìn kỹ hình *** thì tôi biết là trình độ của người ta có thể ở mức mà gợi ý của anh không đủ đâu. Tôi mà gặp những người như thế thì bỏ qua hoặc cầy hộ từ A đến Z. Không gợi ý nào đủ khi mà người ta còn không biết tự thêm Sub ... End Sub. Chưa kể là có thể phải thêm chút mắm muối (vd. tạo đít sần).
***: nhìn một khúc code chỏng chơ mà tôi thấy buồn cười quá.
Cháu cảm ơn chú ạ.Tôi có xem hình bài 5, vì bài 4 của lão kia nên tôi đợi lão ấy vào mắng, nhưng lão ấy không thích "em gái mưa ... rào" hay sao ấy. Tuy nhiên khi tải file bài 19 tôi thấy đã bớt chỏng chơ, chỉ thiếu khai báo biến. Không chạy được là do lão kia viết chay nên lỗi.
Chuyện đỏ đỏ là chuyện sai, nhầm lẫn, tôi không bàn. Lý do? Vì lỗi và nhầm lẫn thì ai cũng có thể mắc phải, kể cả "cao thủ", chỉ cần một phút không tập trung. Còn chuyện không có Sub ... End Sub mới đáng nói, vì lần đầu tôi mới nhìn thấy. Nó không phải là một dấu phẩy, dấu cách để mà nhấn nhầm trong vô thức. Bỏ Sub và End Sub là phải chủ ý, hoặc không biết là nó phải có. Không thể bỏ Sub ... End Sub do sơ ý được.Thêm sub và end sub vẫn đỏ.
Có ai cắt đâu à? Code đầy đủ sửa từ gợi ý bài 4, so sánh để biết đã sửa gì, ở đâu.Chỉ vì chút đỏ cắt bài mẫu của em thì em buồn quá thầy ơi.
Sub testdemsomau()
Dim ditSan, ki
Set ditSan = CreateObject("Scripting.Dictionary")
For Each rg In Range("B5:E14").Rows
ki = CStr(rg.Cells(1, 2).Interior.Color) & "|" & CStr(rg.Cells(1, 3).Interior.Color) & "|" & CStr(rg.Cells(1, 4).Interior.Color)
ditSan(ki) = ditSan(ki) + 1
Next rg
Set rg = Range("G5:K5").Resize(ditSan.Count, 5)
For i = 1 To ditSan.Count
ki = Split(ditSan.keys()(i - 1), "|")
rg.Cells(i, 1).Value = i
rg.Cells(i, 2).Interior.Color = CLng(ki(0))
rg.Cells(i, 3).Interior.Color = CLng(ki(1))
rg.Cells(i, 4).Interior.Color = CLng(ki(2))
rg.Cells(i, 5).Value = ditSan.items()(i - 1)
Next i
End Sub
Vâng. Đầu tiên cũng phải làm cho hết báo lỡi mới kích run, em chủ ý không động 1 tý gì. Để xin full code. Vì em trọng chữ, trọng thầy, không đủ trình thêm những chỗ còn thiếu.Chuyện đỏ đỏ là chuyện sai, nhầm lẫn, tôi không bàn. Lý do? Vì lỗi và nhầm lẫn thì ai cũng có thể mắc phải, kể cả "cao thủ", chỉ cần một phút không tập trung. Còn chuyện không có Sub ... End Sub mới đáng nói, vì lần đầu tôi mới nhìn thấy. Nó không phải là một dấu phẩy, dấu cách để mà nhấn nhầm trong vô thức. Bỏ Sub và End Sub là phải chủ ý, hoặc không biết là nó phải có. Không thể bỏ Sub ... End Sub do sơ ý được.![]()
Code này thích thế. Dễ chế cháo cho nhiều bài tập.Lại dùng từ ngữ gợi cảm ...xúc. Nhỏ này sao sao á.
PHP:Sub SumSameColor() Dim DataRng As Range Dim LastRw As Long, MN As Long, NQ As Long With Sheet1 LastRw = .Cells(1000, 3).End(xlUp).Row Set DataRng = .Range("D23:G" & LastRw) For i = 1 To DataRng.Rows.Count If DataRng.Cells(i, 1).Interior.Color = _ DataRng.Cells(i, 2).Interior.Color Then _ MN = MN + DataRng.Cells(i, 4) If DataRng.Cells(i, 2).Interior.Color = _ DataRng.Cells(i, 3).Interior.Color Then _ NQ = NQ + DataRng.Cells(i, 4) Next .[I23].Value = MN .[J23].Value = NQ End With End Sub
Tôi vốn làm việc với con số, và giải trí bằng văn (hoặc đôi khi, nghệ thuật). Ít khi tôi trộn lẫn hai thứ.... vì bài 4 của lão kia nên tôi đợi lão ấy vào mắng, ...
Code nào cũng hay, cũng chế cháo được. Biết đọc code là được rồi, sau đó sẽ tự viếtCode này thích thế. Dễ chế cháo cho nhiều bài tập.
Vâng. Với bài #30 này cháu làm theo chế được nhiều bài tập. Có bài cháu chế đến 20 biến mà vẫn gọn gàng. Chế được chạy đúng, mà vẫn mơ màng chỗ vòng For sao không "Next i" mà lại Next range = MN(NQ).Code nào cũng hay, cũng chế cháo được. Biết đọc code là được rồi, sau đó sẽ tự viết
Vậy cho tôi xem code cháo cho biến thứ 3 là MQ.Vâng. Với bài #30 này cháu làm theo chế được nhiều bài tập. Có bài cháu chế đến 20 biến mà vẫn gọn gàng.
Đừng mơ, thắc mắc thì hỏi và hỏi cho rõ ràngmơ màng chỗ vòng For sao không "Next i" mà lại Next range = MN(NQ).
Vậy cho tôi xem code cháo cho biến thứ 3 là MQ.
Đừng mơ, thắc mắc thì hỏi và hỏi cho rõ ràng
Sub SumSameColor()
Dim DataRng As Range
Dim LastRw As Long, MN As Long, NQ As Long, MQ As Long
With Sheet1
LastRw = .Cells(1000, 3).End(xlUp).Row
Set DataRng = .Range("D23:G" & LastRw)
For i = 1 To DataRng.Rows.Count
If DataRng.Cells(i, 1).Interior.Color = _
DataRng.Cells(i, 2).Interior.Color Then _
MN = MN + DataRng.Cells(i, 4)
If DataRng.Cells(i, 2).Interior.Color = _
DataRng.Cells(i, 3).Interior.Color Then _
NQ = NQ + DataRng.Cells(i, 4)
If DataRng.Cells(i, 1).Interior.Color = _
DataRng.Cells(i, 3).Interior.Color Then _
MQ = MQ + DataRng.Cells(i, 4)
Next
.[I23].Value = MN
.[J23].Value = NQ
.[K23].Value = MQ
End With
End Sub
Cháo ngon đấy bé. Còn Next không có i là viết tắt, VBA hiểu là Next của For đầu tiên nhìn thấy từ dưới lên. Nếu nhiều vòng for lồng nhau thì không nên viết tắt, nhưng nếu tắt thì VBA vẫn hiểu Next theo thứ tự từ trong ra ngoàiMã:.[K23].Value = MQ
Vâng.Giống như dùng "If - End If" thì có thể viết tắt để bỏ "End if" như trong bài #30.Cháo ngon đấy bé. Còn Next không có i là viết tắt, VBA hiểu là Next của For đầu tiên nhìn thấy từ dưới lên. Nếu nhiều vòng for lồng nhau thì không nên viết tắt, nhưng nếu tắt thì VBA vẫn hiểu Next theo thứ tự từ trong ra ngoài
Thử code với điều kiện khác: cộng các trường hợp M và N đảo ngược nhau, N và Q đảo ngược nhau, M và Q đảo ngược nhau.Vâng.Giống như dùng "If - End If" thì có thể viết tắt để bỏ "End if" như trong bài #30.
Code hay ở bảng bao nhiêu cột, dòng cũng dc, muốn trích cái gì ra cũng đc. Cháu chẻ nhỏ MN, NQ, MQ:Thử code với điều kiện khác: cộng các trường hợp M và N đảo ngược nhau, N và Q đảo ngược nhau, M và Q đảo ngược nhau.
Nói hay lắm, nhưng nếu dữ liệu nhiều chừng chục ngàn dòng thì phải nghiên cứu thêm về mảng và các công cụ khác. Và hãy nhớ lại bài của bác @VetMini nói về việc tô màu: Tô màu không phải là giải pháp cho việc thay thế mã (như mấy bài trên đây):Phải nói là trích lọc rất "cưng". Với rất nhiều điều kiện.
Vâng a.Nói hay lắm, nhưng nếu dữ liệu nhiều chừng chục ngàn dòng thì phải nghiên cứu thêm về mảng và các công cụ khác. Và hãy nhớ lại bài của bác @VetMini nói về việc tô màu: Tô màu không phải là giải pháp cho việc thay thế mã (như mấy bài trên đây):
- Thứ nhất là rườm rà bảng tính, in ra cũng chẳng hiểu được mà còn tốn mực
- Thứ hai là bắt buộc phải đọc từng cell chứ không đưa vào mảng để lợi dụng bộ nhớ nhằm tăng tốc độ
- Thứ ba là không thể ứng dụng các công cụ mạnh như ADO, Power query, ...
Sub CountColor()Có ai cắt đâu à? Code đầy đủ sửa từ gợi ý bài 4, so sánh để biết đã sửa gì, ở đâu.
PHP:Sub testdemsomau() Dim ditSan, ki Set ditSan = CreateObject("Scripting.Dictionary") For Each rg In Range("B5:E14").Rows ki = CStr(rg.Cells(1, 2).Interior.Color) & "|" & CStr(rg.Cells(1, 3).Interior.Color) & "|" & CStr(rg.Cells(1, 4).Interior.Color) ditSan(ki) = ditSan(ki) + 1 Next rg Set rg = Range("G5:K5").Resize(ditSan.Count, 5) For i = 1 To ditSan.Count ki = Split(ditSan.keys()(i - 1), "|") rg.Cells(i, 1).Value = i rg.Cells(i, 2).Interior.Color = CLng(ki(0)) rg.Cells(i, 3).Interior.Color = CLng(ki(1)) rg.Cells(i, 4).Interior.Color = CLng(ki(2)) rg.Cells(i, 5).Value = ditSan.items()(i - 1) Next i End Sub
Bạn thử sửa dòng:Sub CountColor()
Dim Dict, SampleRng As Range, DataRng As Range
Dim LastRw As Long, TotalColor As Long, RArr(), Tmp As Long
With Sheet1
LastRw = .Cells(1000, 2).End(xlUp).Row
Set SampleRng = .Range("H5:J8")
Set DataRng = .Range("C5:E" & LastRw)
Set Dict = CreateObject("Scripting.Dictionary")
For i = 1 To SampleRng.Rows.Count
TotalColor = SampleRng.Cells(i, 1).Interior.Color + _
SampleRng.Cells(i, 2).Interior.Color + _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Next
ReDim RArr(1 To Dict.Count, 1 To 1)
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 1) = RArr(Tmp, 1) + 1
Next
.Range("K5").Resize(Dict.Count, 1) = RArr
End With
End Sub
- Đầu tiên cháu cảm ơn hai chú, chú @ptm0412 chú @VetMini đã cho chau2 code này, và 2 cách tạo kye cho Dictionary.
- Với bài 1 này. Khi cháu thêm nhiều kiểu nội lực dầm(các giá trị thể hiện ở ô màu nền) ở bảng "NỘI LỰC DẦM HIỆN TẠI" mà không thuộc kiểu ở bảng "NỘI LỰC DẦM MẪU " thì báo lỗi. Điều có nghĩa là các kye tạo ra ở bảng "NỘI LỰC DẦM HIỆN TẠI" không trùng kye "NỘI LỰC DẦM MẪU". Có khi nào nâng cấp code ở 2 Sub có thêm phần code bỏ qua các kye không trùng nhau giữa 2 bảng. Theo cách này hiện cháu chưa đủ kiến thức viết được đoạn code đó. Mong 2 chú giúp cháu phần code đó để cho 2 Sub trên chạy được với cả trường hợp các kye tạo ra ở bảng "NỘI LỰC DẦM HIỆN TẠI" không trùng kye "NỘI LỰC DẦM MẪU".
- Mong được 2 chú giúp cháu với ạ. Cháu xin cảm ơn nhiều ạ!
- Cảm ơn các bạn có xem qua nữa ạ!
(cháu có post ảnh lỗi khi thêm mới dữ liệu, và 2 file excel, trong đó 1 file đã thêm mới dữ liệu,1 file chưa thêm mới)
Set SampleRng = .Range("H5:J8")
Set SampleRng = .Range("H5:J11")
Em cảm ơn anh.Em hiểu ý anh. Bài này dữ liệu ở bảng "NỘI LỰC DẦM MẪU" là cố đinh. Nó chỉ có 4 kiểu. dữ liệu chỉ ở bảng "NỘI LỰC DẦM HIỆN TẠI" mới thay đổi và thêm bớt (có kiểu trùng bảng "NỘI LỰC DẦM MẪU" hoặc không trùng). Ở bài 1 này em chỉ trích ra những kiểu trùng nhau giữa 2 bảng, và đếm xem các kiểu trùng lặp đó là bao nhiêu lần,Bạn thử sửa dòng:
Thành:Mã:Set SampleRng = .Range("H5:J8")
Mã:Set SampleRng = .Range("H5:J11")
key chứ kye là kí rì. Đã là mẫu thì khi tạo dữ liệu phải tạo theo mẫu đã có. Mẫu chưa có phải tạo xong rồi mới tạo dữ liệu chứ.- Đầu tiên cháu cảm ơn hai chú, chú @ptm0412 chú @VetMini đã cho chau2 code này, và 2 cách tạo kye cho Dictionary.
- Với bài 1 này. Khi cháu thêm nhiều kiểu nội lực dầm(các giá trị thể hiện ở ô màu nền) ở bảng "NỘI LỰC DẦM HIỆN TẠI" mà không thuộc kiểu ở bảng "NỘI LỰC DẦM MẪU " thì báo lỗi. Điều có nghĩa là các kye tạo ra ở bảng "NỘI LỰC DẦM HIỆN TẠI" không trùng kye "NỘI LỰC DẦM MẪU". Có khi nào nâng cấp code ở 2 Sub có thêm phần code bỏ qua các kye không trùng nhau giữa 2 bảng. Theo cách này hiện cháu chưa đủ kiến thức viết được đoạn code đó. Mong 2 chú giúp cháu phần code đó để cho 2 Sub trên chạy được với cả trường hợp các kye tạo ra ở bảng "NỘI LỰC DẦM HIỆN TẠI" không trùng kye "NỘI LỰC DẦM MẪU".
Vâng.key chứ kye là kí rì. Đã là mẫu thì khi tạo dữ liệu phải tạo theo mẫu đã có. Mẫu chưa có phải tạo xong rồi mới tạo dữ liệu chứ.
Ngoài ra code của bác @VetMini cũng đã tạo ra thêm mẫu (key) khi dữ liệu tăng thêm mà chưa có mẫu đấy thôi. Vấn đề là thêm 1 biến lấy dòng cuối dữ liệu để chạy hết dữ liệu thay vì chỉ đến 19
Loại là loại làm sao? Code CountColor chỉ đếm mẫu có sẵn, mẫu không có sẵn (không trùng nhau) thì không đếm đó. Tuy nhiên cũng phải thêm biến tìm dòng cuối và 1 IfỞ TH2 nếu giải theo Dictionary thì có cách nào loại bỏ được các key không trung nhau giữa 2 bảng không hả chú?
Bên kia chưa xong mà lon ton qua đây bon chenBạn thử sửa dòng:
Thành:Mã:Set SampleRng = .Range("H5:J8")
Mã:Set SampleRng = .Range("H5:J11")
Con thấy Chú Mỹ vất vả quá định tiếp sức cho Chú nhưng con đã chỉ rồi, với yêu cầu mới này mà bảng mẫu chỉ lấy 4 dòng mẫu 'H5:J8' mà trong khi bảng hiện tại lại bổ sung thêm.. mà bảng mẫu không bổ sung thêm thì nó lấy cái gì để gán vào Dic để tra chứ..con thua rồi Chú Mỹ tiếp tục nhé, con không bon chen nữa ạBên kia chưa xong mà lon ton qua đây bon chen
Loại là loại làm sao? Code CountColor chỉ đếm mẫu có sẵn, mẫu không có sẵn (không trùng nhau) thì không đếm đó. Tuy nhiên cũng phải thêm biến tìm dòng cuối
Bên kia chưa xong mà lon ton qua đây bon chen
- TH1: Đúng như chị hiểu đấy ạ.Bảng mẫu chỉ lấy đến H5:J8. Key ở Bảng Mẫu và bảng Hiện Tại giống nhau => 2 code trên áp dụng bài 1 được giải quyết xongCon thấy Chú Mỹ vất vả quá định tiếp sức cho Chú nhưng con đã chỉ rồi, với yêu cầu mới này mà bảng mẫu chỉ lấy 4 dòng mẫu 'H5:J8' mà trong khi bảng hiện tại lại bổ sung thêm.. mà bảng mẫu không bổ sung thêm thì nó lấy cái gì để gán vào Dic để tra chứ..con thua rồi Chú Mỹ tiếp tục nhé, con không bon chen nữa ạ
Gợi ý rồi mà.- TH1: Đúng như chị hiểu đấy ạ.Bảng mẫu chỉ lấy đến H5:J8. Key ở Bảng Mẫu và bảng Hiện Tại giống nhau => 2 code trên áp dụng bài 1 được giải quyết xong
- TH2: Nhưng ở trường hợp Key ở bảng Hiện Tại nhiều hơn Key bảng Mẫu, mà vẫn giải theo Dictionary thì hay chăng phải có đoạn code loại bỏ được những kye không trùng nhau đó thì 2 code trên mới thực hiện được.
Khi giải bài 1 theo Dictionary ở TH2. Vậy làm cách nào để loại bỏ được những kye không trùng nhau giữa 2 danh sách? Mong chú @ptm0412 @VetMini...và các anh chị...
giúp cháu với ạ.
Hay là không thể áp dụng Dictionary trong TH2 này được ạ?
Sub CountColor()
Dim Dict, SampleRng As Range, DataRng As Range
Dim TotalColor As Long, RArr(), Tmp As Long, LastRw As Long
With Sheet1
Set SampleRng = .Range("H5:J8")
LastRw = .Cells(10000, 2).End(xlUp).Row
Set DataRng = .Range("C5:E" & LastRw)
Set Dict = CreateObject("Scripting.Dictionary")
For i = 1 To SampleRng.Rows.Count
TotalColor = SampleRng.Cells(i, 1).Interior.Color + _
SampleRng.Cells(i, 2).Interior.Color + _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Next
ReDim RArr(1 To Dict.Count, 1 To 1)
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
Tmp = Dict.Item(TotalColor)
If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1
Next
.Range("K5").Resize(Dict.Count, 1) = RArr
End With
End Sub
Không dễ ăn như vậy đâu Chú Mỹ ơi, khả năng đập đi xây lại Chú ạ....
If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1
...
Gợi ý rồi mà.
Code này chỉ đếm mẫu có sẵn (4 mẫu), bỏ qua những dữ liệu không có trong mẫu sẽ không đếm. Đáng lẽ chỉ được nhập liệu với mẫu có sẵn, mẫu nào chưa có phải khai báo (giống như bảng mã chuẩn)
Ngoài ra mở rộng DataRng đến dòng cuối thay vì chỉ đến 19.
PHP:Sub CountColor() Dim Dict, SampleRng As Range, DataRng As Range Dim TotalColor As Long, RArr(), Tmp As Long, LastRw As Long With Sheet1 Set SampleRng = .Range("H5:J8") LastRw = .Cells(10000, 2).End(xlUp).Row Set DataRng = .Range("C5:E" & LastRw) Set Dict = CreateObject("Scripting.Dictionary") For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color + _ SampleRng.Cells(i, 2).Interior.Color + _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i Next ReDim RArr(1 To Dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color Tmp = Dict.Item(TotalColor) If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1 Next .Range("K5").Resize(Dict.Count, 1) = RArr End With End Sub
Nhất chị. Thực ra em vướng từ trong tết. Tưởng được gặp được bài tương tự mà không có. Có lẽ Dictionary nên được các chú cho 1 đoạn code loại bỏ key không trùng giữa 2 danh sách. Lúc đó mới gọi là full bài Dictionary được chị nhỉ?Không dễ ăn như vậy đâu Chú Mỹ ơi, khả năng đập đi xây lại Chú ạ.![]()
Đập là đập thế nào, lại bon chen. Cách khác không cần xử lý trồi với sụt đây:Không dễ ăn như vậy đâu Chú Mỹ ơi, khả năng đập đi xây lại Chú ạ.![]()
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
If Dict.Exists(TotalColor) Then
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 1) = RArr(Tmp, 1) + 1
End If
Next
Chưa được đâu Chú Mỹ ơi, thay #NA đó nó phải ra số cơ
Đúng là xử lý được bài #54. Chị giải thích thêm cho em 2 cái này.lõi như nhau sao hết được trồi ở bài#54 vậy chị?
Pậy pạ nà. Bỏ cái trồi trồi đó là xong rồiChưa được đâu Chú Mỹ ơi, thay #NA đó nó phải ra số cơ![]()
Cháu có thể hiểu đoạn này là loại bỏ kye không trùng phải không chú.Đập là đập thế nào, lại bon chen. Cách khác không cần xử lý trồi với sụt đây:
PHP:For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color If Dict.Exists(TotalColor) Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1 Next
Tới tấp bài mới sướng quá nhìn lộn không phải chị Phương mà là của chú Mỹ 2 cách.
Ủa thế OTnhầm, cứ OT cứ tưởn bạn muốn thêm kết quả như trong file mẫu 'Dammau1 1-cothemmoi.xlsm' bạn gửi ở 43, chính vì thế OT mới bảo bạn xử lý như bài 44:Đúng là xử lý được bài #54. Chị giải thích thêm cho em 2 cái này.lõi như nhau sao hết được trồi ở bài#54 vậy chị?
Xin lỗi Chú Mỹ nhé, vì file đính kèm có kết quả mẫu,con chạy code thấy lỗi nên xử lý code theo kết quả mẫu.Pậy pạ nà. Bỏ cái trồi trồi đó là xong rồi
Đã nói là key, không phải kye. Nó có nghĩa là "Nếu có tồn tại trong Dict" (tức là có giống với 1 mẫu), ngược lại (không giống mẫu nào) thì không làm gì cả (không có else)Cháu có thể hiểu đoạn này là loại bỏ kye không trùng phải không chú.
Tới tấp bài mới sướng quá nhìn lộn không phải chị Phương mà là của chú Mỹ 2 cách.
Cần gì xử lý, lấy thủ tục testdemsomau() của bác @VetMini thêm biến dòng cuối là ra rồi. Nhưng do bon chen nên không đọc yêu cầu mới chỗ trồi trồiXin lỗi Chú Mỹ nhé, vì file đính kèm có kết quả mẫu,con chạy code thấy lỗi nên xử lý code theo kết quả mẫu.
Bài 49 con đã rút nui rồi mà nhưng cái tật bon chen không bao giờ sửa được
Thích quá giờ không biết làm sao. Làm thành viên diễn đàn chú đã sướng thế này. Nếu là hàng xóm thì... phải biết đấy.Đã nói là key, không phải kye. Nó có nghĩa là "Nếu có tồn tại trong Dict" (tức là có giống với 1 mẫu), ngược lại (không giống mẫu nào) thì không làm gì cả (không có else)
Sướng quá giờ làm sao?
Cần gì xử lý, lấy thủ tục testdemsomau() của bác @VetMini thêm biến dòng cuối là ra rồi. Nhưng do bon chen nên không đọc yêu cầu mới chỗ trồi trồi
Nếu là hàng xóm thì sang đánh nhau à?Thích quá giờ không biết làm sao. Làm thành viên diễn đàn chú đã sướng thế này. Nếu là hàng xóm thì... phải biết đấy.
Chú xử tiếp của code của chú @VetMini. Giảng cho chúng cháu bài #55, #57 thì hiện tại đến đây mới là full bài Dictionary chú ạ!
Tmp = Dict.Item(TotalColor) 'add 1 key vào Dict với item rỗng'
If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1
Sub testdemsomau()
Dim ditSan, ki, LastRw As Long
LastRw = [B1000].End(xlUp).Row
Set ditSan = CreateObject("Scripting.Dictionary")
For Each rg In Range("B5:E" & LastRw).Rows
ki = CStr(rg.Cells(1, 2).Interior.Color) & "|" & CStr(rg.Cells(1, 3).Interior.Color) & "|" & CStr(rg.Cells(1, 4).Interior.Color)
ditSan(ki) = ditSan(ki) + 1
Next rg
Set rg = Range("G5:K5").Resize(ditSan.Count, 4)
For i = 1 To ditSan.Count
ki = Split(ditSan.keys()(i - 1), "|")
rg.Cells(i, 2).Interior.Color = CLng(ki(0))
rg.Cells(i, 3).Interior.Color = CLng(ki(1))
rg.Cells(i, 4).Interior.Color = CLng(ki(2))
rg.Cells(i, 5).Value = ditSan.items()(i - 1)
Next i
End Sub
Sub countNotSample()
Dim Dict, DataRng As Range, LastRw As Long
Dim TotalColor As Long, RArr(), Tmp As Long
With Sheet1
.Range("H5:K100").Clear
LastRw = .Cells(10000, 2).End(xlUp).Row
Set DataRng = .Range("C5:E" & LastRw)
ReDim RArr(1 To DataRng.Rows.Count, 1 To 4)
Set Dict = CreateObject("Scripting.Dictionary")
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
If Not Dict.Exists(TotalColor) Then
k = k + 1
Dict.Add TotalColor, k
RArr(k, 1) = DataRng.Cells(i, 1).Interior.Color
RArr(k, 2) = DataRng.Cells(i, 2).Interior.Color
RArr(k, 3) = DataRng.Cells(i, 3).Interior.Color
RArr(k, 4) = 1
Else
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 4) = RArr(Tmp, 4) + 1
End If
Next
For i = 1 To k
.Cells(i + 4, 8).Interior.Color = RArr(i, 1)
.Cells(i + 4, 9).Interior.Color = RArr(i, 2)
.Cells(i + 4, 10).Interior.Color = RArr(i, 3)
.Cells(i + 4, 11) = RArr(i, 4)
Next
End With
End Sub
Hàng xóm với chú thì qua nhậu với chú với hát karaoke ạ. Chú ngủ sớm đi ạ. Chúc chú ngủ ngon ạ!Nếu là hàng xóm thì sang đánh nhau à?
Bài 57 giải thích tại bài 63, còn bài 55:
Nghĩa là khi không có sẵn mẫu trùng, Dict vẫn bị add thêm 1 key là TotalColor với item rỗng (item rỗng lấy ra cho vào biến Tmp sẽ là 0). Chạy hết dữ liệu thì đã bị add vài ba lần như thế. Sau khi bị add thì Dict.Count tăng lên 7 không còn là 4 nữa. Trong khi RArr() giới hạn chỉ 4 dòng, K5 mà resize 7 dòng mà gán RArr 4 dòng thì 3 dòng lỗi NA.PHP:Tmp = Dict.Item(TotalColor) 'add 1 key vào Dict với item rỗng' If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1
Biện pháp là trước khi gán tào lao vô Dict thì Count Dict trước cho vào biến DictCount, (kết quả 4), K5 resize 4 khớp với RArr, hết lỗi NA
______
Code bác @VetMini thêm biến dòng cuối:
Code đập đi làm lại:PHP:Sub testdemsomau() Dim ditSan, ki, LastRw As Long LastRw = [B1000].End(xlUp).Row Set ditSan = CreateObject("Scripting.Dictionary") For Each rg In Range("B5:E" & LastRw).Rows ki = CStr(rg.Cells(1, 2).Interior.Color) & "|" & CStr(rg.Cells(1, 3).Interior.Color) & "|" & CStr(rg.Cells(1, 4).Interior.Color) ditSan(ki) = ditSan(ki) + 1 Next rg Set rg = Range("G5:K5").Resize(ditSan.Count, 4) For i = 1 To ditSan.Count ki = Split(ditSan.keys()(i - 1), "|") rg.Cells(i, 2).Interior.Color = CLng(ki(0)) rg.Cells(i, 3).Interior.Color = CLng(ki(1)) rg.Cells(i, 4).Interior.Color = CLng(ki(2)) rg.Cells(i, 5).Value = ditSan.items()(i - 1) Next i End Sub
PHP:Sub countNotSample() Dim Dict, DataRng As Range, LastRw As Long Dim TotalColor As Long, RArr(), Tmp As Long With Sheet1 .Range("H5:K100").Clear LastRw = .Cells(10000, 2).End(xlUp).Row Set DataRng = .Range("C5:E" & LastRw) ReDim RArr(1 To DataRng.Rows.Count, 1 To 4) Set Dict = CreateObject("Scripting.Dictionary") For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color If Not Dict.Exists(TotalColor) Then k = k + 1 Dict.Add TotalColor, k RArr(k, 1) = DataRng.Cells(i, 1).Interior.Color RArr(k, 2) = DataRng.Cells(i, 2).Interior.Color RArr(k, 3) = DataRng.Cells(i, 3).Interior.Color RArr(k, 4) = 1 Else Tmp = Dict.Item(TotalColor) RArr(Tmp, 1) = RArr(Tmp, 1) + 1 End If Next For i = 1 To k .Cells(i + 4, 8).Interior.Color = RArr(i, 1) .Cells(i + 4, 9).Interior.Color = RArr(i, 2) .Cells(i + 4, 10).Interior.Color = RArr(i, 3) .Cells(i + 4, 11) = RArr(i, 4) Next End With End Sub
Nhờ bon chen nên chú tăng được mấy bài mắng, mà hễ mắng thì thêm mưa tim, chú tăng hạng. Cứ thế phát huy nhéBài 49 con đã rút nui rồi mà nhưng cái tật bon chen không bao giờ sửa được
Lúc đấy cháu cũng sợ quá. Quả này bị ghét rồi. Không được chỉ nữa rồi. Lúc đấy buồn lắm may có chị Phương vào mới cảm thấy bớt bớt bị mắng. Bí quá biết làm mỗi động tác thả tim và hỏi đi hỏi lại.Nhờ bon chen nên chú tăng được mấy bài mắng, mà hễ mắng thì thêm mưa tim, chú tăng hạng. Cứ thế phát huy nhé![]()
Theo tôi hiểu thì cộng như vậy sẽ bị trùng....Dim TotalColor As Long, RArr(), Tmp As Long
... TotalColor = DataRng.Cells(i, 1).Interior.Color + _
DataRng.Cells(i, 2).Interior.Color + _
DataRng.Cells(i, 3).Interior.Color
...
Gợi ý rồi mà.
Code này chỉ đếm mẫu có sẵn (4 mẫu), bỏ qua những dữ liệu không có trong mẫu sẽ không đếm. Đáng lẽ chỉ được nhập liệu với mẫu có sẵn, mẫu nào chưa có phải khai báo (giống như bảng mã chuẩn)
Ngoài ra mở rộng DataRng đến dòng cuối thay vì chỉ đến 19.
PHP:Sub CountColor() Dim Dict, SampleRng As Range, DataRng As Range Dim TotalColor As Long, RArr(), Tmp As Long, LastRw As Long With Sheet1 Set SampleRng = .Range("H5:J8") LastRw = .Cells(10000, 2).End(xlUp).Row Set DataRng = .Range("C5:E" & LastRw) Set Dict = CreateObject("Scripting.Dictionary") For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color + _ SampleRng.Cells(i, 2).Interior.Color + _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i Next ReDim RArr(1 To Dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color + _ DataRng.Cells(i, 2).Interior.Color + _ DataRng.Cells(i, 3).Interior.Color Tmp = Dict.Item(TotalColor) If Tmp <> 0 Then RArr(Tmp, 1) = RArr(Tmp, 1) + 1 Next .Range("K5").Resize(Dict.Count, 1) = RArr End With End Sub
- Code ở bài #51 và cách sửa ở bài #55. Hiện đã giải quyết được vấn đề thêm mẫu mới bất kỳ ở bảng "NỘI LỰC DẦM HIỆN TẠI" và mẫu ở bảng "NỘI LỰC DẦM MẪU" cố định.
Bài 65 là viết để trả lời câu hỏi (yêu cầu) ở bài 64 chứ đâu phải để giải quyết yêu cầu chính? Yêu cầu chính là đã giải quyết bằng 55 và cách 2 bài 57.khả năng không mong muốn ở bài #65.
(Bài 51 và 55 hiện đã giải quyết được yêu cầu bài toán, tuy vậy vẫn có khả năng bài #65 xảy ra.Đến đây vẫn là 99%.Nếu dùng được cách tạo key của chú @VetMini thì trọn vẹn)
Khả năng khác số cùng tổng rất ít khả năng xảy ra khi con người tự chọn màu: Thường con người chủ quan chọn những màu khá khác biệt nhau thành 1 bộ.Theo tôi hiểu thì cộng như vậy sẽ bị trùng.
Cùng số nhưng khác thứ tự:
3+4+5 = 12
4+3+5 = 12
Khác số, cùng tổng:
2+4+6 = 12
Nếu tôi lập keys màu thì tôi cộng chuỗi
Join(Array(3, 4, 5), ".") = "3.4.5"
Nếu thứ tự không phân biệt (đỏ, cam, vàng coi như vàng, cam, đỏ) thì phải sắp xếp.
TotalColor = SampleRng.Cells(i, 1).Interior.Color + _
SampleRng.Cells(i, 2).Interior.Color + _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
'-->'
TotalColor = SampleRng.Cells(i, 1).Interior.Color & _
SampleRng.Cells(i, 2).Interior.Color & _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Với cách tạo key ở bài #71 và bài #4 là tương đương nhau rồi phải không ạ.Bài 65 là viết để trả lời câu hỏi (yêu cầu) ở bài 64 chứ đâu phải để giải quyết yêu cầu chính? Yêu cầu chính là đã giải quyết bằng 55 và cách 2 bài 57.
code Dictionary của tôi và bác @VetMini là cùng thuật toán, chỉ khác thủ thuật dùng item mà thôi. Ngoài ra theo góp ý của bác ấy:
Khả năng khác số cùng tổng rất ít khả năng xảy ra khi con người tự chọn màu: Thường con người chủ quan chọn những màu khá khác biệt nhau thành 1 bộ.
Khả năng cùng màu nhưng khác thứ tự có thể xảy ra (cũng do con người: thích và chọn 1 số màu này, ít chọn màu khác)
Vậy thì đổi hết những dấu + thành dấu &:
PHP:TotalColor = SampleRng.Cells(i, 1).Interior.Color + _ SampleRng.Cells(i, 2).Interior.Color + _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i '-->' TotalColor = SampleRng.Cells(i, 1).Interior.Color & _ SampleRng.Cells(i, 2).Interior.Color & _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i
- Có 2 chỗ cần chuyển, chắc mới chuyển 1Tuy vậy, khi đổi dấu "+" thành "&" để ghép vào bài #51 và #55 code vẫn chưa chay được chú Mỹ ạ. Mong chú xây lại bài #51,#55 với Kye đã chuyển dấu + thành dấu &.
Sub CountColor2()
Dim Dict, SampleRng As Range, DataRng As Range
Dim TotalColor As String, RArr(), Tmp As Long, LastRw As Long
With Sheet1
Set SampleRng = .Range("H5:J8")
LastRw = .Cells(10000, 2).End(xlUp).Row
Set DataRng = .Range("C5:E" & LastRw)
Set Dict = CreateObject("Scripting.Dictionary")
For i = 1 To SampleRng.Rows.Count
TotalColor = SampleRng.Cells(i, 1).Interior.Color & _
SampleRng.Cells(i, 2).Interior.Color & _
SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Next
ReDim RArr(1 To Dict.Count, 1 To 1)
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color & _
DataRng.Cells(i, 2).Interior.Color & _
DataRng.Cells(i, 3).Interior.Color
If Dict.Exists(TotalColor) Then
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 1) = RArr(Tmp, 1) + 1
End If
Next
.Range("K5").Resize(Dict.Count, 1) = RArr
End With
End Sub
For i = 1 To SampleRng.Rows.Count
TotalColor = SampleRng.Cells(i, 1).Interior.Color & _
"|" & SampleRng.Cells(i, 2).Interior.Color & _
"|" & SampleRng.Cells(i, 3).Interior.Color
Dict.Add TotalColor, i
Next
ReDim RArr(1 To Dict.Count, 1 To 1)
For i = 1 To DataRng.Rows.Count
TotalColor = DataRng.Cells(i, 1).Interior.Color & _
"|" & DataRng.Cells(i, 2).Interior.Color & _
"|" & DataRng.Cells(i, 3).Interior.Color
If Dict.Exists(TotalColor) Then
Tmp = Dict.Item(TotalColor)
RArr(Tmp, 1) = RArr(Tmp, 1) + 1
End If
Next
.Range("K5").Resize(Dict.Count, 1) = RArr
- Sự kết hợp code của 2 chú @ptm0412 @VetMini đã tạo ra tuyệt tác của của trí tuệ.- Có 2 chỗ cần chuyển, chắc mới chuyển 1
- Chưa khai báo lại biến TotalColor thành String
Tuy nhiên nối chuỗi cũng sẽ bị trùng với những Interior.Color ngắn dài không đềuPHP:Sub CountColor2() Dim Dict, SampleRng As Range, DataRng As Range Dim TotalColor As String, RArr(), Tmp As Long, LastRw As Long With Sheet1 Set SampleRng = .Range("H5:J8") LastRw = .Cells(10000, 2).End(xlUp).Row Set DataRng = .Range("C5:E" & LastRw) Set Dict = CreateObject("Scripting.Dictionary") For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color & _ SampleRng.Cells(i, 2).Interior.Color & _ SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i Next ReDim RArr(1 To Dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color & _ DataRng.Cells(i, 2).Interior.Color & _ DataRng.Cells(i, 3).Interior.Color If Dict.Exists(TotalColor) Then Tmp = Dict.Item(TotalColor) RArr(Tmp, 1) = RArr(Tmp, 1) + 1 End If Next .Range("K5").Resize(Dict.Count, 1) = RArr End With End Sub
Có lẽ nối thêm ký tự phân cách như bác @VetMini:
PHP:For i = 1 To SampleRng.Rows.Count TotalColor = SampleRng.Cells(i, 1).Interior.Color & _ "|" & SampleRng.Cells(i, 2).Interior.Color & _ "|" & SampleRng.Cells(i, 3).Interior.Color Dict.Add TotalColor, i Next ReDim RArr(1 To Dict.Count, 1 To 1) For i = 1 To DataRng.Rows.Count TotalColor = DataRng.Cells(i, 1).Interior.Color & _ "|" & DataRng.Cells(i, 2).Interior.Color & _ "|" & DataRng.Cells(i, 3).Interior.Color If Dict.Exists(TotalColor) Then Tmp = Dict.Item(TotalColor) RArr(Tmp, 1) = RArr(Tmp, 1) + 1 End If Next .Range("K5").Resize(Dict.Count, 1) = RArr
Coi chừng sa vào bước xe đổ của @Hoàng Nhật Phương, căn bản chưa vững mà túm lấy công cụ mạnh. Cụ thể là lỗi chưa biết bug để biết chỗ sai, chỗ sai không biết sửa, gợi ý sửa lại làm không đúng.đã đầy đủ về Dictionary trong VBA,đã trọn vẹn 100%.
Lần đầu tiên ạ.Coi chừng sa vào bước xe đổ của @Hoàng Nhật Phương, căn bản chưa vững mà túm lấy công cụ mạnh. Cụ thể là lỗi chưa biết bug để biết chỗ sai, chỗ sai không biết sửa, gợi ý sửa lại làm không đúng.
Ngoài ra nói về Dictionary, item của nó còn nhiều ứng dụng đáng nói, thí dụ như đối với 1 bài toán nào đó sẽ gán item bằng 1 mảng. Vài bữa lại tuyên bố 100% lần 3, lần 4, lần n thì quan viên 2 họ mắng cho, chứ chẳng phải mình lão chết tiệt mắng.
File dưới đây cùng 1 bài toán, 2 code dùng Dict khác nhau, 1 code dùng Dict với item là mảng, 1 code dùng Dict và 1 mảng kết quả nhưng item được gán và sử dụng linh hoạt.Lần đầu tiên ạ.
Nhưng cách đẻ ra key khó thiệt chú ạ. Nếu vậy đến đây hi vọng đc 50% về Dictionary. Còn 1/2 như chưa biết lúc nào sẽ gặp. Chú bao nhiều sân có gì chú chỉ cháu ít link về item là mảng chú nhé.
Cháu ngoại Chú Mỹ trông dễ thương thương quá đi - nghịch đảo với Chú MỹKhuyến mãi ảnh cháu ngoại ngày mồng 1
View attachment 254255
Bé đáng yêu xinh xắn quá chú ạ!File dưới đây cùng 1 bài toán, 2 code dùng Dict khác nhau, 1 code dùng Dict với item là mảng, 1 code dùng Dict và 1 mảng kết quả nhưng item được gán và sử dụng linh hoạt.
Ghi chú: code 1 với item là mảng chậm hơn do gán xuống sheet nhiều lần hơn so với code 2 chỉ gán kết quả 1 lần.
Khuyến mãi ảnh cháu ngoại ngày mồng 1
View attachment 254255
Cháu ngoại Chú Mỹ trông dễ thương thương quá đi - nghịch đảo với Chú Mỹ
Có 2 đứa gọi chú thì 1 đứa chê 1 đứa khen, 1 đứa yêu 1 đứa ghét, dù rằng lão ấy mắng cả 2.Chú như ông Bụt ..... 2 ông cháu lúc nào cũng hạnh phúc đáng yêu!
Phải tự suy nghĩ chứ đâu có khóCháu có bài tập số 5: Điền tên vào ô có điều kiện. Mong các chú các bác và các anh chị giúp cháu với ạ!
Sub CheckNote()
Dim Dict, SData As Range, RArr(), Sample As Range
Dim LastRw As Long, sKey As String, DataRows As Long
Set Dict = CreateObject("Scripting.Dictionary")
Set Sample = Range("I5:K8")
For i = 1 To Sample.Rows.Count
sKey = Sample(i, 1).Interior.Color & _
"|" & Sample(i, 2).Interior.Color & _
"|" & Sample(i, 3).Interior.Color
Dict.Add sKey, i
Next
LastRw = Cells(1000, 2).End(xlUp).Row
Set SData = Range("C5:E" & LastRw)
DataRows = SData.Rows.Count
ReDim RArr(1 To DataRows, 1 To 1)
For i = 1 To DataRows
sKey = SData(i, 1).Interior.Color & _
"|" & SData(i, 2).Interior.Color & _
"|" & SData(i, 3).Interior.Color
If Dict.exists(sKey) Then RArr(i, 1) = "Yes"
Next
Range("F5:F1000").ClearContents
Range("F5").Resize(UBound(RArr, 1), 1).Value = RArr
End Sub
Cháu sửa các code cũ trong Thớt, đến chỗ tạo skey từ Sdata, nó báo lỗi và vốn " từ vựng vba" còn ít nên người và máy chưa hiểu được nhau.Phải tự suy nghĩ chứ đâu có khó
PHP:Sub CheckNote() Dim Dict, SData As Range, RArr(), Sample As Range Dim LastRw As Long, sKey As String, DataRows As Long Set Dict = CreateObject("Scripting.Dictionary") Set Sample = Range("I5:K8") For i = 1 To Sample.Rows.Count sKey = Sample(i, 1).Interior.Color & _ "|" & Sample(i, 2).Interior.Color & _ "|" & Sample(i, 3).Interior.Color Dict.Add sKey, i Next LastRw = Cells(1000, 2).End(xlUp).Row Set SData = Range("C5:E" & LastRw) DataRows = SData.Rows.Count ReDim RArr(1 To DataRows, 1 To 1) For i = 1 To DataRows sKey = SData(i, 1).Interior.Color & _ "|" & SData(i, 2).Interior.Color & _ "|" & SData(i, 3).Interior.Color If Dict.exists(sKey) Then RArr(i, 1) = "Yes" Next Range("F5:F1000").ClearContents Range("F5").Resize(UBound(RArr, 1), 1).Value = RArr End Sub
- Lỗi gì khi tạo skey?Cháu sửa các code cũ trong Thớt, đến chỗ tạo skey từ Sdata, nó báo lỗi và vốn " từ vựng vba" còn ít nên người và máy chưa hiểu được nhau.
Code bài #83 có thêm nhiều "từ vựng vba" mới nếu không phải bậc thầy không tạo ra nổi đoạn code trên.
Nó là bài thiết kế cấu kiện bê tông cốt thép bác ạ. Tô màu là dạng giá trị thay đổi (khoảng giá trị mà ta đặt ra). Mỗi 1 trường tải trọng thì nội lực thay đổi. Hiện giá trị là màu sắc xem có thay đổi nhiều không. Để tiết kiệm, để đủ khả năng chịu lực. Cứ làm thì nó nảy ra vấn đề mới. Từ đó nó các dạng bài tập trong thớt. Từ đó trích lọc phân tích đánh giá dữ liệu của mình.Bài tập này ở đâu ra vậy?
1. Nếu ở trường nào đó thì nghỉ học đi. Trường này dạy đồ trên trời, không thực dụng chút nào cả.
2. Néu tự ra cho mình làm thì quên đi. Loại bày này học nhiều mà thu thập kiến thức rất hẹp (có thể rất sâu nhưng rất hẹp)
Sâu: đi sâu vào bên trong, đến tận gốc.
Hẹp: kiến thức nhặt trong đường đi rất đăc thù, chả sử dụng được vào các trường hợp khác.
Đối với người mới học code, chiều rộng quna trọng hơn chiều sâu. Vì học sâu úa mà không có chỗ ứng dụng thì một thời gian sẽ hoặc tẩu mã hoặc quên béng hết.
Tôi chỉ nói chiều rộng quan trọng hơn thôi chứ chiều sâu cần phải biết chút đỉnh. Không đủ chiều sâu thì rất dễ bị sai.
Cháu có học chứ ạ. Bác yêu cầu cao thôi mỗi người một khả năng và tu vi khác nhau. Đấy chưa gì bác đã bảo không đụng vào bài nào của cháu. Bác là người có ảnh hưởng trong diễn đàn, bác mắng rồi không chỉ là cháu thiệt lắm rồi. Giờ các chú bác khác nhìn vào không rõ thực hư. Là cháu bắt đền bác đấy.Ứng dụng như vậy mà dùng màu là tự làm khó mình.
Nếu của mấy thằng kỹ sư công trình chúng bắt làm vậy thì là do tụi nó dốt về quản trị dữ liệu rồi bày đặt màu mè để che lấp cái lười học hỏi thêm của mình. Mà cái này thì trường hợp bạn chắc phải chịu thua. Tuy nhiên bạn phải tìm cách nói khéo với chúng là đòi hỏi này rất khó, và bạn phải nhờ nhiều chỗ mới thực hiện được. Nếu bạn ngại không nói là tự đặt mình vào thế cưỡi lưng cọp, về sau chúng ăn quen càng có nhiều đòi hỏi rất khó làm.
(hầu hết mấyb thằng kỹ sư công trình chỉ biết học uống rượu, cfhuws cải tiến tư duy suy nghĩ thì tụi nó có đầy đủ lý do để bảo vệ chủ quan. Chỉ khi nào bạn chức vụ cao hơn chúng mới có thể nói chuyện. Mấy cái này tôi thường không nói thẳng với chúng nó mà để cho sếp tôi nói chuyện với sếp của chúng)
Nặng lời: tôi nói chuyện luôn nặng lời như vậy. Không muốn thì cứ nói thẳng ra. Tôi hứa sẽ không động chạm đến bàu nào của bạn nữa.
Đừng nói giùm người khác "nhiều người học về vba thì cũng gặp vấn đề như cháu thôi". Ngwoif hiếu học không vì mấy lời nặng nhẹ mà để tâm. Giới trẻ ngày nay hay bị lẩm lẫn giữa "hiếu học" và "đam mê". Cái "hiếu học" là trường cửu (*), cái "đam mê" là nhất thời.
Và bạn nói "vừa học vừa ứng dụng vào công việc" là quá chủ quan. Bạn chỉ ứng dụng thôi, còn học thì xa lắm. Bằng chứng là nếu học được rồi thì bác kia đã không nói câu như bài #83, và hỏi lại trong bài #85.
(*) ngày xưa, con số hoàn hảo là số 9. Ngày nay, sự hoàn hảo thay đổi bằng sự thịnh vượng (số 8). Có lẽ quan niệm xã hội vì vậy mà không còn quý trọng "trường cửu"
Gốc của tôi là kỹ sư công nghệ (Industrial Engineering, học ở VN). Kỹ sư công chánh (Civil Engineering, học ở ngoại quốc). Tôi làm nhiều năm trong những ngành nghề này trước khi chuyển qua CNTT.Tôi đoán những bài này có liên quan đến thiết kế nội lực trong xây dựng, ...
Gốc của tôi là kế toán. Kế toán các công ty ngành nghề khác nhau thì lượm lặt mỗi ngành nghề 1 ít. Khi chuyển sang làm phân tích thiết kế phần mềm thì lượm lặt thêm 1 ít khác từ các đối tác ngành nghề khác nhauGốc của tôi là kỹ sư công nghệ (Industrial Engineering, học ở VN). Kỹ sư công chánh (Civil Engineering, học ở ngoại quốc). Tôi làm nhiều năm trong những ngành nghề này trước khi chuyển qua CNTT.
Có một số bài của bạn mình đã thử và cũng cảm thấy kết quả ổn, nhưng với ngôn ngữ giao tiếp của bạn mình thấy cũng không phù hợp với mình nên chỉ đứng ngoài thôi.Cháu có ông bác nay ngoài 70 tuổi. Từ nhiều năm trước bác và những người bạn đầu bạc năm nào cũng đi chúc tết thầy giáo hơn 20 tuổi mà cháu luôn thấy ấn tượng về tình cảm đó. Nửa chữ cũng là thầy cháu luôn trân trọng sự giúp đỡ của các chú bác trên diễn đàn. Lấy lòng đã khó làm phật ý thì cực biết mấy.
Quả thật còng lưng cả tháng, đau lưng lan xuống cẳng mà vẫn chỉ sao chép lại code. Với sự giúp đỡ của chú Mỹ cháu chế đc đến 40 sub và nhưng còn nhiều nữa không biết có chế thêm đc không.
Chẳng cần lấy lòng gì đâu, đối với những người đã từng giúp (hoặc dạy) mà mình có tôn trọng thì khi bị mắng, trách, chê, .. phải vui vẻ mà nhận để mà rút kinh nghiệm, đừng trả lời vòng vo hoặc biện minh các kiểu. Những người lớn có kinh nghiệm họ thấy hết không nói sai đâu.Lấy lòng đã khó làm phật ý thì cực biết mấy.
Rốt cuộc thì đã rõ rồi. Phương pháp truyền đạt kiến thức của tôi không thích hợp với thớt.
Tôi xin dừng ở đây. Hết.
Vâng.Có một số bài của bạn mình đã thử và cũng cảm thấy kết quả ổn, nhưng với ngôn ngữ giao tiếp của bạn mình thấy cũng không phù hợp với mình nên chỉ đứng ngoài thôi.
Dạ. Cháu vừa về nhà ạ.- Lỗi gì khi tạo skey?
- Từ vựng nào mới?
Đó là cú pháp và lý luận không phải từ vựng. Từ vựng là từ chẳng hạn Do, while, until ... mới chưa từng gặp- Cháu nghĩ trọng tâm code chính là tạo ra phần "từ vựng vba" ( những đoạn code lý luận) phần này học bài sơ khai càng ít có cơ hội gặp.