Đếm số lần xuất hiện trong mảng dữ liệu và tính tỷ lệ phần trăm xuất hiện trong mảng

Liên hệ QC

Vũ Tuấn Tùng

Thành viên mới
Tham gia
22/6/16
Bài viết
27
Được thích
2
Em chào toàn thể anh chị em trên diễn đàn GPE!
Em có file cần tính số lần xuất hiện trong mảng và tính tỷ lệ phần trăm xuất hiện trong mảng. Nhờ các anh chị viết giúp em đoạn code VBA ạ.
Em ví dụ 20 dòng ạ, Em xin cảm ơn ạ.
1.jpg
 

File đính kèm

  • DemLanLap.xlsb
    9.2 KB · Đọc: 19
Upvote 0
vì dữ liệu data gần 1 triệu dòng và khoảng hơn 2 nghìn cột mà sử dụng hàm thì nặng file và chạy lâu lắm ạ, em ví dụ minh họa 20 dòng để mọi người dễ hình dung ạ
Nếu dữ liệu như vậy thì nên nêu ngay từ đầu và ngần ấy thì VBA có vẻ cũng không phù hợp lắm.
 
Upvote 0
Trên 2 tỷ mẩu dữ liệu mà người quản ký chúng lơ lơ mơ không chịu học Power Query thì côngt ty này sắp hốt rác. Ở đấy mà nặng file.
 
Upvote 0
vì dữ liệu data gần 1 triệu dòng và khoảng hơn 2 nghìn cột mà sử dụng hàm thì nặng file và chạy lâu lắm ạ, em ví dụ minh họa 20 dòng để mọi người dễ hình dung ạ
Với dữ liệu như bạn thì VBA nó chạy cũng chết máy bạn à.Tính sơ sơ 1.000.000 * 20.000 thì cũng ra 20 tỷ lần chạy vòng lặp.Đấy là nguyên chạy vòng lặp trong VBA chưa kể đến các bước trong vòng lặp đấy nữa.
 
Upvote 0
Bạn ấy nói hơn 2000
vì dữ liệu data gần 1 triệu dòng và khoảng hơn 2 nghìn cột mà sử dụng hàm thì nặng file và chạy lâu lắm ạ, em ví dụ minh họa 20 dòng để mọi người dễ hình dung ạ
Chưa làm gì to tát, chạy thử code này với 2 tỷ lần lặp. Tự động tắt file luôn :D .
Mã:
Option Explicit

Sub abc()
Dim t#, i&, j&, k&, Arr(1 To 2000000000)
t = Timer
For i = 1 To 1000000
    For j = 1 To 2000
        k = k + 1
        Arr(k) = k
    Next
Next
MsgBox "Thoi gian la " & Timer - t
End Sub

Nếu vẫn muốn code chắc phải chia để trị, tức chia ra nhiều mảng con. Nghĩ vậy thôi chứ chưa thử bao giờ :D
 
Upvote 0
Với dữ liệu như bạn thì VBA nó chạy cũng chết máy bạn à.Tính sơ sơ 1.000.000 * 20.000 thì cũng ra 20 tỷ lần chạy vòng lặp.Đấy là nguyên chạy vòng lặp trong VBA chưa kể đến các bước trong vòng lặp đấy nữa.
2 tỷ bạn ạ, có hơn 2000 cột thôi :p
20 tỷ thì khoẻ rồi, Excel từ chối làm việc luôn.
Nhưng bạn nói đúng. Mấy cái vụ sâm xiếc này, VBA cũng không chạy lại các hàm có sẵn trong bảng tính đâu. Chúng được thiết kế tối ưu rồi. Nếu chỉ muốn chúng chạy một lần thôi rồi sau đó im luôn thì chép công thức vào một name. Chạy ra bảng xong thì copy/paste value lại. Khi bảng dữ liệu chính thay đổi thì copy cái name về, chạy lại.

Tuy nhiên, cái này cho vào Data Model và Pơer Pivot thì vô tư.
Công ty này bắt chó kéo cày. Dân làm việc với dữ liệu khủng mà không cho đi học mấy công cụ mới của Office để cập nhật kiến thức. Thời buổi này có dữ liệu cứ tói nửa triệu dòng, không kể cột, là bắt buộc phải biết các công cụ mới. Không biết là kiến thức quá đát cỡ 5 năm.
 
Upvote 0
Bạn ấy nói hơn 2000

Chưa làm gì to tát, chạy thử code này với 2 tỷ lần lặp. Tự động tắt file luôn :D .
Mã:
Option Explicit

Sub abc()
Dim t#, i&, j&, k&, Arr(1 To 2000000000)
t = Timer
For i = 1 To 1000000
    For j = 1 To 2000
        k = k + 1
        Arr(k) = k
    Next
Next
MsgBox "Thoi gian la " & Timer - t
End Sub

Nếu vẫn muốn code chắc phải chia để trị, tức chia ra nhiều mảng con. Nghĩ vậy thôi chứ chưa thử bao giờ :D
Bạn ấy ví dụ 20 dòng và 8 cột để mọi người dễ hình dung ra thực tế gần 1 triệu dòng và hơn 2000 cột. Kể ra thì cũng vui vui.
 
Upvote 0
cần tính số lần xuất hiện trong mảng và tính tỷ lệ phần trăm xuất hiện trong mảng

Làm được bạn nhé. Nhưng bạn cần đăng bài trong chuyên mục thành viên tương trợ riêng nhau lúc khó khăn.

Và bạn không nên ví dụ, minh họa mấy cái ký tự ABCDEF làm gì, mà bạn cứ nêu cụ thể, chính xác là các con số từ 00, 01, ... 99 của 20 năm gần đây cho dễ hiểu.
 
Upvote 0
Làm được bạn nhé. Nhưng bạn cần đăng bài trong chuyên mục thành viên tương trợ riêng nhau lúc khó khăn.

Và bạn không nên ví dụ, minh họa mấy cái ký tự ABCDEF làm gì, mà bạn cứ nêu cụ thể, chính xác là các con số từ 00, 01, ... 99 của 20 năm gần đây cho dễ hiểu.
Đánh thì đánh chứ đừng chọt, chọt nó nhột...

.
 
Upvote 0
Em chào toàn thể anh chị em trên diễn đàn GPE!
Em có file cần tính số lần xuất hiện trong mảng và tính tỷ lệ phần trăm xuất hiện trong mảng. Nhờ các anh chị viết giúp em đoạn code VBA ạ.
Em ví dụ 20 dòng ạ, Em xin cảm ơn ạ.
View attachment 273194
Về bạn chỉnh code này xem nó có chạy được không nhé.Tôi nghĩ nếu dữ liệu lớn quá nạp vào mảng đã là 1 vấn đề thời gian rồi.
Mã:
Sub abc()
   Dim i As Long, lr As Long, arr, kq, dic As Object, a As Long, dk As String, c As Long, b As Long, j As Long
   Set dic = CreateObject("scripting.dictionary")
   With Sheets("sheet1")
        lr = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A3:H" & lr).Value
        ReDim kq(1 To UBound(arr) + 100, 1 To 3)
        For i = 1 To UBound(arr)
            If arr(i, 1) <> Empty Then c = c + 1
            For j = 2 To UBound(arr, 2)
                dk = arr(i, j)
                If Not dic.exists(dk) Then
                   a = a + 1
                   dic.Add dk, a
                   kq(a, 1) = dk
                   kq(a, 2) = 1
                Else
                   b = dic.Item(dk)
                   kq(b, 2) = kq(b, 2) + 1
                End If
            Next j
       Next i
       For i = 1 To a
           kq(i, 3) = kq(i, 2) / c
       Next i
       .Range("K3:M1000").ClearContents
       .Range("K3:M3").Resize(a).Value = kq
  End With
  Set dic = Nothing
End Sub
 
Upvote 0
Đánh thì đánh chứ đừng chọt, chọt nó nhột...

.

Nói thiệt mà. Hông chọt tẹo gì.

----
dữ liệu lớn quá nạp vào mảng đã là 1 vấn đề thời gian rồi.

Excel không giải quyết được bài toán này.

Dựng một cái mảng rỗng a(1 to 1000000, 1 to 2000) là banh xác RAM rồi thì làm sao chép Range vào mảng được.
 
Upvote 0
Mấy cái này thì Python thôi.
Thống kê mờ. R nhanh hơn, :p
Mà ở trên tôi có nói rồi. Cái này Power Pivot xử lý được. Bọn Power chúng được ra để đối phó dữ liệu khủng mờ.

Nếu cứ nhất định code VBA thì thử ADO. Hy vọng cỗ máy ACE chịu nổi lượng này.
 
Upvote 0
Upvote 0
Upvote 0
Làm được bạn nhé. Nhưng bạn cần đăng bài trong chuyên mục thành viên tương trợ riêng nhau lúc khó khăn.

Và bạn không nên ví dụ, minh họa mấy cái ký tự ABCDEF làm gì, mà bạn cứ nêu cụ thể, chính xác là các con số từ 00, 01, ... 99 của 20 năm gần đây cho dễ hiểu.
20 năm chỉ có 7000 ngày. Chả nhẽ mỗi ngày có 150 phát sinh (150 đài?).,mỗi phát sinh hơn 2000 lượt số.
 
Upvote 0
Và bạn không nên ví dụ, minh họa mấy cái ký tự ABCDEF làm gì, mà bạn cứ nêu cụ thể, chính xác là các con số từ 00, 01, ... 99 của 20 năm gần đây cho dễ hiểu.
Không biết số má kiểu gì mà dày công nghiên cứu thế này. Mà vẫn trượt thì thật là uổng công. Anh nhạy cảm thật ấy. Đọc đến đây em mới nhận ra đúng hình hài của ví dụ
 
Upvote 0
Web KT

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

Back
Top Bottom