Mong các bác giúp em code vba thống kê (1 người xem)

Liên hệ QC

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

nqhai86

Thành viên mới
Tham gia
23/12/19
Bài viết
23
Được thích
2
Mời các bác xem file đính kèm của em ạ. Trong đó sheet Data là nơi nhập dữ liệu thủ công, và em muốn tại sheet Thongke sẽ tự động liệt kê danh sách theo thứ tự từ A-Z, từ nhỏ đến lớn những gì có trong Data, kèm số lần xuất hiện và khoảng cách giữa các lần. Cụ thể:
1. Tại sheet Data:
- Dòng đầu tiên bỏ qua, chỉ bắt đầu đếm dữ liệu từ dòng thứ 2. Các dòng có độ dài không giới hạn (chứ không phải chỉ gồm 30 cột như trong file ví dụ), cứ có ký tự là hệ thống sẽ đếm.
- Data có thể gồm nhiều dòng, nhưng hệ thống sẽ ghép lại để đếm như 01 dòng, đồng thời tự động bỏ qua các ô trống.
2. Tại sheet ThongKe:
- Tự động liệt kê tên của mỗi người vào 01 cột. Thứ tự từ trái sang phải, A-> Z, nhỏ -> lớn. Có 100 người thì 100 cột, mà 1000 người khác nhau thì 1000 cột.
- Tại mỗi cột: dòng đầu tiên là tên người được thống kê. dòng thứ hai cho biết số lần xuất hiện. Dòng 3 trở đi cho biết khoảng cách giữa các lần xuất hiện. Ví dụ: An lần thứ 2 xuất hiện cách lần thứ nhất đơn vị là 12; Lan lần thứ 4 xuất hiện cách lần thứ 3 đơn vị là 5.
3. Có nút Update để ấn vào, giúp sheet Thongke tự động tính lại sau mỗi lần sheet Data thêm dữ liệu mới.

Nếu các bác code sẵn và gửi file cho em thì càng tốt ạ, vì mấy cái vba em mù tịt :( Em xin cảm ơn rất nhiều ạ!
 

File đính kèm

Mời các bác xem file đính kèm của em ạ. Trong đó sheet Data là nơi nhập dữ liệu thủ công, và em muốn tại sheet Thongke sẽ tự động liệt kê danh sách theo thứ tự từ A-Z, từ nhỏ đến lớn những gì có trong Data, kèm số lần xuất hiện và khoảng cách giữa các lần. Cụ thể:
1. Tại sheet Data:
- Dòng đầu tiên bỏ qua, chỉ bắt đầu đếm dữ liệu từ dòng thứ 2. Các dòng có độ dài không giới hạn (chứ không phải chỉ gồm 30 cột như trong file ví dụ), cứ có ký tự là hệ thống sẽ đếm.
- Data có thể gồm nhiều dòng, nhưng hệ thống sẽ ghép lại để đếm như 01 dòng, đồng thời tự động bỏ qua các ô trống.
2. Tại sheet ThongKe:
- Tự động liệt kê tên của mỗi người vào 01 cột. Thứ tự từ trái sang phải, A-> Z, nhỏ -> lớn. Có 100 người thì 100 cột, mà 1000 người khác nhau thì 1000 cột.
- Tại mỗi cột: dòng đầu tiên là tên người được thống kê. dòng thứ hai cho biết số lần xuất hiện. Dòng 3 trở đi cho biết khoảng cách giữa các lần xuất hiện. Ví dụ: An lần thứ 2 xuất hiện cách lần thứ nhất đơn vị là 12; Lan lần thứ 4 xuất hiện cách lần thứ 3 đơn vị là 5.
3. Có nút Update để ấn vào, giúp sheet Thongke tự động tính lại sau mỗi lần sheet Data thêm dữ liệu mới.

Nếu các bác code sẵn và gửi file cho em thì càng tốt ạ, vì mấy cái vba em mù tịt :( Em xin cảm ơn rất nhiều ạ!
Bạn tạo cho mình file excel 1000 cột đi mình giúp cho, làm biếng tạo file quá
 
Upvote 0
Mời các bác xem file đính kèm của em ạ. Trong đó sheet Data là nơi nhập dữ liệu thủ công, và em muốn tại sheet Thongke sẽ tự động liệt kê danh sách theo thứ tự từ A-Z, từ nhỏ đến lớn những gì có trong Data, kèm số lần xuất hiện và khoảng cách giữa các lần. Cụ thể:
1. Tại sheet Data:
- Dòng đầu tiên bỏ qua, chỉ bắt đầu đếm dữ liệu từ dòng thứ 2. Các dòng có độ dài không giới hạn (chứ không phải chỉ gồm 30 cột như trong file ví dụ), cứ có ký tự là hệ thống sẽ đếm.
- Data có thể gồm nhiều dòng, nhưng hệ thống sẽ ghép lại để đếm như 01 dòng, đồng thời tự động bỏ qua các ô trống.
2. Tại sheet ThongKe:
- Tự động liệt kê tên của mỗi người vào 01 cột. Thứ tự từ trái sang phải, A-> Z, nhỏ -> lớn. Có 100 người thì 100 cột, mà 1000 người khác nhau thì 1000 cột.
- Tại mỗi cột: dòng đầu tiên là tên người được thống kê. dòng thứ hai cho biết số lần xuất hiện. Dòng 3 trở đi cho biết khoảng cách giữa các lần xuất hiện. Ví dụ: An lần thứ 2 xuất hiện cách lần thứ nhất đơn vị là 12; Lan lần thứ 4 xuất hiện cách lần thứ 3 đơn vị là 5.
3. Có nút Update để ấn vào, giúp sheet Thongke tự động tính lại sau mỗi lần sheet Data thêm dữ liệu mới.

Nếu các bác code sẵn và gửi file cho em thì càng tốt ạ, vì mấy cái vba em mù tịt :( Em xin cảm ơn rất nhiều ạ!
Chạy code
Mã:
Sub ThongKe()
  Dim oSList As Object, Res(), S, iKey$
  Dim eCol&, eRow&, sRow&, N&, i&, j&, k&, tmp&
 
  Set oSList = CreateObject("System.Collections.SortedList")
  With Sheets("Data")
    eCol = .Cells(1, 16380).End(xlToLeft).Column
    sRow = Rows.Count
    For j = 1 To eCol
      i = .Cells(sRow, j).End(xlUp).Row
      If eRow < i Then eRow = i
    Next j
    For i = 2 To eRow
      For j = 1 To eCol
        iKey = .Cells(i, j)
        If iKey <> Empty Then
          k = k + 1
          oSList.Item(iKey) = oSList.Item(iKey) & "," & k
        End If
      Next j
    Next i
  End With
  sRow = 0
  N = oSList.Count - 1
  For j = 0 To N
    tmp = UBound(Split(oSList.GetByIndex(j), ","))
    If sRow < tmp Then sRow = tmp
  Next j
  ReDim Res(1 To sRow + 1, 0 To N)
  For j = 0 To N
    Res(1, j) = oSList.Getkey(j)
    S = Split(oSList.GetByIndex(j), ",")
    tmp = UBound(S)
    Res(2, j) = tmp & " lan"
    If tmp > 1 Then
      For i = 2 To tmp
        Res(i + 1, j) = S(i) - S(i - 1)
      Next i
    End If
  Next j
  With Sheets("ThongKe")
    .UsedRange.ClearContents
    .Range("A1").Resize(sRow + 1, N + 1) = Res
  End With
  Set oSList = Nothing
End Sub
 

File đính kèm

Upvote 0
Mời các bác xem file đính kèm của em ạ. Trong đó sheet Data là nơi nhập dữ liệu thủ công, và em muốn tại sheet Thongke sẽ tự động liệt kê danh sách theo thứ tự từ A-Z, từ nhỏ đến lớn những gì có trong Data, kèm số lần xuất hiện và khoảng cách giữa các lần. Cụ thể:
1. Tại sheet Data:
- Dòng đầu tiên bỏ qua, chỉ bắt đầu đếm dữ liệu từ dòng thứ 2. Các dòng có độ dài không giới hạn (chứ không phải chỉ gồm 30 cột như trong file ví dụ), cứ có ký tự là hệ thống sẽ đếm.
- Data có thể gồm nhiều dòng, nhưng hệ thống sẽ ghép lại để đếm như 01 dòng, đồng thời tự động bỏ qua các ô trống.
2. Tại sheet ThongKe:
- Tự động liệt kê tên của mỗi người vào 01 cột. Thứ tự từ trái sang phải, A-> Z, nhỏ -> lớn. Có 100 người thì 100 cột, mà 1000 người khác nhau thì 1000 cột.
- Tại mỗi cột: dòng đầu tiên là tên người được thống kê. dòng thứ hai cho biết số lần xuất hiện. Dòng 3 trở đi cho biết khoảng cách giữa các lần xuất hiện. Ví dụ: An lần thứ 2 xuất hiện cách lần thứ nhất đơn vị là 12; Lan lần thứ 4 xuất hiện cách lần thứ 3 đơn vị là 5.
3. Có nút Update để ấn vào, giúp sheet Thongke tự động tính lại sau mỗi lần sheet Data thêm dữ liệu mới.

Nếu các bác code sẵn và gửi file cho em thì càng tốt ạ, vì mấy cái vba em mù tịt :( Em xin cảm ơn rất nhiều ạ!
Bạn thiết kế File không hợp lý, không ai nhập liệu cả ngàn cột cả (nhập liệu vừa lâu mà dễ bị nhằm, lẫn).
Tôi thiết kế lại nhập theo chiều dọc rồi sử dụng PivotTable để tổng hợp.
Nếu đúng ý thì tôi mới code sau.
 

File đính kèm

Upvote 0
Bạn tạo cho mình file excel 1000 cột đi mình giúp cho, làm biếng tạo file quá
Dạ cảm ơn bạn nhiều, mình đã nhận được sự giúp đỡ rồi ạ <3

Chạy code
Mã:
Sub ThongKe()
  Dim oSList As Object, Res(), S, iKey$
  Dim eCol&, eRow&, sRow&, N&, i&, j&, k&, tmp&

  Set oSList = CreateObject("System.Collections.SortedList")
  With Sheets("Data")
    eCol = .Cells(1, 16380).End(xlToLeft).Column
    sRow = Rows.Count
    For j = 1 To eCol
      i = .Cells(sRow, j).End(xlUp).Row
      If eRow < i Then eRow = i
    Next j
    For i = 2 To eRow
      For j = 1 To eCol
        iKey = .Cells(i, j)
        If iKey <> Empty Then
          k = k + 1
          oSList.Item(iKey) = oSList.Item(iKey) & "," & k
        End If
      Next j
    Next i
  End With
  sRow = 0
  N = oSList.Count - 1
  For j = 0 To N
    tmp = UBound(Split(oSList.GetByIndex(j), ","))
    If sRow < tmp Then sRow = tmp
  Next j
  ReDim Res(1 To sRow + 1, 0 To N)
  For j = 0 To N
    Res(1, j) = oSList.Getkey(j)
    S = Split(oSList.GetByIndex(j), ",")
    tmp = UBound(S)
    Res(2, j) = tmp & " lan"
    If tmp > 1 Then
      For i = 2 To tmp
        Res(i + 1, j) = S(i) - S(i - 1)
      Next i
    End If
  Next j
  With Sheets("ThongKe")
    .UsedRange.ClearContents
    .Range("A1").Resize(sRow + 1, N + 1) = Res
  End With
  Set oSList = Nothing
End Sub
Cảm ơn bác, mọi thứ đã hoạt động đúng như em nghĩ <3

Bạn thiết kế File không hợp lý, không ai nhập liệu cả ngàn cột cả (nhập liệu vừa lâu mà dễ bị nhằm, lẫn).
Tôi thiết kế lại nhập theo chiều dọc rồi sử dụng PivotTable để tổng hợp.
Nếu đúng ý thì tôi mới code sau.
Vâng bác nói đúng ạ, hiện vấn đề của em đã được bác HieuCD giúp, nhưng em cũng đã tham khảo file của bác và thấy rất hay. Tạm thời em sẽ tự mày mò thêm một chút để rèn kĩ năng, nếu có chỗ nào không hiểu xin phép hỏi bác sau ạ.
 
Upvote 0
@HieuCD Bác cho em hỏi thêm ạ. Nếu em muốn biết ai có mặt lần cuối cùng khi nào thì nên sửa lại code ra sao?
Ví dụ như trong file trên thì: Hồng có mặt 1 lần trước, Vy có mặt 3 lần trước, Ngọc có mặt 6 lần trước.
Nghĩa là sẽ đếm lùi từ cuối lên và bỏ qua khoảng trống ấy ạ.
 
Upvote 0
@HieuCD Bác cho em hỏi thêm ạ. Nếu em muốn biết ai có mặt lần cuối cùng khi nào thì nên sửa lại code ra sao?
Ví dụ như trong file trên thì: Hồng có mặt 1 lần trước, Vy có mặt 3 lần trước, Ngọc có mặt 6 lần trước.
Nghĩa là sẽ đếm lùi từ cuối lên và bỏ qua khoảng trống ấy ạ.
Không hiểu ý bạn, đưa kết quả và giải thích vài ví dụ kết quả
 
Upvote 0
Không hiểu ý bạn, đưa kết quả và giải thích vài ví dụ kết quả
Dạ bác xem file này ạ. Tại sheet ThongKe thì phần tính số lần (từ hàng 6 trở đi) vẫn như cũ. Có thêm dòng đếm lần cuối, sẽ đếm lùi để xem ai đó có mặt lần cuối khi nào.

Ngoài ra em cũng muốn:
1. Trong đoạn code có thể tùy biến để thiết lập bảng thống kê bắt đầu từ hàng và cột nào, kết thúc ở hàng và cột nào (trong trường hợp em biết rõ có bao nhiêu nhân sự cần thống kê, ví dụ 50, chứ không phải vô tận). Những dữ liệu nằm ngoài phạm vi bảng thống kê sẽ được giữ nguyên, không bị xóa đi sau mỗi lần chạy lại macros. Chẳng hạn trong file trên thì là dòng 1-3 và cột A được giữ nguyên.
2. Có thể tùy biến để bảng thống kê trong giới hạn nào, ví dụ theo sheet Data thì sẽ chỉ tính dữ liệu đến cột AD (để các cột dư em sẽ dùng ghi chú khác).

Mong bác tiếp tục giúp đỡ ạ.
 

File đính kèm

Upvote 0
Dạ bác xem file này ạ. Tại sheet ThongKe thì phần tính số lần (từ hàng 6 trở đi) vẫn như cũ. Có thêm dòng đếm lần cuối, sẽ đếm lùi để xem ai đó có mặt lần cuối khi nào.

Ngoài ra em cũng muốn:
1. Trong đoạn code có thể tùy biến để thiết lập bảng thống kê bắt đầu từ hàng và cột nào, kết thúc ở hàng và cột nào (trong trường hợp em biết rõ có bao nhiêu nhân sự cần thống kê, ví dụ 50, chứ không phải vô tận). Những dữ liệu nằm ngoài phạm vi bảng thống kê sẽ được giữ nguyên, không bị xóa đi sau mỗi lần chạy lại macros. Chẳng hạn trong file trên thì là dòng 1-3 và cột A được giữ nguyên.
2. Có thể tùy biến để bảng thống kê trong giới hạn nào, ví dụ theo sheet Data thì sẽ chỉ tính dữ liệu đến cột AD (để các cột dư em sẽ dùng ghi chú khác).

Mong bác tiếp tục giúp đỡ ạ.
Xem code
Mã:
Sub ThongKe()
  Dim oSList As Object, Res(), S, iKey$
  Dim eCol&, eRow&, sRow&, N&, i&, j&, k&, tmp&
 
  Set oSList = CreateObject("System.Collections.SortedList")
  With Sheets("Data")
    eCol = .Range("AD1").Column 'Cot cuoi là cot "AD"
    sRow = Rows.Count
    For j = 1 To eCol
      i = .Cells(sRow, j).End(xlUp).Row
      If eRow < i Then eRow = i
    Next j
    For i = 2 To eRow
      For j = 1 To eCol
        iKey = .Cells(i, j)
        If iKey <> Empty Then
          k = k + 1
          oSList.Item(iKey) = oSList.Item(iKey) & "," & k
        End If
      Next j
    Next i
  End With
  sRow = 0
  N = oSList.Count - 1
  For j = 0 To N
    tmp = UBound(Split(oSList.GetByIndex(j), ","))
    If sRow < tmp Then sRow = tmp
  Next j
  ReDim Res(1 To sRow + 2, 0 To N)
  For j = 0 To N
    Res(1, j) = oSList.Getkey(j)
    S = Split(oSList.GetByIndex(j), ",")
    tmp = UBound(S)
    Res(2, j) = k - S(tmp) + 1
    Res(3, j) = tmp
    If tmp > 1 Then
      For i = 2 To tmp
        Res(i + 2, j) = S(i) - S(i - 1)
      Next i
    End If
  Next j
  With Sheets("ThongKe")
    .Range("B4", .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).ClearContents
    .Range("B5").Resize(sRow + 1, N + 1) = Res
  End With
  Set oSList = Nothing
End Sub
 
Upvote 0
@HieuCD Mọi thứ rất tuyệt rồi bác ạ. Tuy nhiên còn một vấn đề nhỏ, bác chỉ em cách giới hạn bảng thống kê với ạ? Chẳng hạn vẫn với file ví dụ Tke2.xlsx, tại sheet ThongKe em muốn giới hạn bảng này từ cột B đến cột J thôi, giả sử tại sheet Data có thêm tên người khác thì bảng thống kê cũng chỉ hiển thị đúng 9 người theo thứ tự A-Z. Còn khoảng trống từ cột K trở đi là để dành cho những ghi chú và dữ liệu khác.
ex.jpg
 
Upvote 0
@HieuCD Mọi thứ rất tuyệt rồi bác ạ. Tuy nhiên còn một vấn đề nhỏ, bác chỉ em cách giới hạn bảng thống kê với ạ? Chẳng hạn vẫn với file ví dụ Tke2.xlsx, tại sheet ThongKe em muốn giới hạn bảng này từ cột B đến cột J thôi, giả sử tại sheet Data có thêm tên người khác thì bảng thống kê cũng chỉ hiển thị đúng 9 người theo thứ tự A-Z. Còn khoảng trống từ cột K trở đi là để dành cho những ghi chú và dữ liệu khác.
View attachment 230415
Chỉnh
Mã:
  With Sheets("ThongKe")
    .Range("B4", .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).ClearContents
    .Range("B5").Resize(sRow + 1, N + 1) = Res
  End With
Thành
Mã:
  With Sheets("ThongKe")
    .Range("B4", .Cells(.UsedRange.Rows.Count, 10)).ClearContents
    .Range("B5").Resize(sRow + 1, 9) = Res
  End With
 
Upvote 0
Cảm ơn bác @HieuCD nhiều ạ, vấn đề của em đã được giải quyết. Mong bác và mọi người thông cảm vì có những cái ngay từ đầu em chưa biết tính toán nên hỏi hơi nhiều :D
 
Upvote 0
Các bác cho em hỏi, trong trường hợp em muốn dùng chức năng này trên google sheet thì đoạn code của bác @HieuCD nên chuyển thành như thế nào ạ?
 
Upvote 0
Bác @HieuCD cho em hỏi ba vấn đề với ạ:
1. Em thấy với dữ liệu nhỏ thì mọi thống kê đều chuẩn, nhưng với dữ liệu lớn thì nó đã bỏ qua việc tính lần cuối cùng xuất hiện. Ví dụ ở file đính kèm về số lượng và tần suất mua bán:
a) Tại sheet Dt1 (data1) tính từ AU131 lùi về AL131 thì ngày gần nhất bán trước đó là 9, ngày bán trước nữa là 1 và tiếp tục lùi về trước nữa 1, 1, 1...
b) Tại sheet ThongKe dòng 3607 cột B thì em thấy nó đã bỏ qua ô AU131 và bắt đầu tính từ ô AL131 của Dt1, nên kết quả đếm ngược là 1, 1, 1, 1, 1... Trong khi đáng lẽ kết quả đúng phải là 9, 1, 1, 1, 1...
Vậy mong bác hướng dẫn em cách sửa cái này.

2. Với dữ liệu quá lớn, nếu em chỉ cần thống kê lịch sử mua bán của 30 ngày gần nhất, tức 30 dòng, thay vì kết quả trả về đến vài nghìn dòng... thì nên sửa lại code như thế nào ạ?

3. Nếu em muốn giới hạn chỉ thống kê từ cột AA đến BD1 thì nên thêm dòng nào vào code?

Rất xin lỗi vì lại làm phiền bác, cảm ơn bác nhiều ạ :D
 

File đính kèm

Upvote 0
Bác @HieuCD cho em hỏi ba vấn đề với ạ:
1. Em thấy với dữ liệu nhỏ thì mọi thống kê đều chuẩn, nhưng với dữ liệu lớn thì nó đã bỏ qua việc tính lần cuối cùng xuất hiện. Ví dụ ở file đính kèm về số lượng và tần suất mua bán:
a) Tại sheet Dt1 (data1) tính từ AU131 lùi về AL131 thì ngày gần nhất bán trước đó là 9, ngày bán trước nữa là 1 và tiếp tục lùi về trước nữa 1, 1, 1...
b) Tại sheet ThongKe dòng 3607 cột B thì em thấy nó đã bỏ qua ô AU131 và bắt đầu tính từ ô AL131 của Dt1, nên kết quả đếm ngược là 1, 1, 1, 1, 1... Trong khi đáng lẽ kết quả đúng phải là 9, 1, 1, 1, 1...
Vậy mong bác hướng dẫn em cách sửa cái này.

2. Với dữ liệu quá lớn, nếu em chỉ cần thống kê lịch sử mua bán của 30 ngày gần nhất, tức 30 dòng, thay vì kết quả trả về đến vài nghìn dòng... thì nên sửa lại code như thế nào ạ?

3. Nếu em muốn giới hạn chỉ thống kê từ cột AA đến BD1 thì nên thêm dòng nào vào code?

Rất xin lỗi vì lại làm phiền bác, cảm ơn bác nhiều ạ :D
Muốn tổng hợp bất kỳ cái gì đó thì sử dụng PivotTable là vô địch, chỉ cần kiến thức cơ bản sau đó rê, thả với vài phút là được bất kỳ thứ gì cần.
Chớ nên lạm dụng code nó chỉ áp dụng riêng lẽ cho từng công việc.
 
Upvote 0
Bác @HieuCD cho em hỏi ba vấn đề với ạ:
1. Em thấy với dữ liệu nhỏ thì mọi thống kê đều chuẩn, nhưng với dữ liệu lớn thì nó đã bỏ qua việc tính lần cuối cùng xuất hiện. Ví dụ ở file đính kèm về số lượng và tần suất mua bán:
a) Tại sheet Dt1 (data1) tính từ AU131 lùi về AL131 thì ngày gần nhất bán trước đó là 9, ngày bán trước nữa là 1 và tiếp tục lùi về trước nữa 1, 1, 1...
b) Tại sheet ThongKe dòng 3607 cột B thì em thấy nó đã bỏ qua ô AU131 và bắt đầu tính từ ô AL131 của Dt1, nên kết quả đếm ngược là 1, 1, 1, 1, 1... Trong khi đáng lẽ kết quả đúng phải là 9, 1, 1, 1, 1...
Vậy mong bác hướng dẫn em cách sửa cái này.

2. Với dữ liệu quá lớn, nếu em chỉ cần thống kê lịch sử mua bán của 30 ngày gần nhất, tức 30 dòng, thay vì kết quả trả về đến vài nghìn dòng... thì nên sửa lại code như thế nào ạ?

3. Nếu em muốn giới hạn chỉ thống kê từ cột AA đến BD1 thì nên thêm dòng nào vào code?

Rất xin lỗi vì lại làm phiền bác, cảm ơn bác nhiều ạ :D
1. Bạn chỉnh code không chuẩn
2. Có yêu cầu gì nói luôn chỉ chỉnh code thêm 1 lần cuối
 
Upvote 0
1. Bạn chỉnh code không chuẩn
2. Có yêu cầu gì nói luôn chỉ chỉnh code thêm 1 lần cuối
Dạ hỏi nhiều em cũng ngại lắm ạ, em xin phép hỏi nốt 3 vấn đề kia thôi và nhờ bác giúp đỡ lần cuối. Em cũng cố gắng tự mày mò nhưng mới tiếp xúc với vba nên còn mù mờ quá. Cảm ơn bác nhiều ạ.
 
Upvote 0
Bác @HieuCD cho em hỏi ba vấn đề với ạ:
1. Em thấy với dữ liệu nhỏ thì mọi thống kê đều chuẩn, nhưng với dữ liệu lớn thì nó đã bỏ qua việc tính lần cuối cùng xuất hiện. Ví dụ ở file đính kèm về số lượng và tần suất mua bán:
a) Tại sheet Dt1 (data1) tính từ AU131 lùi về AL131 thì ngày gần nhất bán trước đó là 9, ngày bán trước nữa là 1 và tiếp tục lùi về trước nữa 1, 1, 1...
b) Tại sheet ThongKe dòng 3607 cột B thì em thấy nó đã bỏ qua ô AU131 và bắt đầu tính từ ô AL131 của Dt1, nên kết quả đếm ngược là 1, 1, 1, 1, 1... Trong khi đáng lẽ kết quả đúng phải là 9, 1, 1, 1, 1...
Vậy mong bác hướng dẫn em cách sửa cái này.

2. Với dữ liệu quá lớn, nếu em chỉ cần thống kê lịch sử mua bán của 30 ngày gần nhất, tức 30 dòng, thay vì kết quả trả về đến vài nghìn dòng... thì nên sửa lại code như thế nào ạ?

3. Nếu em muốn giới hạn chỉ thống kê từ cột AA đến BD1 thì nên thêm dòng nào vào code?

Rất xin lỗi vì lại làm phiền bác, cảm ơn bác nhiều ạ :D
Chỉnh Code
Mã:
Sub ThongKe()
  Dim oSList As Object, Res(), S, iKey$
  Dim fCol&, eCol&, fRow&, eRow&, sRow&, N&, i&, j&, k&, tmp&, rMax&
  rMax = 30 'Gioi han 30 dong ket qua
  Set oSList = CreateObject("System.Collections.SortedList")
  With Sheets("Dt1")
    fCol = .Range("AA1").Column 'Cot dau la Cot "AA"
    eCol = .Range("BD1").Column 'Cot cuoi la Cot "BD"
    sRow = Rows.Count
    For j = fCol To eCol
      i = .Cells(sRow, j).End(xlUp).Row
      If eRow < i Then eRow = i
    Next j
    For i = 2 To eRow
      For j = fCol To eCol
        iKey = .Cells(i, j)
        If iKey <> Empty Then
          k = k + 1
          oSList.Item(iKey) = oSList.Item(iKey) & "," & k
        End If
      Next j
    Next i
  End With
  N = oSList.Count - 1
  ReDim Res(0 To rMax, 0 To N)  'Gioi han 30 dong ket qua
  For j = 0 To N
    Res(0, j) = oSList.Getkey(j)
    S = Split(oSList.GetByIndex(j), ",")
    tmp = UBound(S)
    Res(2, j) = k - S(tmp) + 1
    Res(3, j) = tmp
    If tmp > 1 Then
      k = 0
      If tmp > rMax + 1 Then fRow = tmp - rMax + 1 Else fRow = 2 'Gioi han 30 dong ket qua
      For i = fRow To tmp
        k = k + 1
        Res(k, j) = S(i) - S(i - 1)
        If k = rMax Then Exit For 'Gioi han 30 dong ket qua
      Next i
    End If
  Next j
  With Sheets("ThongKe")
    'Xoa du lieu cu tu lo
    '.UsedRange.ClearContents
    .Range("B5").Resize(rMax + 1, N + 1) = Res
  End With
  Set oSList = Nothing
End Sub
 
Upvote 0
@HieuCD Bác ơi em ngại quá ạ, nhưng em thay đoạn code mới vào thì thấy ở dòng thứ 2 của bảng thống kê nó không còn hiện lần cuối mua và bán cách đây bao nhiêu lượt, còn ở dòng thứ 3 thì không thống kê tổng lượt mua và bán nữa (code cũ có cái này). Như đã hứa em cũng không dám làm phiền bác, nếu bác có thể xem lại giúp em thì hay, còn nếu không em sẽ cố gắng mày mò dựa trên đoạn code cũ. Dù thế nào cũng rất cảm ơn sự nhiệt tình của bác trong mấy ngày qua ạ <3
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom