keke355992
Thành viên thường trực
- Tham gia
- 19/1/08
- Bài viết
- 310
- Được thích
- 20
- Nghề nghiệp
- KẾ TOÁN THUẾ, TƯ VẪN THUẾ
Option Explicit
Sub DonGiaCuoi()
Dim Cls As Range, Rng As Range, sRng As Range
Dim MyAdd As String
Set Rng = Range([c4], [C5].End(xlDown))
For Each Cls In Range([G5], [G5].End(xlDown))
Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
Cls.Offset(, 1).Value = sRng.Offset(, 1).Value
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Next Cls
End Sub
Xin chào các anh chị trong diễn đàn. E có mong muốn như trong file đính kèm. Nhờ các Anh chị xem giúp ạ, E xin cảm ơn !
P/s: Cho em hỏi Chức năng gợi ý Khi gửi đề tài mới hiện tại không hoạt động được phải ko ạ ?
Sub cuoicung()
Dim dic As Object, arr, darr, k As Long, i As Long
arr = Range("C5:D" & Range("C65000").End(3).Row).Value
ReDim darr(1 To UBound(arr), 1 To 2)
Set dic = CreateObject("Scripting.Dictionary")
With dic
For i = UBound(arr) To LBound(arr) Step -1
If Not .exists(arr(i, 1)) Then
k = k + 1
.Add arr(i, 1), k
darr(k, 1) = arr(i, 1)
darr(k, 2) = arr(i, 2)
End If
Next
End With
Range("G5").Resize(k, 2) = darr
End Sub
Xin chào các anh chị trong diễn đàn. E có mong muốn như trong file đính kèm. Nhờ các Anh chị xem giúp ạ, E xin cảm ơn !
P/s: Cho em hỏi Chức năng gợi ý Khi gửi đề tài mới hiện tại không hoạt động được phải ko ạ ?
Public Sub GPE()
Dim sArr, dArr, I As Long, J As Long
sArr = Range([C5], [C5].End(4)).Resize(, 2).Value
dArr = Range([G5], [G5].End(4)).Resize(, 2).Value
For J = 1 To UBound(dArr)
For I = UBound(sArr) To 1 Step -1
If dArr(J, 1) = sArr(I, 1) Then dArr(J, 2) = sArr(I, 2): Exit For
Next I
Next J
Range("G10").Resize(J - 1, 2) = dArr
End Sub
PHP:Option Explicit Sub DonGiaCuoi() Dim Cls As Range, Rng As Range, sRng As Range Dim MyAdd As String Set Rng = Range([c4], [C5].End(xlDown)) For Each Cls In Range([G5], [G5].End(xlDown)) Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then MyAdd = sRng.Address Do Cls.Offset(, 1).Value = sRng.Offset(, 1).Value Set sRng = Rng.FindNext(sRng) Loop While Not sRng Is Nothing And sRng.Address <> MyAdd End If Next Cls End Sub
Mã:Sub cuoicung() Dim dic As Object, arr, darr, k As Long, i As Long arr = Range("C5:D" & Range("C65000").End(3).Row).Value ReDim darr(1 To UBound(arr), 1 To 2) Set dic = CreateObject("Scripting.Dictionary") With dic For i = UBound(arr) To LBound(arr) Step -1 If Not .exists(arr(i, 1)) Then k = k + 1 .Add arr(i, 1), k darr(k, 1) = arr(i, 1) darr(k, 2) = arr(i, 2) End If Next End With Range("G5").Resize(k, 2) = darr End Sub
Mã:Public Sub GPE() Dim sArr, dArr, I As Long, J As Long sArr = Range([C5], [C5].End(4)).Resize(, 2).Value dArr = Range([G5], [G5].End(4)).Resize(, 2).Value For J = 1 To UBound(dArr) For I = UBound(sArr) To 1 Step -1 If dArr(J, 1) = sArr(I, 1) Then dArr(J, 2) = sArr(I, 2): Exit For Next I Next J Range("G10").Resize(J - 1, 2) = dArr End Sub
Vậy đố ban biết trong 3 đoạn code trợ giúp ở trên thì code nào tối ưu nhất?E cảm ơn các bác nhìu !
Vậy đố ban biết trong 3 đoạn code trợ giúp ở trên thì code nào tối ưu nhất?
-----------------------------------------------------------------------------
(cảm giác rằng bài này dùng AF được mà sao thử hoài vẫn không ra vậy cà?)
Code thứ 2, dùng Dic ạ, Sau bài tập này e mới biết đến Dic và đang nghiên cứu thêm. Nó cũng có thể làm được gần như ADO vậy.
Mã:Sub cuoicung() Dim dic As Object, arr, darr, k As Long, i As Long arr = Range("C5:D" & Range("C65000").End(3).Row).Value ReDim darr(1 To UBound(arr), 1 To 2) Set dic = CreateObject("Scripting.Dictionary") With dic For i = UBound(arr) To LBound(arr) Step -1 If Not .exists(arr(i, 1)) Then k = k + 1 .Add arr(i, 1), k darr(k, 1) = arr(i, 1) darr(k, 2) = arr(i, 2) End If Next End With Range("G5").Resize(k, 2) = darr End Sub
Rằng Bạn chắc chắn chứ...???
Code số 3 (bài 4) cũng không phải tệ đâu nha bạn
Thử công thức CF này:
=COUNTIF($C$4:C4,C4)=COUNTIF($C$4:$C$11,C4)
Vậy đố ban biết trong 3 đoạn code trợ giúp ở trên thì code nào tối ưu nhất?
-----------------------------------------------------------------------------
(cảm giác rằng bài này dùng AF được mà sao thử hoài vẫn không ra vậy cà?)
Bạn cũng có thể làm thủ công bằng RemoveDuplicate nhé. Bạn dùng cột phụ đánh STT và sắp xếp từ lớn tới nhỏ.Giả sử mình thêm 1 cột nữa ở dữ liệu ban đầu, thì đoạn code phải sửa như nào để chạy đc vậy.
Sub cuoicung()
Dim dic As Object, arr, darr, k As Long, i As Long
arr = Range("C5:[COLOR=#ff0000]E[/COLOR]" & Range("C65000").End(3).Row).Value
ReDim darr(1 To UBound(arr), 1 To 2)
Set dic = CreateObject("Scripting.Dictionary")
With dic
For i = UBound(arr) To LBound(arr) Step -1
If Not .exists(arr(i, 1)) Then
k = k + 1
.Add arr(i, 1), k
darr(k, 1) = arr(i, 1)
darr(k, 2) = arr(i, [COLOR=#ff0000]3[/COLOR])
End If
Next
End With
Range("G5").Resize(k, 2) = darr
End Sub
Code thứ 2, dùng Dic ạ, Sau bài tập này e mới biết đến Dic và đang nghiên cứu thêm. Nó cũng có thể làm được gần như ADO vậy.
Vâng, nó chỉ chậm hơn code của Quanluu1989 1 chút, và thuật toán cũng gần gần như nhau thì phải. Đúng là viết code này, thuật toán quan trọng hơn là biết nhiều lệnh, nhiều hàm !
Thử công thức CF này:
=COUNTIF($C$4:C4,C4)=COUNTIF($C$4:$C$11,C4)
Thank bạn nha. Mình làm đc rùiBạn cũng có thể làm thủ công bằng RemoveDuplicate nhé. Bạn dùng cột phụ đánh STT và sắp xếp từ lớn tới nhỏ.
Mã:Sub cuoicung() Dim dic As Object, arr, darr, k As Long, i As Long arr = Range("C5:E" & Range("C65000").End(3).Row).Value ReDim darr(1 To UBound(arr), 1 To 2) Set dic = CreateObject("Scripting.Dictionary") With dic For i = UBound(arr) To LBound(arr) Step -1 If Not .exists(arr(i, 1)) Then k = k + 1 .Add arr(i, 1), k darr(k, 1) = arr(i, 1) darr(k, 2) = arr(i, 3) End If Next End With Range("G5").Resize(k, 2) = darr End Sub
2 công cụ, 2 mục đích khác nhau. So sánh "tàu ngầm cũng có thể làm được gần như phi cơ chiến đấu vậy" là chỉ so sánh về tính chất bắn hoả tiễn hạ tàu chiến, hoàn toàn khong lý tới việc một cái ở trên không và cái kia ở dưới nước. Một cát có thể tự túc hằng tháng cái kia chỉ bay 1 phi vụ vài tiếng đồng hồ.
Không đúng. Mỗi code nó có điểm mượt (sweet spot) của nó. Một code có thể ưu việt (*) hơn code kia ở trong một khoảng dữ liệu nào đó (số dòng, độ lặp lại của dữ liệu,...)
Nếu 2 code nhìn gần giống nhau thì phải THỬ TRÊN NHIỀU LOẠI DỮ LIỆU mới biết.
(*) chú ý tôi dùng từ ưu việt thay vì tối ưu. Tức là tương đối thay vì tuyệt đối.
Nhiều lúc chuyện đơn giản nhưng nghĩ hoài không ra (đậu phộng đường) nên trở thành khó
Cảm ơn bạn!
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2