Nhờ anh chị giúp Dictionary thay hàm Sumif
Sub Thong_ke() Dim i As Long, K As Long, DCuoi As Long, J As Long Dim Arr_N(), Arr_D(), Dic As Object DCuoi = Sheet1.Range("A" & Rows.Count).End(xlUp).Row Arr_N = Sheet1.Range("A5:W" & DCuoi) ReDim Arr_D(1 To UBound(Arr_N, 1), 1 To 8) Set Dic = CreateObject("Scripting.Dictionary") K = 0 For i = 1 To UBound(Arr_N, 1) If Not Dic.exists(Arr_N(i, 6)) Then K = K + 1 Dic.Add Arr_N(i, 6), K Arr_D(K, 1) = K Arr_D(K, 2) = Arr_N(i, 6) Arr_D(K, 3) = Arr_N(i, 7) Arr_D(K, 4) = Arr_N(i, 9) Arr_D(K, 5) = Arr_N(i, 19) Arr_D(K, 6) = Arr_N(i, 22) Arr_D(K, 7) = Arr_N(i, 23) Arr_D(K, 8) = Arr_N(i, 14) Else J = Dic.Item(Arr_N(i, 6)) Arr_D(J, 5) = Arr_D(J, 5) + Arr_N(i, 19) * 24 Arr_D(J, 6) = Arr_D(J, 6) + Arr_N(i, 22) Arr_D(J, 7) = Arr_D(J, 7) + Arr_N(i, 23) Arr_D(J, 8) = Arr_D(J, 8) + Arr_N(i, 14) End If Next Sheet8.Range("E6:L50000").ClearContents Sheet8.Range("E6").Resize(K, 8) = Arr_D End SubCó file đính kèm nhờ anh chị giúp Tại Sheet Thong_ke cột I bị sai
1. Code bạn phải để trong phần mã code.
2. Nhờ BQT dời bài viết vào box lập trình.
3. Mình chưa kiểm tra chi tiết xong thấy phần này có vấn đề.
Thử thay
Arr_D(K, 5) = Arr_N(i, 19)
thành
Arr_D(K, 5) = Arr_N(i, 19)*24
Rồi kiểm tra kết quả xem đúng chưa.
www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-anh-ch%E1%BB%8B-gi%C3%BAp-dictionary-thay-h%C3%A0m-sumif.165100/#post-1102904
Khóa học SprinGO phù hợp
Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...
Xem khóa học
Bạn tham khảo . . :
Hoặc :
1. dùng Dic để thống kê:
Không hẳn đúng với đường lối của dân GPE.
Ở đây, người ta thích dùng đít sần bởi lý do chính là công cụ này giúp giải được bài toán "lọc duy nhất" một cách dễ dàng.
Từ tính chất "lọc duy nhất", người ta diễn thêm ra thuật toán "tổng theo mục".
Và từ đó, cứ lối mòn cũ bước theo. Bao nhiêu năm không thấy có thêm thắt cải tiến gì hay ho.
Trên thực tế, muốn thống kê thì dùng ADODB (SQL) nhiều linh động hơn.
2. tổng quan là dic làm được hết nha:
Vì ý nghĩ "tổng quan làm được" như vậy cho nên người ta cứ nằm trong cái ổ cũ rích ấy, không cần biết đến các công cụ mà MS ra thêm để giúp việc "thống kê" dễ dàng và hiệu quả. Điển hình Power Query ra đã mấy năm rồi mà dân GPE cứ tảng lờ.
Chung lại: lỗi tại dân GPE khoái khoe tài code VBA của mình cho nên những người hỏi bài cứ làm nũng.
TỘI GÌ PHẢI BỎ CÔNG SỨC HỌC CÁC CÔNG CỤ MỚI TRONG KHI LÊN GPE LÀ CÓ NGAY CODE "BẤM MỘT PHÁT"?
Thử theo hướng náy và chủ thớt kiểm tra lại nha !
—–
VBA thì có người làm giùm chứ PQry phải tự học, tự làm. Chả dại –=0
Bạn nói vậy thì cũng hơi quá, mỗi cái nó có 1 nhiệm vụ riêng, nếu biết áp dụng và áp dụng đúng chỗ thì bạn sẽ thấy nó ổn, còn không thì cho dù nó hay như thế nào đi nữa thì bạn cũng chả thấy nó ổn, SQL là ngôn ngữ có cấu trúc mà nó cũng được những người code VBA áp dụng thông qua ADO rồi đó, còn học lập trình thì ngôn ngữ nào cũng như ngôn ngữ nào, chỉ cần bạn hiểu rõ kỹ thuật lập trình thì chuyện ngôn ngữ chỉ tầm vài tiếng là ra ngay. Nếu dữ liệu không ngay hàng thẳng lối thì bạn dùng những công cụ như bạn kể có đáp ứng được yêu cầu không? Quan trọng là mình dùng nó áp dụng cho cái gì, chứ đừng đánh đồng VBA chả là gì. Nếu VBA chả ra gì thì tại sao nó vẫn phát triển cho tới ngày này người ta vẫn sử dụng, điển hình là VBNet. Còn đã xác định học lập trình rồi thì ta cứ thử mọi thứ, thử rồi mới biến kiến thức hay dở như thế nào, không ai ngay từ đầu làm được cái hoàn hảo đâu. cũng phải học từ cái dở nhất và có thể không áp dụng, cho dù nó không áp dụng thì nó cũng giúp bạn tiến xa hơn 1 tí nữa về cách tư duy.
Cảm ơn bác đã chỉ dẫn.
Đúng vậy nghĩ lại cũng thấy STT không quan trọng nên không hỏi nữa nên mới xoá bài ạ, nếu cần thì có thể xử lý bằng vba cho đỡ rắc rối ạ.
Người mà bạn nói kia ý chỉ muốn khoe trình độ của mình thôi. Nếu càn mách cho các thành viên khác thì bạn chỉ cần điểm thẳng vào chỗ cẩu thả sai bấy của y:
Điểm tầm bậy là Code thớt này chả liên quan gì đến Dir
Chỗ này thì bạn lầm.
1. Ngày xưa, nhiều nền tảng dùng ngôn ngữ BASIC để làm JCL (Job Command Language)
. Bạn nào ngày xưa có chơi cái Commodore hay giaudf hơn, có cái Apple II thì biết.
2. BASIC là sở thích của lão Bill Gates. Trước khi bán ddowcj DOS cho IBM lão ta vẫn thường vọc với Basic. Hòi còn là sinh viên cũng vậy.
3. VBA được ra để hổ trợ sự giới hạn của Access. Sau đó nhập vào Excel và các ứng dụng Office khác. VBA chỉ được MS tiêm thuốc si-te-roi khi bên phát triển cho nó khả năng nói với các API, các OLE khác trong hệ thống.
4. VB.NET chỉ có thuật ngữ giống VBA thôi. Trên căn bản lập trình VB.NET là loại ngôn ngữ Hướng Đối Tượng. VBA hoàn toàn thụt vòi khi đụng vào HĐT.
5. Sau bao nhiêu năm cố gắng bảo vệ ngôn ngữ con đẻ (có bản quyền) là VBA, cuối cùng thì MS cũng không thể chống lại áp lực thị trường. Hiện nay họ đã bắt đầu cho chạy Office Script la ngôn ngữ khá giống JavaScript. (Google Script cũng căn bản là JavaScript).
Tôi nhớ hình như sẽ bị ra trị của dòng đầu tiên. Chưa rảnh để thử.
Không biết đúng ý chị không?
Công thức tại A2:
Đã nghe lời bác ấy thì phải nghe cho trót: "tại sao một bảng tổng hợp lại có số thứ tự? Số ấy dùng để làm gì? Chả thấy lô gic nào cả."
Tuy nhiên nếu không phải bảng tổng hợp (là 1 báo cáo hoàn chỉnh để in), và quá yêu cái valuate, thì evaluate chính cái công thức excel.
Yêu thì nhận là yêu chứ gì mà ngại. Với công thức của bạn Thóc_Sama =IF(B2="","",IF(ISNUMBER(A1),A1+1,1)), không dùng evaluate:
Có mỗi chuyện đánh số thứ tự mà hết yêu đến ngại, hết quê đến tỉnh. Mà chẳng thà quê mùa mà gọn, viết nhanh, còn hơn viết nửa tiếng mà cũng chỉ ăn được 5 ngàn đồng bạc như người khác viết 1 phút.
Tôi viết code theo trường phái "việc nào tách riêng việc nấy". Trái với phần lớn dân ở đây theo trường phái "gom lại một chỗ càng tốt".
Vì lý luận rằng cái phần số thứ tự là công việc hoa lá cảnh cho nên tôi tách nó riêng ra. Và ở trường hợp này, hàm Evaluate rất hiệu quả.
Chú thích: hàm Evaluate vốn nằm trong nhóm "nguy hiểm". Vì vậy MS không để cho nó nổi bật lắm, phải mò từ Excel đời từ Macro 4. Khi sử dụng phải thử trước xem có đúng ý.
Hàm này dùng để tính một biểu thức ở dạng chuỗi. Vì nó có thể tính dọc (hoặc ngang) tùy theo bên cần gán cho nên dùng nó để tính các biểu thức đơn giản trên bảng tính thì rất nhanh.
Chú thích 2:
Tính chất của Evaluate là nhận tham số theo dạng chuỗi chi nên ta có thể tạo chuỗi với đầy đủ thông số. Khác với dạng viết tắt của nó là cặp ngoặc vuông (). Tất cả thông số bên trong cặp này thì phải viết in hệt như trên bảng tính, không có biến gì cả.
Ví dụ:
arr = : copy value ở range từ A1 đến B5
arr = Evaluate("A1:B5"), cũng như trên nhưng tham số là chuỗi cho nên nếu:
a = "A"
b = "B"
thì ta có thể viết
arr = Evaluate(a & "1" & ":" & b & "5")
Tại sao không dùng vòng lặp For Next cho đơn giản??? Tại sao cứ phải Evaluate???
Theo mình thì:
– Nếu chỉ đơn giản đánh số thứ tự thì dùng công thức cho gọn
– Nếu xử lý gì đó thì chắc sẽ có dùng vòng lặp, lúc đó kết hợp đánh stt luôn.
Đi ngang qua thấy vui quá nên góp vui chút nha…