Giúp Code dò tìm dùng Dictionary cho dữ liệu Lớn

Liên hệ QC
Status
Không mở trả lời sau này.

Phúc Lộc Thọ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
12/8/22
Bài viết
32
Được thích
4
Chào đại gia đình GPE . Em có 1 file có khoảng 60.000 dòng, Hiện đang dùng Vlookup làm file cực kỳ chậm ( có lúc treo file luôn ), Nay nhờ Đại gia đình giúp em code dạng Dictionary Dò tìm như hình ảnh mô tả bên dưới. Em xin chân thành cảm ơn ạ
Tương tụ như công thức tại ô G5=IF(F5="","",IFERROR(VLOOKUP(F5,$B$5:$C$60000,2,0),0))


1661609494171.png
 

File đính kèm

  • do tim.xlsb
    9.9 KB · Đọc: 18
Lần chỉnh sửa cuối:
Cột B có phải tham chiếu không. Mã trùng nhau tùm lum kia thì lấy kết quả nào là đúng.
Nghía xíu ở đây:
 
Upvote 0
Nghía xíu ở đây:
Bảng bên kia 20.000 dòng, sang bên này gấp 3 rồi anh ơi.
 
Upvote 0
Cột B có phải tham chiếu không. Mã trùng nhau tùm lum kia thì lấy kết quả nào là đúng.
Trùng thì lấy dòng trên cùng bạn nhé. Nó tương tự Như công thức này G5=IF(F5="","",IFERROR(VLOOKUP(F5,$B$5:$C$60000,2,0),0))
Bài đã được tự động gộp:

Nghía xíu ở đây:
Dạ cái đó không giống anh. Cài này nó tựa Như vlookup Nếu trùng lấy dòng trên cùng
Nó tương tự Như công thức này G5=IF(F5="","",IFERROR(VLOOKUP(F5,$B$5:$C$60000,2,0),0))
 
Upvote 0
Upvote 0
Thế Vlookup có phân biệt không?
em tự viết thế này vẫn còn sai ở chổ, nếu không tìm thấy thì cho kết quả =0 ( Hiện tại code = trống trống ). Nhờ bạn sửa giúp mình

Sub VLOOKUPVIP()
On Error Resume Next
Dim sArr(), Res(), i&, S, ir&
Dim Dic As Object, Rng As Range
Dim Tmr As Double
Set Dic = CreateObject("Scripting.dictionary")

sArr = Range("B5:C60000").Value
For i = 1 To UBound(sArr)
If Dic.exists(sArr(i, 1)) = False Then
Dic.Add (UCase(sArr(i, 1))), sArr(i, 2)
End If
Next

sArr = Range("F5:F1000").Value
For i = 1 To UBound(sArr)
If sArr(i, 1) <> "" Then
If Dic.exists(UCase(sArr(i, 1))) = True Then
sArr(i, 1) = Dic.Item(UCase(sArr(i, 1)))
End If
End If
Next
Range("G5").Resize(UBound(sArr), 1) = sArr
End Sub
 
Upvote 0
em tự viết thế này vẫn còn sai ở chổ, nếu không tìm thấy thì cho kết quả =0 ( Hiện tại code = trống trống ).
Thì thêm Else thôi.

Thay
Mã:
If Dic.exists(UCase(sArr(i, 1))) = True Then
    sArr(i, 1) = Dic.Item(UCase(sArr(i, 1)))
End If

bằng

Mã:
If Dic.exists(UCase(sArr(i, 1))) = True Then
    sArr(i, 1) = Dic.Item(UCase(sArr(i, 1)))
Else
    sArr(i, 1) = 0
End If

Hãy tập thói quen kiểm tra dữ liệu đầu vào. Trên GPE nhiều người không kiểm tra. Hãy khai báo tường minh. Đừng học thói quen xấu của nhiều người kiểu i&, ir&. Thời nào rồi mà còn kiểu này. Sẽ rất nhiều người đọc code của bạn mà không hiểu. Chính bạn sau một thời gian dài đọc lại sẽ không nhớ, không hiểu. Khai báo tường minh thì học sing lớp 1 đọc cũng hiểu.

Không cần dùng UCASE. Để không phân biệt hoa thường thì làm như ở dưới. Nên xóa kết quả cũ.
----------------
LẤY dữ liệu từ sheet vào mảng, ĐẬP kết quả từ mảng xuống sheet, và sử dụng Dictionary.

Hãy đọc kỹ chú thích.

Sau bài này mà còn hỏi cách LẤY dữ liệu từ sheet vào mảng, ĐẬP kết quả từ mảng xuống sheet, và sử dụng Dictionary thì chỉ còn nước bài nào cũng nhờ từ A tới Z. Khỏi giả đò học tập làm gì.
Mã:
Sub test()
Dim lastRow As Long, r As Long, tenhang As String, dulieu(), banggia(), TH As Object
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("G5").Resize(10 ^ 6).ClearContents    ' xoa ket qua cu neu co
        lastRow = .Range("B" & Rows.Count).End(xlUp).Row   ' dong cuoi cung co du lieu trong cot B
        If lastRow < 5 Then Exit Sub    ' neu khong co du lieu thi don do choi
        dulieu = .Range("B5:C" & lastRow).Value ' lay du lieu vao mang dulieu
        lastRow = .Range("F" & Rows.Count).End(xlUp).Row   ' dong cuoi cung co du lieu trong cot F
        If lastRow < 5 Then Exit Sub    ' neu khong co du lieu thi don do choi
        banggia = .Range("F5:F" & lastRow + 1).Value ' lay du lieu vao mang dulieu
    End With
    Set TH = CreateObject("Scripting.Dictionary")   ' tao tu dienco Ten Hang la KEY va gia la ITEM
    TH.comparemode = vbTextCompare                  ' khong phan biet chu hoa chu thuong cua Ten Hang
    For r = 1 To UBound(dulieu, 1)  ' duyet tung dong du lieu va them (Ten Hang, Gia) vao tu dien TH
        tenhang = dulieu(r, 1)  ' Ten Hang
        If tenhang <> "" Then
            If Not TH.exists(tenhang) Then TH.Add tenhang, dulieu(r, 2)                  ' neu chua co Ten Hang thi them Ten Hang voi tu cach la KEY va gia voi tu cach la ITEM
        End If
    Next r
    For r = 1 To UBound(banggia, 1) - 1 ' duyet Ten Hang trong Bang Gia, khong duyet dong lay du o cuoi
        tenhang = banggia(r, 1)  ' Ten Hang
        If tenhang <> "" Then
            If TH.exists(tenhang) Then
                banggia(r, 1) = TH.Item(tenhang) ' neu co gia cua Ten Hang trong tu dien TH thi lay vao ket qua
            Else
                banggia(r, 1) = 0
            End If
        End If
    Next r
    ThisWorkbook.Worksheets("Sheet1").Range("G5").Resize(UBound(banggia, 1)).Value = banggia

    Set TH = Nothing
End Sub
 
Upvote 0
Bảng bên kia 20.000 dòng, sang bên này gấp 3 rồi anh ơi.
Bên kia 20000 dòng là bảng cần cập nhật.
Bên này 60000 dòng là chính bảng tra. Phải tra bảng lớn vậy mới chết máy chứ.

Nhắc lại: chắc chắn là dân sàng chứng khoán rồi. Có đâu hàng "ăn uống" mà thay đổi 100 lần mỗi ngày.
 
Upvote 0
Bên kia 20000 dòng là bảng cần cập nhật.
Bên này 60000 dòng là chính bảng tra. Phải tra bảng lớn vậy mới chết máy chứ.

Nhắc lại: chắc chắn là dân sàng chứng khoán rồi. Có đâu hàng "ăn uống" mà thay đổi 100 lần mỗi ngày.

Góp Vui

Sub topspeed()
Dim rng
Set rng = Range("B5", Range("C" & Rows.Count).End(xlUp))
With Range("F5", Range("F" & Rows.Count).End(xlUp))
.Offset(, 1).Value = Evaluate("iferror(vlookup(t(if({1}," & .Address & "))," & rng.Address & ",2,0),0)")
End With
End Sub
 
Upvote 0
Góp Vui

Sub topspeed()
Dim rng
Set rng = Range("B5", Range("C" & Rows.Count).End(xlUp))
With Range("F5", Range("F" & Rows.Count).End(xlUp))
.Offset(, 1).Value = Evaluate("iferror(vlookup(t(if({1}," & .Address & "))," & rng.Address & ",2,0),0)")
End With
End Sub

Các Nút bấm Chèn code nó mờ rồi làm sao bấm hả bạn
Bài đã được tự động gộp:

Nên đưa code vào cửa sổ code, không nên để ngoài.

Các nút bấm định dạng tô màu chèn code nó đều enable = False ( mờ đi ) làm sao chèn được bạn
 

File đính kèm

  • x1.png
    x1.png
    166.5 KB · Đọc: 13
  • x1.png
    x1.png
    70.6 KB · Đọc: 11
Upvote 0
Em cứ cảm tưởng là thớt đang thử anh em sao á. Hỏi rồi lại góp vui. Không biết là ý gì nữa
Tự hỏi rồi tự viết nhỉ.
Hai bạn không biết nhơn vật này rồi. Y/Thị có lệ sau khi có bài giải xong thì tự viết lại (VBA hay công thức đều viết lại) rồi tương một câu cuối: "góp vui".

Gợi ý: cả diễn đàn này y/thị chỉ nể hai nhơn vật, không bao giờ dám xúc phạm hai vị này.
Khẳng định: tôi không phải là 1 trong 2 ấy.
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

Bài viết mới nhất

Back
Top Bottom