Nhờ hướng dẫn sử dụng Dictionary Object. (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,470
Nghề nghiệp
Công chức
Tôi muốn dùng Dictionary Object để lọc duy nhất từ nhiều bảng nhưng các bảng nguồn có nhiều cột nên không biết dùng Dictionary Object như thế nào. Hiện tại Tôi chỉ lấy được 2 cột từ Dic.KeysDic.items vì vậy cần được các bạn trợ giúp viết sub hoặc chỉ dẫn. Thanks !
 
Phan phan, cái này mới! Vụ đánh dấu bằng i tăng dần thì dễ rồi, mình cũng có nghĩ tới. Nhưng truy xuất để biết item của 1 key là bao nhiêu chẳng hạn thì chưa biết.

Nếu biết thì cũng làm chứ Match chi cho khổ. Chắc chắn tốc độ tăng, không cần test luôn.

Ndu cho hỏi: Có phải để truy xuất Item của key X trong Dic, trường hợp này là dùng Item đánh dấu như số thứ tự, 1 dạng ăn gian, thì câu lệnh là:

A = Dic.Item(X)
 
Upvote 0
Phan phan, cái này mới! Vụ đánh dấu bằng i tăng dần thì dễ rồi, mình cũng có nghĩ tới. Nhưng truy xuất để biết item của 1 key là bao nhiêu chẳng hạn thì chưa biết.

Nếu biết thì cũng làm chứ Match chi cho khổ. Chắc chắn tốc độ tăng, không cần test luôn.

Ndu cho hỏi: Có phải để truy xuất Item của key X trong Dic, trường hợp này là dùng Item đánh dấu như số thứ tự, 1 dạng ăn gian, thì câu lệnh là:

A = Dic.Item(X)
Dạ! Chính xác là thế sư phụ à!
Em cứ nghĩ sư phụ dùng MATCH cho.. bình dân mà thôi chứ em không hề nghĩ là sư phụ chưa biết vụ này (lý nào?)
 
Upvote 0
Cái gì chưa biết thì thú nhận là chưa biết chứ có sao đâu.
À mà cũng có thể đọc đâu đó, rồi không xài và quên đi, coi như chưa biết.
 
Upvote 0
uh... Vội quá nên em nhầm (dù rằng bài loại này làm đến.. Nhàm luôn rồi)
em không dùng hàm match mà đánh dấu vào trong item của dictionary --> cách này luôn cho tốc độ nhanh hơn gấp vài chục lần so với match
PHP:
sub tonghopsh()
  dim dic, sh as worksheet, irow as long, i as long, j as long
  dim arr(), tmparr, tg as double
  on error resume next
  tg = timer
  application.screenupdating = false
  sheets("tonghop").range("c6:f60000").clearcontents
  with createobject("scripting.dictionary")
    for each sh in worksheets
      if sh.name <> "tonghop" and sh.name <> "dm" then
        tmparr = sh.range(sh.[c6], sh.[c65536].end(xlup)).resize(, 4).value
        for irow = 1 to ubound(tmparr, 1)
          if not isempty(tmparr(irow, 1)) then
            if not .exists(tmparr(irow, 1)) then
              i = i + 1
              .add tmparr(irow, 1), i  '<--- đây là chổ ta đánh dấu vị trí
              redim preserve arr(1 to 4, 1 to i)
              for j = 1 to 4
                arr(j, i) = tmparr(irow, j)
              next
            else
              arr(3, .item(tmparr(irow, 1))) = arr(3, .item(tmparr(irow, 1))) + tmparr(irow, 3)
            end if
          end if
        next
      end if
    next
  end with
  sheets("tonghop").range("c6").resize(i, 4) = worksheetfunction.transpose(arr)
  application.screenupdating = true
  msgbox timer - tg
end sub
1.2s là tốc độ của code khi chạy 60000 dòng mổi sheet
đúng là dic chạy cực nhanh( thực tế tôi chưa làm bảng tính nào có dữ liệu lên đến 5000 rows)
nhưng bác cho em hỏi thêm tý nữa nhé
bây giờ tôi muốn sum thêm 1 hoặc 2 cột nữa ở các sheets sang sheet "tong hop" thì sửa code như thế nào?
 

File đính kèm

Upvote 0
đúng là dic chạy cực nhanh( thực tế tôi chưa làm bảng tính nào có dữ liệu lên đến 5000 rows)
nhưng bác cho em hỏi thêm tý nữa nhé
bây giờ tôi muốn sum thêm 1 hoặc 2 cột nữa ở các sheets sang sheet "tong hop" thì sửa code như thế nào?
Sửa thành vầy thử xem:
PHP:
Sub TongHopSh()
  Dim Dic, sh As Worksheet, iRow As Long, i As Long, j As Long
  Dim Arr(), TmpArr, TG As Double
  On Error Resume Next
  TG = Timer
  Application.ScreenUpdating = False
  Sheets("TongHop").Range("C6:G60000").ClearContents
  With CreateObject("Scripting.Dictionary")
    For Each sh In Worksheets
      If sh.Name <> "TongHop" And sh.Name <> "DM" Then
        TmpArr = sh.Range(sh.[c6], sh.[C65536].End(xlUp)).Resize(, 5).Value
        For iRow = 1 To UBound(TmpArr, 1)
          If Not IsEmpty(TmpArr(iRow, 1)) Then
            If Not .Exists(TmpArr(iRow, 1)) Then
              i = i + 1
              .Add TmpArr(iRow, 1), i
              ReDim Preserve Arr(1 To 5, 1 To i)
              For j = 1 To 5
                Arr(j, i) = TmpArr(iRow, j)
              Next
            Else
              Arr(3, .Item(TmpArr(iRow, 1))) = Arr(3, .Item(TmpArr(iRow, 1))) + TmpArr(iRow, 3)
              Arr(5, .Item(TmpArr(iRow, 1))) = Arr(5, .Item(TmpArr(iRow, 1))) + TmpArr(iRow, 5)
            End If
          End If
        Next
      End If
    Next
  End With
  Sheets("TongHop").Range("C6").Resize(i, 5) = WorksheetFunction.Transpose(Arr)
  Application.ScreenUpdating = True
  MsgBox Timer - TG
End Sub
 
Upvote 0
Cám ơn bài của Thầy rất nhiều, qua đó, em nhờ Thầy có thể làm được cái bài toán của em không, là ở một bảng, với các số liệu rời rạc, ta chuyển số thành một bảng khác và loại bỏ dòng trống thì phải làm thế nào? Cụ thể trong File.

Cám ơn Thầy!
 

File đính kèm

Upvote 0
Cám ơn bài của Thầy rất nhiều, qua đó, em nhờ Thầy có thể làm được cái bài toán của em không, là ở một bảng, với các số liệu rời rạc, ta chuyển số thành một bảng khác và loại bỏ dòng trống thì phải làm thế nào? Cụ thể trong File.

Cám ơn Thầy!
Nếu như bảng số liệu anh đưa em thấy chỉ đơn thuần xác định hàng và cột bằng 0 thì xóa là được. Nhưng với anh hỏi như vậy là có ý gì khác không?
 
Upvote 0
Thật ra em cũng đã làm với AutoFilter, nhưng lại muốn học thêm hàm mảng nên hỏi vậy. Em làm đơn giản vầy:

PHP:
Sub GomDuLieu()
  With Sheet1
    .[A2:G18].AutoFilter Field:=1, Criteria1:="<>0", Criteria2:="<>"
    .Range("A4:A18,C4:C18,E4:E18,G4:G18").Copy .[J19]
    .AutoFilterMode = False
  End With
End Sub

Và em tự hỏi nếu làm bằng AutoFilter và mảng thì cái nào nên dùng và cái nào nhanh hơn trong trường hợp này?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi dời bài của MinhThien qua đây vì đây chính là topic giải quyết vấn đề này.
 
Upvote 0
NHỜ THẦY NDU GIÚP EM BÀI NÀY VỚI
NỘI DUNG YÊU CẦU NHƯ TRONG FILE (GẦN GIỐNG CHỦ ĐỀ BÀI NÀY)
XIN LỖI CÁC BÁC VÌ ĐÃ "ĐÀO MỘ" :)
CẢM ƠN MỌI NGƯỜI NHIỀU NHÉ
 

File đính kèm

Upvote 0
đây là file em thường làm các bác có gì góp ý cho em với chứ ngày nào công trình cũng nhiều mà em phân tích hoài đuối luôn
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom