Lấy giá trị cuối cùng

Liên hệ QC

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Ế
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 ạ ?
 

File đính kèm

  • LAY GIA CUOI CUNG.xlsm
    10.5 KB · Đọc: 41
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
 
Upvote 0
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 ạ ?
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
 
Upvote 0
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 ạ ?
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
 
Upvote 0
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

E cảm ơn các bác nhìu !
 
Upvote 0
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à?)
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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

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.
 

File đính kèm

  • LAY GIA CUOI CUNG-2.xlsm
    15.9 KB · Đọc: 7
Upvote 0
Code số 3 (bài 4) cũng không phải tệ đâu nha bạn

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 !
 
Lần chỉnh sửa cuối:
Upvote 0
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à?)

AF là gì vậy các bác ơi @!##
 
Upvote 0
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.
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ỏ.
Mã:
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
 
Upvote 0
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.

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ồ.

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 !

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.
 
Lần chỉnh sửa cuối:
Upvote 0
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ỏ.
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
Thank bạn nha. Mình làm đc rùi

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.

-=.,, Bác Vetmini có vốn ngôn từ phong phú quá. thank b nhìu nha, ngày mới tốt lành ạ :)
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom