Các câu hỏi về hàm COUNTIF (1 người xem)

Liên hệ QC

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

Thân chào các bạn
tôi thử tao 1 dãy chử như sau :
cột A
Cho Them một ly nước
Cho thêm một dola tip
lấy giủm ly nước
.....
dùng countif tim xem có bao nhiêu ly, thêm ; một;... đại khái là có cách nào đếm đươc 1 chử nào đó trong 1 đoạn văn nào đó không ?
Xin cám ơn các bạn.
MK
 
Thân chào các bạn
tôi thử tao 1 dãy chử như sau :
cột A
Cho Them một ly nước
Cho thêm một dola tip
lấy giủm ly nước
.....
dùng countif tim xem có bao nhiêu ly, thêm ; một;... đại khái là có cách nào đếm đươc 1 chử nào đó trong 1 đoạn văn nào đó không ?
Xin cám ơn các bạn.
MK
Đương nhiên là đựoc rồi!
Ví dụ dử liệu của bạn là A1 đến A10 nhé, và bạn muốn đếm xem chử "ly" nằm ở bao nhiêu cell thì:
Mã:
=COUNTIF(A1:A10,"*ly*")
 
Chào anh nđu96081631
Được rổi, cái dấu * thật lơi hại quá chừng, tôi dợt hòi mây hôn nay mà không đươc,
Cám ơn anh
MK

------------------
Đề nghị bạn sửa lại tiếng Việt trong bài này cho dễ hiểu hơn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Sai công thức COUNTIF

Em có tài liệu kèm theo, không biết công thức thống kê Countif của em sai ở đâu, mong các bác chỉ giúp
 

File đính kèm

Giải pháp Excell có thể giúp tôi về các thủ thuật về hàm countif được không
 
Sử dụng pivottable và countif trong thống kê xếp loại hs

Trong thống kê có thể Sử dụng pivottable hoặc counif để thống kê xếp loại hs
(xin lỗi các bạn tôi up file đính kèm lên nhưng không được)
 
Lần chỉnh sửa cuối:
Lỗi: CountIf của mảng?

Tôi lấy ví dụ như thế này nha! Mọi người xem giùm tại sao lại sai vậy!
Mã:
[FONT=Courier New][COLOR=#0000bb]Sub thu()[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]Dim mang[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]()[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]Set vung [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"A1:A20"[/COLOR][/FONT][FONT=Courier New][COLOR=#007700])[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]ReDim mang[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]vung[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Count[/COLOR][/FONT][FONT=Courier New][COLOR=#007700])[/COLOR][/FONT]
[FONT=Courier New][COLOR=#007700]For [/COLOR][COLOR=#0000bb]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]1 To vung[/COLOR][COLOR=#007700].[/COLOR][/FONT][FONT=Courier New][COLOR=#0000bb]Count[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]mang[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]i[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000bb]vung[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]i[/COLOR][/FONT][COLOR=#007700][FONT=Courier New])[/FONT][/COLOR]
[FONT=Courier New][COLOR=#0000bb]Next[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]MsgBox [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]WorksheetFunction[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]CountIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb][SIZE=4][COLOR=red][B][U]mang[/U][/B][/COLOR][/SIZE][/COLOR][COLOR=#007700](), [/COLOR][COLOR=#0000bb]2[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]))[/COLOR][/FONT]
[FONT=Courier New][COLOR=#0000bb]End Sub[/COLOR][/FONT]
Nó cứ báo lỗi ở chỗ đó không hiểu lý do! Không biết là tôi viết hàm mãng như vậy thì coutif không nhận được hay không được hỗ trợ của Excel vậy!
Và nếu mở rộng ra các hàm Max hoặc các hàm trong bộ Function thì có bị như vậy không? Các khắc phục như thế nào!
Xin chỉ giáo?!
 
hàm COUNTIF có dạng COUNTIF(range,criteria)
vậy biến mang của bạn có là range không
 
Nó không là Range ở thế giới thực mà 1 mảng dữ liệu ghép từ nhiều nơi với nhiều điều kiện khác nhau vào, chỉ là dữ liệu số thôi! Ví dụ: 52, 53, 52, 45, 76, 82, 2, 51, 14, 41, 14, 51, 2
Code này mình chỉ giải sử tình huống xảy ra thì phát hiện nó sai ở đây! Vì không rõ nguyên nhân và cách khắc phục nên muốn tìm hiểu! Hiện mình đang cần đếm xem trong 1 mãng mới đó có bao nhiêu số 2 vậy thôi!
Vậy không biết bạn có thể chỉ mình đếm 1 chuỗi bất kỳ từ nhiều nơi được không?
 
Biến mang() sau khi gán giá trị trở thành tập hợp các giá trị của các ô trong vùng vung.
Countif là hàm của Excel (WorksheetFunction), tham số của nó phải là Range.
Bạn dùng WorksheetFunction mà bắt tính cho biến "giá trị" của VBA nên nó không tính được.
Nếu MsgBox (Application.WorksheetFunction.CountIf(vung,2))
thì tính được, vì vùng vung đã được set là Range("A1:A20")
 
Biến mang() sau khi gán giá trị trở thành tập hợp các giá trị của các ô trong vùng vung.
Countif là hàm của Excel (WorksheetFunction), tham số của nó phải là Range.
Bạn dùng WorksheetFunction mà bắt tính cho biến "giá trị" của VBA nên nó không tính được.
Nếu MsgBox (Application.WorksheetFunction.CountIf(vung,2))
thì tính được, vì vùng đã set là Range("A1:A20")
Ý bạn ấy là muốn từ 1 vùng nào đó lấy ra 1 mảng theo điều kiện và áp dụng countif...
Mình cũng chưa hiểu tại sao đã khai báo Redim mang rồi lúc này mang là kiểu gì.
Còn thường thì mình dùng, do chưa biết hết, thêm 1 vòng ví dụ như, tìm trong vùng => mang, đếm thỏa điều kiện. Đây chỉ là ví dụ.
PHP:
Option Explicit
Sub thu()
Dim mang()
Dim i As Long, vung As Range, n As Long
Set vung = Range("A1:A10")
ReDim mang(1 To vung.Count)
For i = 1 To vung.Rows.Count
    If vung.Cells(i, 1) > 2 Then mang(i) = vung.Cells(i, 1)
Next
For i = 1 To UBound(mang)
    If mang(i) = 2 Then n = n + 1
Next
MsgBox n
'MsgBox Application.WorksheetFunction.CountIf(mang(), 2)
End Sub
 
Hiện mình đang cần đếm xem trong 1 mãng mới đó có bao nhiêu số 2 vậy thôi!
Mã:
Sub thu()
Dim mang()
Set vung = Range("A1:A20")
ReDim mang(vung.Count)
dem = 0
For i = 1 To vung.Count
mang(i) = vung.Cells(i)
If vung.Cells(i) = 2 Then
dem = dem + 1
End If
Next
MsgBox dem
End Sub
 
Mã:
Sub thu()
Dim mang()
Set vung = Range("A1:A20")
ReDim mang(vung.Count)
dem = 0
For i = 1 To vung.Count
mang(i) = vung.Cells(i)
If vung.Cells(i) = 2 Then
dem = dem + 1
End If
Next
MsgBox dem
End Sub
Vậy thì mang(i) làm gì. Nếu chỉ vung không thì đâu cần for i, chỉ cần WF.countif(vung,2)
 
Không phải vì em không biết lấy vùng đó để đếm luôn mà ở đây số liệu là ở dạng động nên vấn đề giả sử code như vầy:
PHP:
Function dem(vung as Range, th1 as Long)
Dim mang()
'' giả sử vung = Range("A1:A20")
ReDim mang(1 To vung.count)
k = 1
 
''....... <khúc này còn nữa
 
For j = 1 To vung.Rows.Count
    If vung.Cells(j) <= 5 Then
        mang(k) = vung.Cells(j) + 1
        k = k + 1
    ElseIf vung.Cells(j) >= 7 Then
        mang(k) = vung.Cells(j) - Int(j / 2)
        k = k + 1
    End If
Next
dem = Application.WorksheetFunction.CountIf(mang(), 10)
End Function
Ở giả sử j = 4vung.cells(4) = 12 thì kết quả mang(4) = 10. Nếu có trường hợp tương tự thì sẽ có nhiều kết quả cho 10.
Vậy muốn biết có bao nhiêu con 10 trong mang thì làm sao?
Còn dùng For để đếm thì cũng là 1 giải pháp, chỉ là nếu mãng này có nhiều số liệu và code đã dài rồi mà làm vậy thì càng dài thêm mà còn chạy chậm nữa chứ!
Còn vung.count thì chẳng biết nó dài bao nhiêu nữa vì em dùng cho Function mà! Các bác thông cảm nếu không cách nào khác thì đành chịu dùng thêm For vậy!
Nhờ mọi người nghĩ cách xem còn cách nào hay hơn For không?

Nhưng vấn đề em phát hiện thấy các hàm của Function không thể chạy khi đó là 1 mãng ảo! Nên muốn tìm cách khắc phục thôi! Còn ứng dụng thì nó thực sự nằm trong 1 SUB khác!

À còn nữa nếu các hàm khác như SMALL hoặc SUMPRODUCT thì bó tay sao??
Xin cảm ơn mọi người đã dành thời gian cho em!
Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Bạn mô tả lại công việc của đoạn mã lệnh xem sao, rối quá!!

Lúc thì Sub, lúc thì Function; Thật hết biết!

Bạn mô tả xem nhiệm vụ Sub/Function của bạn dùng làm gì?
Function dem(vung as Range, th1 as Long)
. . .

End Function
hay
Sub Dem ( Vung As Range, Th1 As Long)
. . .
End Sub
Sẽ làm gì? Mình mường tượng rằng Vung là 1 vùng bạn chưa biết trước số ô trong nó
* Vung này có liên tục theo cột/hàng hay không
Th1 là gì, bạn cứ úp, úp, mở , mở ai mà chịu nổi hở Trời

** Hay nhiệm vụ là lấy các trị chứa trong vùng để xác định vùng mới (# Vung) để khảo sát tìm 1 trị nào đó trong nớ?

Hãy truyền đạt mong muốn của mình cho mọi người hiểu dùm cái!
Lúc đó bạn sẽ nhận được 1 cách chóng vánh kết quả hỗ trợ từ diễn đàn!!:-=


 
Không phải vì em không biết lấy vùng đó để đếm luôn mà ở đây số liệu là ở dạng động nên vấn đề giả sử code như vầy:
PHP:
Function dem(vung as Range, th1 as Long)
Dim mang()
'' giả sử vung = Range("A1:A20")
ReDim mang(1 To vung.count)
k = 1
 
''....... <khúc này còn nữa
 
For j = 1 To vung.Rows.Count
    If vung.Cells(j) <= 5 Then
        mang(k) = vung.Cells(j) + 1
        k = k + 1
    ElseIf vung.Cells(j) >= 7 Then
        mang(k) = vung.Cells(j) - Int(j / 2)
        k = k + 1
    End If
Next
dem = Application.WorksheetFunction.CountIf(mang(), 10)
End Function
Ở giả sử j = 4vung.cells(4) = 12 thì kết quả mang(4) = 10. Nếu có trường hợp tương tự thì sẽ có nhiều kết quả cho 10.
Vậy muốn biết có bao nhiêu con 10 trong mang thì làm sao?
Còn dùng For để đếm thì cũng là 1 giải pháp, chỉ là nếu mãng này có nhiều số liệu và code đã dài rồi mà làm vậy thì càng dài thêm mà còn chạy chậm nữa chứ!
Còn vung.count thì chẳng biết nó dài bao nhiêu nữa vì em dùng cho Function mà! Các bác thông cảm nếu không cách nào khác thì đành chịu dùng thêm For vậy!
Nhờ mọi người nghĩ cách xem còn cách nào hay hơn For không?

Nhưng vấn đề em phát hiện thấy các hàm của Function không thể chạy khi đó là 1 mãng ảo! Nên muốn tìm cách khắc phục thôi! Còn ứng dụng thì nó thực sự nằm trong 1 SUB khác!

À còn nữa nếu các hàm khác như SMALL hoặc SUMPRODUCT thì bó tay sao??
Xin cảm ơn mọi người đã dành thời gian cho em!
Xin cảm ơn.

Bạn xem xét đoạn code này xem sao:
PHP:
Function Dem(Vung As Range)
Dim mang(), Cll As Range, K as Long
ReDim mang(1 To Vung.Count)
K = 1
For Each Cll In Vung
    If Cll <= 5 Then
        If Cll + 1 = 10 Then
        mang(K) = Cll + 1
        K = K + 1
        End If
    ElseIf Cll >= 7 Then
        If Cll - Int(j / 2) = 10 Then
        mang(K) = Cll - Int(j / 2)
        K = K + 1
        End If
    End If
Next Cll
Dem = Application.WorksheetFunction.Count(mang())
End Function
 
Đếm giá trị không dùng hàm countif

Có cách nào , không sử dụng hàm countif nhưng vẫn đếm được các giá trị trong một dãy ô . Vì khi sử dụng hàm countif điều kiện đếm phải để trong ngoặc kép , do đó rất phiền phức khi nó là số thập phân phụ thuộc vào vào định dạng phần thập phân là dấu chấm hoặc phẩy . Nhờ các bạn chỉ giúp , xin cảm ơn nhiều .
 

File đính kèm

Có cách nào , không sử dụng hàm countif nhưng vẫn đếm được các giá trị trong một dãy ô . Vì khi sử dụng hàm countif điều kiện đếm phải để trong ngoặc kép , do đó rất phiền phức khi nó là số thập phân phụ thuộc vào vào định dạng phần thập phân là dấu chấm hoặc phẩy . Nhờ các bạn chỉ giúp , xin cảm ơn nhiều .

Bạn có thể dùng SUMPRODUCT để thay thế!
Trong ví dụ của bạn, để đếm trong vùng có bao nhiêu giá trị <5 thì có thể dùng các công thức sau:
=SUMPRODUCT(--(A1:F1<5))
{=SUM(--(A1:F1<5))} (nhớ Ctrl+Shift+Enter)
{=SUM(IF(A1:F1<5,1,0))} (nhớ Ctrl+Shift+Enter)
 
Countif là ngon rồi bạn cần gì nữa, có nhiều cách vd:một cách.
Mã:
=SUMPRODUCT(($A$1:$F$1=5)*1)
 
Đúng là dùng hàm có chứa tham số là văn bản, ta phải nhập đúng văn bản đó.
Có thể thay văn bản đó bằng 1 địa chỉ ô đang chứa văn bản cần tìm thì dễ hơn.
Ví dụ có danh sách tên trong vùng A1:A100 như dưới đây (có viết số hàng)
1 Nguyễn Thị Vân
2 Trần Nam An
---
100 Nguyễn Thị Vân
Ta cần đếm có bao nhiêu "Nguyễn Thị Vân", hoặc dùng công thức
=countif(A1:A100,"Nguyễn Thị Vân")
hoặc dùng công thức
=countif(A1:A100,A1)
Nếu cần sao chép, tham số đầu phải là địa chỉ tuyệt đối.
 
Lần chỉnh sửa cuối:
xây dựng 1 hàm kết sumproduct và countif

Làm thế nào để dếm có bao nhiêu aa và yz ở 2 cột A và B thỏa cho điều kiện trong khỏang thời gian được xác định I2 đến J2

Anh chị nào biết xin chỉ giúp - Cảm ơn
 

File đính kèm

Làm thế nào để dếm có bao nhiêu aa và yz ở 2 cột A và B thỏa cho điều kiện trong khỏang thời gian được xác định I2 đến J2

Anh chị nào biết xin chỉ giúp - Cảm ơn

Bạn chỉ cần dùng SUMPRODUCT là đủ rồi:
=SUMPRODUCT(--($A$2:$A$19="aa"),--($B$2:$B$19="yz"),--($C$2:$C$19>=$I2),--($C$2:$C$19<=$J2))
Hoặc
=SUMPRODUCT(($A$2:$A$19="aa")*($B$2:$B$19="yz")*($C$2:$C$19>=$I2)*($C$2:$C$19<=$J2))
Hoặc dùng SUM luôn cũng được (nhớ gõ công thức xong thì ấn Ctrl+Shift+Enter)
{=SUM(($A$2:$A$19="aa")*($B$2:$B$19="yz")*($C$2:$C$19>=$I2)*($C$2:$C$19<=$J2))}
Sau đó copy down công thức xuống nếu muốn xem nhiều giá trị từ ngày đến ngày tại các cột I, J.

Bạn xem thêm file đính kèm nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Hàm Countif

Xin hỏi ? Có cách nào để sử dụng hàm countif để đếm giá trị là số , mà không bị ảnh hưởng bởi định dạng kiểu số thập phân là dấu "," hoặc dấu "." . Ví dụ : đang sử dụng hàm đếm Countif(A1:A10 ; ">=6,2") , nếu chép công thức này sang máy khác mà định dạng kiểu số thập phân là 6.2 thì sẽ công thức sẽ bị sai . Làm cách nào để công thức luôn luôn đúng mà không cần phải định dạng lại .Xin được giúp đỡ , cảm ơn .
 
Bạn có thể dùng công thức để tạo ra các số không nguyên. Chẳng hạn: dùng 62/10 để tạo ra 6.2 (hoặc 6,2) không phụ thuộc vào thiết lập cụ thể của hệ điều hành.
=COUNTIF(A1:A10; ">=" & (62/10))
 
theo minh nghĩ định dạnh của 2 cell khác nhau, 1 dạng số, 1 dạng number nên khi đếm không được. bạn thử kiểm tra lại xem!
 
Xin hỏi ? Có cách nào để sử dụng hàm countif để đếm giá trị là số , mà không bị ảnh hưởng bởi định dạng kiểu số thập phân là dấu "," hoặc dấu "." . Ví dụ : đang sử dụng hàm đếm Countif(A1:A10 ; ">=6,2") , nếu chép công thức này sang máy khác mà định dạng kiểu số thập phân là 6.2 thì sẽ công thức sẽ bị sai . Làm cách nào để công thức luôn luôn đúng mà không cần phải định dạng lại .Xin được giúp đỡ , cảm ơn .
Bản chỉ cần viết hàm tác ra là được; theo như ví dụ của bạn, ta chỉ cầm viết: COUNTIF(A1:A10; ">=" & 6.2) khi đó sang máy khác 6.2 sẽ tự động chuyển thành 6,2
 
Countif bằng VBA như thế nào

Em thử viết một code để học như sau nhưng sai nè không chạy được
--> công việc là tự động countif lại mỗi lần tại cột B khi ta thêm dữ liệu vào cột A

Xin các Anh chỉ cho
Private Sub Worksheet_Change(ByVal Target As Range)
Dim er As Long
Dim tmp As Long

er = [A65000].End(xlUp).Row
For i = 1 To er
If Cells(i, 1) <> "" Then
tmp = Application.CountIf(Range("A1:A" & i), "A" & i)
Cells(i, 2) = tmp

Else: Exit Sub
End If
Next

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim er As Long
    er = [A65000].end(xlup).row
  
        For i = 1 To er
            If Cells(i,1) <> "" Then
                Cells(i,2)= Application.CountIf(Range("A1:A" & i), "A" & i)
             
              Else: Exit Sub
            End If
        Next
           
End Sub

Hãy sửa đoạn code trên thành:
[highlight=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
Dim er As Long
er = [A65000].end(xlup).row
For i = 1 To er
If Cells(i,1) <> "" Then
Cells(i,2)= Application.WorksheetFunction.CountIf(Range("A1:A" & er), Range("A" & i)) ''<==Sửa chỗ này
Else: Exit Sub
End If
Next
End Sub[/highlight]

Lưu ý:
Đoạn code này của bạn:
.CountIf(Range("A1:A" & i),"A" & i)
1. Có lẽ chưa chính xác, vỉ khi biến i chạy thì vùng xác định (vùng tô đậm màu đỏ) để COUNTIF đúng ra không được "chạy" mới đúng! Do đó chỗ này đúng ra phải là Range("A1:A" & er)

2. Điều kiện đếm (vùng tô đậm màu xanh dương), theo như mình hiểu ý của bạn là Ô Ai chứ không phải là giá trị chuỗi "A"&i, đúng không bạn? Do đó chỗ này đúng ra phải là Range("A" & i)
 
Lần chỉnh sửa cuối:
Anh ơi code chạy vẫn chưa đúng anh à; ý em là như này
Ví dụ
Số bill------- tổng số lần lặp
0001-----------01
0002-----------02
0002-----------02
0005-----------03
0005-----------03
0005-----------03
--------------------------------
Cứ như vậy khi em cập nhật số bill mới vào nó sẽ ra tổng bill tại cột bên cạnh
Nhưng tổng số bill này chỉ là value thôi, không có công thức

Cám ơn ANh
 
Bạn có thể viết code giống như sau:
PHP:
Sub chay() Dim er As Long     er = [A65000].End(xlUp).Row         For i = 3 To er             If Cells(i, 1)  "" Then                 Cells(i, 2) = Application.CountIf(Range("A3:A" & er), Range("A" & i))                 Cells(i, 2).NumberFormat = "00"             End If         Next End Sub
Chú ý: Code này đặt trong Module đó. Thân.
 
Lần chỉnh sửa cuối:
Anh ơi code chạy vẫn chưa đúng anh à; ý em là như này
Ví dụ
Số bill------- tổng số lần lặp
0001-----------01
0002-----------02
0002-----------02
0005-----------03
0005-----------03
0005-----------03
--------------------------------
Cứ như vậy khi em cập nhật số bill mới vào nó sẽ ra tổng bill tại cột bên cạnh
Nhưng tổng số bill này chỉ là value thôi, không có công thức

Cám ơn ANh
Thêm 1 dk if nữa là ok
PHP:
k=0
if Worksheetfunction.CountIf(Range("A1:A" & i), "A" & i) > 1 then
Cells(i,2)=k
else
k=k+1
Cells(i,2)=k

end if
 
Anh ơi code chạy vẫn chưa đúng anh à; ý em là như này
Ví dụ
Số bill------- tổng số lần lặp
0001-----------01
0002-----------02
0002-----------02
0005-----------03
0005-----------03
0005-----------03
--------------------------------
Cứ như vậy khi em cập nhật số bill mới vào nó sẽ ra tổng bill tại cột bên cạnh
Nhưng tổng số bill này chỉ là value thôi, không có công thức
Không biết chưa đúng ý bạn chỗ nào!? Mình nghĩ vấn đề còn lại là format mà thôi! Code mình nó cho ra dữ liệu kiểu số [1,2,3], bạn có thể format lại cột B để có dữ liệu như ý [01,02,03...]
Thêm vào đó, bạn nên làm giống Po_Pikachu:
Chép code vào Module và xử lý chạy code này khi có sự kiện Worksheet_SelectionChange thì hay hơn! Code này của bạn, mình để vào sự kiện Worksheet_Change thì máy nó treo luôn.

To: anh THUNGHI: vấn đề này đâu cần thêm If và biến k nữa đâu anh! COUNTIF là đủ mà!

Xin xem file đính kèm!
 

File đính kèm

Lần chỉnh sửa cuối:
Không biết chưa đúng ý bạn chỗ nào!? Mình nghĩ vấn đề còn lại là format mà thôi! Code mình nó cho ra dữ liệu kiểu số [1,2,3], bạn có thể format lại cột B để có dữ liệu như ý [01,02,03...]
Thêm vào đó, bạn nên làm giống Po_Pikachu:
Chép code vào Module và xử lý chạy code này khi có sự kiện Worksheet_SelectionChange thì hay hơn! Code này của bạn, mình để vào sự kiện Worksheet_Change thì máy nó treo luôn.

To: anh THUNGHI: vấn đề này đâu cần thêm If và biến k nữa đâu anh! COUNTIF là đủ mà!
Thú thật mình cũng không đọc kỹ nhưng mà theo như yêu cầu là nếu nhập thêm ma mới thì có đếm còn không thì vẫn lấy số đếm cũ thì làm vậy cho lẹ.
 
Cám ơn bác Pi_kachu vô cùng
Code của bác chạy rất ổn nhưng
Code bác cho vào Module thì mỗi lần cập nhật em lại chạy code à
----------
Em muốn mỗi lần cập nhật dữ liệu vào thì thì nó chạy luôn (sự kiện change đó)
--------------
To bác Thu Nghi đáng kính

Không hiểu sao khi chạy code của bác máy em cứ treo ngược cành cây bác ạ

Mong được sự chỉ bảo từ các bác

St-Lu!
 
Lần chỉnh sửa cuối:
Cám ơn bác Pi_kachu vô cùng
Code bác cho vào Module thì mỗi lần cập nhật em lại chạy code à
----------
Em muốn mỗi lần cập nhật dữ liệu vào thì thì nó chạy luôn (sự kiện change đó)
Bạn xem file mình vừa attached tại bài #6 để biết cách làm nhé!
--------------
To bác Thu Nghi đáng kính
Không hiểu sao khi chạy code của bác máy em cứ treo ngược cành cây bác ạ
Mong được sự chỉ bảo từ các bác
Mình đã nói là đặt vào sự kiện change thì không được mà, không biết phải giải thích làm sao nữa!
 
Lần chỉnh sửa cuối:
Thì mình làm vẫn chạy ngon trơn mà. Chỉ là ý của tác giả diễn tả chẳng hiểu gì cả? Đây là file mình đã làm theo Worksheet_SelectionChange nhưng đâu thấy treo gì đâu. Còn code trên là chạy trên Module mà!
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim er As Long     er = [A65000].End(xlUp).Row     luu = Application.CountIf(Range("A3:A" & er), Range("A3"))     k = 1         For i = 3 To er                 m = Application.CountIf(Range("A3:A" & er), Range("A" & i))                 If m = luu Then                 Cells(i, 2) = k                 Cells(i, 2).NumberFormat = "00"                 Else                 k = k + 1                 Cells(i, 2) = k                 Cells(i, 2).NumberFormat = "00"                 luu = m                 End If         Next End Sub
File: http://www.mediafire.com/?4vttdmtlwrz A hiểu rồi! Nhưng trường hợp hai loại dữ liệu khác nhau nhưng có cùng số lần giống nhau thì viết làm sao nhỉ? Thân.
 
Lần chỉnh sửa cuối:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim er As Long
    er = [A65000].End(xlUp).Row
    luu = Application.CountIf(Range("A3:A" & er), Range("A3"))
    k = 1
        For i = 3 To er
                m = Application.CountIf(Range("A3:A" & er), Range("A" & i))
                If m = luu Then
                Cells(i, 2) = k
                Cells(i, 2).NumberFormat = "00"
                Else
                k = k + 1
                Cells(i, 2) = k
                Cells(i, 2).NumberFormat = "00"
                luu = m
                End If
        Next
End Sub
Po_Pikachu ơi! Code cũ bạn viết nó ngắn và chính xác hơn nhiều so với code trên đây, sao hổng xài vậy?

Hãy giả sử đơn giản ta dùng công thức countif trên sheet đi, sẽ thấy:

|A|B|C
1|001|=Countif(A1:A$10,$A1)|=01
2|002|=Countif(A1:A$10,$A2)|=02
3|002|=Countif(A1:A$10,$A3)|=02
4|003|=Countif(A1:A$10,$A4)|=03
5|003|=Countif(A1:A$10,$A5)|=03
6|003|=Countif(A1:A$10,$A6)|=03
7|005|=Countif(A1:A$10,$A7)|=04
8|005|=Countif(A1:A$10,$A8)|=04
9|005|=Countif(A1:A$10,$A9)|=04
10|005|=Countif(A1:A$10,$A10)|=04
Từ đó suy ra code VBA cũng vậy thôi!
 
Lần chỉnh sửa cuối:
Bạn xem file mình vừa attached tại bài #6 để biết cách làm nhé!
Mình đã nói là đặt vào sự kiện change thì không được mà, không biết phải giải thích làm sao nữa!

Anh Kiệt ơi
Nếu file của em gần 20 ngàn dòng thì có lên sử dụng code này không?
------------
Em chưa test vì số liệu cập nhật sẽ tăng dần mỗi ngày


Cám ơn Anh
 
Anh Kiệt ơi
Nếu file của em gần 20 ngàn dòng thì có lên sử dụng code này không?
------------
Em chưa test vì số liệu cập nhật sẽ tăng dần mỗi ngày


Cám ơn Anh
Sự kiện change phải cụ thể vào 1 cột, cell nào đó, nếu dữ liệu # 20.000 rows thì nên dùng sub thôi hay gán cho 1 phím gì đó thực thi code. Vì thay đổi code lại chạy => chậm.
 
Anh Kiệt ơi
Nếu file của em gần 20 ngàn dòng thì có lên sử dụng code này không?
------------
Em chưa test vì số liệu cập nhật sẽ tăng dần mỗi ngày
Cám ơn Anh
Dĩ nhiên 20,000 dòng mà dùng sự kiện Worksheet_SelectionChangevòng lặp 20,000 lần thì file nó chạy như thế nào là bạn biết rồi phải không? Mỗi lần chuyển con trỏ là code chạy quét 20,000 lần!?? +-+-+-+

Giải quyết bằng cách khác đi! Gợi ý tí:
- Có thể copy công thức hàng loạt sau đó paste value!
- Làm một nút command và chỉ chạy code khi click nút để check!
 
Lần chỉnh sửa cuối:
Cám ơn bác Pi_kachu vô cùng Code của bác chạy rất ổn nhưng Code bác cho vào Module thì mỗi lần cập nhật em lại chạy code à St-Lu!
Có thể em hiểu sai ý chăng??!?!-0-/. Code này chạy được mà!
PHP:
 Private Sub Worksheet_Change(ByVal Target As Range) Dim er As Long     er = [A65000].End(xlUp).Row         For i = 3 To er             If Cells(i, 1)  "" Then                 Cells(i, 2) = Application.CountIf(Range("A3:A" & er), Range("A" & i))                 Cells(i, 2).NumberFormat = "00"             End If         Next End Sub
Còn nếu quá nhiều thì đừng để chạy tự động mà hãy kích hoạt nó bằng tay thôi! Thân.
 
Lần chỉnh sửa cuối:
Anh Kiệt đã viết:
Dĩ nhiên 20,000 dòng mà dùng sự kiện Worksheet_SelectionChange và vòng lặp 20,000 lần thì file nó chạy như thế nào là bạn biết rồi phải không? Mỗi lần chuyển con trỏ là code chạy quét 20,000 lần!??

Giải quyết bằng cách khác đi!

Có khi em dùng công thức exel vụ này thôi vậy, có khi còn nhanh hơn Anh nhỉ?


Em vừa làm thử chút thì gặp lỗi sau
Tại ô nhập liệu, nếu ta bỏ trống một hàng ví dụ
- NHập liệu từ A1 --> A18
bỏ trống A19
Khi nhập liệu vào A20 thì dữ liệu tại ô B20 không chạy
------------
Có cách nào khắc phục không ạ??
 

File đính kèm

Lần chỉnh sửa cuối:
Po_Pikachu ơi! Code cũ bạn viết nó ngắn và chính xác hơn nhiều so với code trên đây, sao hổng xài vậy? Hãy giả sử đơn giản ta dùng công thức countif trên sheet đi, sẽ thấy:
|A|B|C 1|001|=Countif(A1:A$10,$A1)|=01 2|002|=Countif(A1:A$10,$A2)|=02 3|002|=Countif(A1:A$10,$A3)|=02 4|003|=Countif(A1:A$10,$A4)|=03 5|003|=Countif(A1:A$10,$A5)|=03 6|003|=Countif(A1:A$10,$A6)|=03 7|005|=Countif(A1:A$10,$A7)|=04 8|005|=Countif(A1:A$10,$A8)|=04 9|005|=Countif(A1:A$10,$A9)|=04 10|005|=Countif(A1:A$10,$A10)|=04
Từ đó suy ra code VBA cũng vậy thôi!
Em hỗng xài vì nó không có tính tăng dần. Bác xem file sẽ thấy 7 con số 01 ở lần xuất hiện đầu tiên đó. Thân.
 
Lần chỉnh sửa cuối:
Em thử viết một code để học như sau nhưng sai nè không chạy được
--> công việc là tự động countif lại mỗi lần tại cột B khi ta thêm dữ liệu vào cột A

Xin các Anh chỉ cho

Dùng thử đoạn code này xem sao (Test thử thì thấy rất OK)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    If Target.Column = 1 Then
    Set Rng = Range([a3], [a65000].End(xlUp))
        For Each Clls In Rng
            Clls.Offset(, 1) = .CountIf(Rng, Clls)
        Next
    End If
End With
End Sub
 
Có khi em dùng công thức exel vụ này thôi vậy, có khi còn nhanh hơn Anh nhỉ? Em vừa làm thử chút thì gặp lỗi sau Tại ô nhập liệu, nếu ta bỏ trống một hàng ví dụ - NHập liệu từ A1 --> A18 bỏ trống A19 Khi nhập liệu vào A20 thì dữ liệu tại ô B20 không chạy ------------ Có cách nào khắc phục không ạ??
Hổng chạy là phải rồi! Bạn đặt chức năng nếu ô Cells(i,1) mà rỗng thì code dừng lại đó.
Mã:
If [COLOR=red]Cells(i, 1)  ""[/COLOR] Then ... [COLOR=red]Else: Exit Sub[/COLOR]
Vậy hỏi xem bạn có cần tính chất này không? Không cần thì viết như vầy:
PHP:
Sub Test() Dim eR As Long eR = [A65000].End(xlUp).Row     For i = 1 To eR             Cells(i, 2) = Application.CountIf(Range("A1:A" & eR), Range("A" & i))             Cells(i, 2).NumberFormat = "00"     Next End Sub
Thân.
 
Lần chỉnh sửa cuối:
Có khi em dùng công thức exel vụ này thôi vậy, có khi còn nhanh hơn Anh nhỉ?


Em vừa làm thử chút thì gặp lỗi sau
Tại ô nhập liệu, nếu ta bỏ trống một hàng ví dụ
- NHập liệu từ A1 --> A18
bỏ trống A19
Khi nhập liệu vào A20 thì dữ liệu tại ô B20 không chạy
------------
Có cách nào khắc phục không ạ??
Cái này là do đoạn tô đậm màu đỏ này, bỏ đoạn đó đi là xong:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim er As Long
er = [A65000].end(xlup).row
For i = 1 To er

If Cells(i,1) <> "" Then
Cells(i,2)= Application.WorksheetFunction.CountIf(Range("A1:A" & er), Range("A" & i)) ''<==Sửa chỗ này
Else: Exit Sub <== Bỏ đoạn này đi là xong
End If
Next
End Sub
 
Code của anh Khải hay thật đó, không cần đặt ở module
Ẹc ẹc
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    If Target.Column = 1 Then
    Set Rng = Range([a3], [a65000].End(xlUp))
        For Each clls In Rng
            If clls <> "" Then
            clls.Offset(, 1) = .CountIf(Rng, clls)
            Else
            clls.Offset(, 1) = ""
            End If
        Next
    End If
End With
End Sub
Cám ơn các Anh

Cám ơn Anh Kiệt, Anh Pi_Kachu, Anh Thu Nghi, Anh Khải... rất nhiều về sự giúp đỡ


Một lần nữa xin cám ơn các Anh rất nhiều


ST-Lu!
 
Lần chỉnh sửa cuối:
Em xin lỗi vì lài dài dòng một chút
1. Em thử chạy code của Pi_kachu với File khoảng 1500 dòng

Tại Module
PHP:
Sub Test()
Dim eR As Long
eR = [A65000].End(xlUp).Row
    For i = 1 To eR
            Cells(i, 13) = Application.CountIf(Range("A1:A" & eR), Range("A" & i))
            Cells(i, 13).NumberFormat = "00"
    Next
End Sub
Tại Sheet
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Test
End Sub

File chạy rất lâu, mỗi lần thay đổi, di chuyển chờ vài phút
--------------------------------
Code của Anh Boyxin khá hơn
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    If Target.Column = 1 Then
    Set Rng = Range([a3], [a65000].End(xlUp))
        For Each Clls In Rng
            Clls.Offset(, 1) = .CountIf(Rng, Clls)
        Next
    End If
End With
End Sub

Nhưng chạy cũng lâu

Em gửi File các Anh Test thử nhé
-----------------
Nếu VBA thế này thì em phải dùng công thức Excel vậy thôi

Cám ơn các Anh
 

File đính kèm

To Po_Pikachu.

PHP:
Sub Test() 
Dim eR As Long 
eR = [A65000].End(xlUp).Row 
    For i = 1 To eR 
1           Cells(i, 13) = Application.CountIf(Range("A1:A" & eR), Range("A" & i)) 
2            Cells(i, 13).NumberFormat = "00" 
    Next 
End Sub
Mình nghĩ dòng lệnh 2 có thể để ngoài vòng lặp & 'Làm' 1 lần toàn cột!?!



 
COUNTIF in VBA

Em xin lỗi vì lài dài dòng một chút
1. Em thử chạy code của Pi_kachu với File khoảng 1500 dòng
File chạy rất lâu, mỗi lần thay đổi, di chuyển chờ vài phút
--------------------------------
Code của Anh Boyxin khá hơn
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    If Target.Column = 1 Then
    Set Rng = Range([a3], [a65000].End(xlUp))
        For Each Clls In Rng
            Clls.Offset(, 1) = .CountIf(Rng, Clls)
        Next
    End If
End With
End Sub
Nhưng chạy cũng lâu

Em gửi File các Anh Test thử nhé

Thay bằng đoạn code này sẽ thấy cải thiện hơn rất nhiều (chớp mắt xong thì cũng đếm xong)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    .DisplayAlerts = False
    .Calculation = xlCalculationManual
    If Target.Column = 1 Then
    Set Rng = Range([a10], [a65000].End(xlUp))
    Tmp = Rng.Offset(, 1)
        For Each Clls In Rng
            Tmp(Clls.Row - 9, 1) = .CountIf(Rng, Clls)
        Next
    Rng.Offset(, 1) = Tmp
    End If
    .Calculation = xlCalculationAutomatic
    .DisplayAlerts = True
End With
End Sub
 
Lần chỉnh sửa cuối:
Tôi thì làm vầy:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   Application.ScreenUpdating = False
   With Range([A9], [A65000].End(xlUp))
     If Not Intersect(.Cells, Target) Is Nothing Then
       .Offset(, 1).FormulaArray = "=COUNTIF(" & .Cells.Address & "," & .Cells.Address & ")"
       With .Offset(, 1)
         .Value = .Value: .NumberFormat = "00"
         .AutoFilter 1, "=00"
         .SpecialCells(12).ClearContents
       End With
     End If
   End With
   ActiveSheet.AutoFilterMode = False
End Sub
Với 1500 dòng dử liệu mà For thì đến bao giờ mới xong!
Thử code này xem có cải thiện được tốc độ không nha
Nói thêm: Tôi nghĩ code này không nên đặt vào sự kiện change, chỉ tổ phí thời gian ---> Nên cho vào 1 sub ---> Khi nhập liệu xong, chạy code 1 lần duy nhất cho khỏe
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi thì làm vầy:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   Application.ScreenUpdating = False
   With Range([A9], [A65000].End(xlUp))
     If Not Intersect(.Cells, Target) Is Nothing Then
       .Offset(, 1).FormulaArray = "=COUNTIF(" & .Cells.Address & "," & .Cells.Address & ")"
       With .Offset(, 1)
         .Value = .Value: .NumberFormat = "00"
         .AutoFilter 1, "=00"
         .SpecialCells(12).ClearContents
       End With
     End If
   End With
   ActiveSheet.AutoFilterMode = False
End Sub
Với 1500 dòng dử liệu mà For thì đến bao giờ mới xong!
Thử code này xem có cải thiện được tốc độ không nha
Nói thêm: Tôi nghĩ code này không nên đặt vào sự kiện change, chỉ tổ phí thời gian ---> Nên cho vào 1 sub ---> Khi nhập liệu xong, chạy code 1 lần duy nhất cho khỏe

Nếu dùng công thức thì có thể dùng cách này cũng nhanh
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    .DisplayAlerts = False
    .Calculation = xlCalculationManual
If Target.Column = 1 Then
    With Range([a10], [a65535].End(xlUp))
        .Offset(, 1).Formula = "=if(rc[-1]="""","""",countif(" & .Address(, , 2) & ",rc[-1]))"
        .Offset(, 1) = .Offset(, 1).Value
    End With
End If
    .Calculation = xlCalculationAutomatic
    .DisplayAlerts = True
End With
End Sub
 
Cải tiến thêm 1 bước nữa, khỏi cần AutoFilter luôn ---> Đương nhiên tốc độ cũng sẽ nhanh hơn
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim RgAr As String
  With Range([A9], [A65000].End(xlUp))
    RgAr = .Address
    If Not Intersect(.Cells, Target) Is Nothing Then
      .Offset(, 1).FormulaArray = "=IF(" & RgAr & "= """",""""," & "COUNTIF(" & RgAr & "," & RgAr & "))"
      .Offset(, 1).Value = .Offset(, 1).Value
      .Offset(, 1).NumberFormat = "00"
    End If
  End With
End Sub
--------------------
Ẹc... Ẹc... Vừa post xong đã thấy Boyxin post trước y chang...
 

File đính kèm

Cải tiến lần nữa ---> Bỏ luôn công đoạn chuyển công thức thành giá trị
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim RgAr As String
   With Range([A9], [A65000].End(xlUp))
     RgAr = .Address
     If Not Intersect(.Cells, Target) Is Nothing Then
       .Offset(, 1).Value = Evaluate("=IF(" & RgAr & "= """",""""," & "COUNTIF(" & RgAr & "," & RgAr & "))")
       .Offset(, 1).NumberFormat = "00"
     End If
   End With
End Sub
Xong ---> Hy vọng không còn gì để cải tiến nữa
Ẹc... Ẹc....
 

File đính kèm

Anh Kiệt ơi
Nếu file của em gần 20 ngàn dòng thì có lên sử dụng code này không?
------------
Em chưa test vì số liệu cập nhật sẽ tăng dần mỗi ngày


Cám ơn Anh

Nếu rất nhiều dòng (20.000 gì đó) mà chạy lại toàn bộ thì chỉ có chết. Hãy thử cách sau:

- Mỗi khi có sự thay đổi một Cell thuộc cột A, ghi lại giá trị cũ và mới (OldValue; NewValue)
- Dùng phương thức Find đếm từ Cell vừa thay đổi đến hàng cuối cùng :
+ Nếu trùng với OldValue thì Cell bên cột B sẽ giảm đi 1

+ Nếu trùng với NewValue thì Cell bên cột B sẽ tăng lên 1
Thử xem nhé.

--Chúc vui--
 
Ý bạn nói là như vậy hả?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next    If Target.Column = 1 And Target.Value  "" Then    Target.Offset(, 1).Value = Application.CountIf(Range("A:A"), Target.Value)    Target.Offset(, 1).NumberFormat = "00"    ElseIF Target.Column = 1 And Target.Value = "" Then    Target.Offset(, 1).Value = ""    End If End Sub
Thân
 
Lần chỉnh sửa cuối:
Nếu rất nhiều dòng (20.000 gì đó) mà chạy lại toàn bộ thì chỉ có chết. Hãy thử cách sau:

- Mỗi khi có sự thay đổi một Cell thuộc cột A, ghi lại giá trị cũ và mới (OldValue; NewValue)
- Dùng phương thức Find đếm từ Cell vừa thay đổi đến hàng cuối cùng :
+ Nếu trùng với OldValue thì Cell bên cột B sẽ giảm đi 1

+ Nếu trùng với NewValue thì Cell bên cột B sẽ tăng lên 1
Thử xem nhé.

--Chúc vui--

Thực ra với yêu cầu đếm như bài này thì có nhiều cách

Tác giả muốn hỏi VLOOKUP trong VBA thế nào thì mọi người làm như vậy thôi. Nếu hỏi Đếm thế nào thì dùng FIND (như Lệnh Hồ Đại Hiệp nói) là nhanh nhất rồi
 
Dùng hàm Find mà dữ liệu nhiều cũng chậm lắm đó bác à! Vì hàm Find chạy theo quy tắc hàng trước, dọc sau, quét từ trái sang phải - từ trên xuống dưới. Nên 20,000 dòng thì bác có thể đếm được bao nhiêu ô dữ liệu rồi đúng không? Thân.
 
Lần chỉnh sửa cuối:
Dùng hàm Find mà dữ liệu nhiều cũng chậm lắm đó bác à! Vì hàm Find chạy theo quy tắc hàng trước, dọc sau, quét từ trái sang phải - từ trên xuống dưới. Nên 20,000 dòng thì bác có thể đếm được bao nhiêu ô dữ liệu rồi đúng không?
Thân.
Hic, mình chỉ FIND trong Range([a10],[a65535].End(xlUp)) = 1 đoạn trong cột thôi, sao lại để nó quét dọc, quét ngang
 
Dùng hàm Find mà dữ liệu nhiều cũng chậm lắm đó bác à! Vì hàm Find chạy theo quy tắc hàng trước, dọc sau, quét từ trái sang phải - từ trên xuống dưới. Nên 20,000 dòng thì bác có thể đếm được bao nhiêu ô dữ liệu rồi đúng không?
Thân.

Đúng như Boyxin nói, và hơn nữa nó chỉ tìm 2 giá trị OldValue và NewValue thì nhanh hơn, hơn nữa nó chỉ xét từ Cell vừa thay đổi xuống Cell cuối cùng (Những Cell bên trên không thay đổi vì vậy không cần xem xét). Còn nếu dùng For thì phải xét từng hàng.

Hoặc có thể SET AutoFilter cho vùng từ ChangeCell đến Cell cuối cùng với điều kiện Filter là OldValue và NewValue.

--Chúc vui--
 
Nếu hỏi Đếm thế nào thì dùng FIND (như Lệnh Hồ Đại Hiệp nói) là nhanh nhất rồi
Đồng ý là NHANH nhưng chưa chắc là NHẤT đâu
Các bạn nghĩ sao nếu tôi dùng AutoFilter ? ---> Khi Target thay đổi tôi AutoFilter với Criteria = Target ---> rồi quét 1 vài cell đang Visible và COUNTIF
AutoFilter là 1 công cụ sẳn có, tôi nghĩ nó không đến nỗi tệ nhỉ
???
hơn nữa nó chỉ xét từ Cell vừa thay đổi xuống Cell cuối cùng (Những Cell bên trên không thay đổi vì vậy không cần xem xét)
Cái này hình như không đúng à nha ---> Phải xét hết tất tần tật những cell nào = Target, dù nó nằm ở đâu, dưới hay trên... COUNTIF cơ mà
 
Lần chỉnh sửa cuối:
Đồng ý là NHANH nhưng chưa chắc là NHẤT đâu
Các bạn nghĩ sao nếu tôi dùng AutoFilter ? ---> Khi Target thay đổi tôi AutoFilter với Criteria = Target ---> rồi quét 1 vài cell đang Visible và COUNTIF
AutoFilter là 1 công cụ sẳn có, tôi nghĩ nó không đến nỗi tệ nhỉ
???

Cái này hình như không đúng à nha ---> Phải xét hết tất tần tật những cell nào = Target, dù nó nằm ở đâu, dưới hay trên... COUNTIF cơ mà
Có 1 cách này không pro lắm, khi ta xét nếu ma không trùng thì lưu tất cả ma duy nhất vào 1 cell nào đó, và số TT vào cell khác đến dòng i ta chỉ xét theo Cell = hàm Instr hay len(replace(...)) đó thôi. Và số TT + 1. Nhưng mà nếu Cell đó chứa nhiều ma => len(text) quá lớn thì nó có chịu chạy không.
 
Đồng ý là NHANH nhưng chưa chắc là NHẤT đâu
Các bạn nghĩ sao nếu tôi dùng AutoFilter ? ---> Khi Target thay đổi tôi AutoFilter với Criteria = Target ---> rồi quét 1 vài cell đang Visible và COUNTIF
AutoFilter là 1 công cụ sẳn có, tôi nghĩ nó không đến nỗi tệ nhỉ
???

Cái này hình như không đúng à nha ---> Phải xét hết tất tần tật những cell nào = Target, dù nó nằm ở đâu, dưới hay trên... COUNTIF cơ mà

Khi trước đó các mã đã được đếm đúng rồi: chỉ đếm New Target thì FIND hoặc AutoFilter... + COUNTIF ... có lẽ là: nhanh và code cũng đơn giản
 
Cái này hình như không đúng à nha ---> Phải xét hết tất tần tật những cell nào = Target, dù nó nằm ở đâu, dưới hay trên... COUNTIF cơ mà

Cảm ơn Bác, vì không xem File kèm theo của chủ topic nên nhầm tưởng là đếm từ A1--> Cell hiện hành (Như vậy số đếm sẽ tăng dần), nhưng khi xem File mới thấy là đúng như bác viết.

Đồng ý là NHANH nhưng chưa chắc là NHẤT đâu
Các bạn nghĩ sao nếu tôi dùng AutoFilter ? ---> Khi Target thay đổi tôi AutoFilter với Criteria = Target ---> rồi quét 1 vài cell đang Visible và COUNTIF
AutoFilter là 1 công cụ sẳn có, tôi nghĩ nó không đến nỗi tệ nhỉ

Filter là một công cụ mạnh, tuy nhiên việc Countif lại không hẳn là tối ưu, bởi chỉ đơn giản là cộng thêm 1 đơn vị vào các ô tương ứng.
Vì vậy nếu đã Filter thì nên chăng : AutoFilter --> Quét vài Cell đang Visible -->> + 1

Định dùng Paste Special với chức năng Add Value nhưng không được. Nếu được thì nhanh hơn nhiều.

--Chúc vui--
 
Định dùng Paste Special với chức năng Add Value nhưng không được. Nếu được thì nhanh hơn nhiều.
Không biết Đại Hiệp bị vướng chổ nào trong phần này ---> Tôi thí nghiệm thấy PasteSpecial Add được mà (Paste được với cả vùng dử liệu không liên tục)
Trò này thú vị đây ---> Có điều vùng đếm phải có trước ---> Nếu chưa có thì ta vẩn phải COUNTIF để tạo kết quả ban đầu ---> Lần 2 trở đi sẽ dùng PasteSpecial Add
 
Hàm countif trong excel

Khanh có một bài đếm countif, nhưng trong dữ liệu thì có một số ký tự là "0230" và "230" thì hàm countif đếm tổng hết 2 dạng ký tự này luôn, mọi người ơi, chỉ cho K cách nào làm mà 0 bị đếm sai đi
 
Khanh có một bài đếm countif, nhưng trong dữ liệu thì có một số ký tự là "0230" và "230" thì hàm countif đếm tổng hết 2 dạng ký tự này luôn, mọi người ơi, chỉ cho K cách nào làm mà 0 bị đếm sai đi
Dùng hàm SUMPRODUCT thử xem! Gõ vào cell C2 công thức:
PHP:
=SUMPRODUCT(($A$2:$A$5531=$B2)*1)
 
Khanh có một bài đếm countif, nhưng trong dữ liệu thì có một số ký tự là "0230" và "230" thì hàm countif đếm tổng hết 2 dạng ký tự này luôn, mọi người ơi, chỉ cho K cách nào làm mà 0 bị đếm sai đi
Theo cách của bạn Máy thì nó sẽ hiểu 1 cách máy móc thôi chứ không suy nghĩ như mình bạn à.
Nếu cho nó chính xác và dể làm bạn thêm 1 ký tự nào đó đằng trước các số cho nó chuyển hoàn toàn về dạng chuổi, khỏi sợ nó "Hiểu lầm" từ 01 thành 1 ...:-=
Bạn tham khảo file nhé
Thân
 

File đính kèm

Lần chỉnh sửa cuối:
Hi all! Mình cũng muốn hỏi vấn đề liên quan đến countif, mình muốn đếm ngày( dd/mm/yy) thì có đếm được k?
 
Đếm được hết bạn à, bạn thử cho ví dụ nhé
 
K 0 thể đổi tên hay thêm ký tự vì mỗi chuỗi 0111, hay 111 là ký hiệu mã hóa cho tên một trường nên nếu thay đổi thì sẽ làm sai thông tin, vì sau đó khanh còn dùng Vlookup tìm tên trường, tính số lượng hồ sơ nữa, nhiều thứ phía sau lắm.
 
K đã làm được rồi, vậy mà cả tuần này 0 tính được, cám ơn các bạn lắm
 
Hỏi về hàm IF và COUNTIF?

Đây là 1 bài tóa về lọc dữ liệu đã được trao đổi khá lâu trên diễn đàn và có rất nhiều cách giải quyết. Đợt đó tớ có load về 1 bài giải của thành viên tớ cũng không nhớ rõ lắmđể tìm hiều nhưng có 1 số vấn đề vẫn chưa ra. Nay nhờ mọi người giúp đỡ:
Trong công thức name
VT=IF(COUNTIF(LOC!$C$1;OFFSET(DS;;5;;1));ROW(INDIRECT("1:"&ROWS(DS)));"")
Tớ có 3 vấn đề nhờ mọi người giúp:
1. Trong công thức của COUNTIF thì tớ thường thấy thamsố thứ nhất là 1 vùng dữ liệu, còn tham số thứ 2 là thường là 1 ô dữ liệu. Tớ thử hàm này 1 cách độc lập thì cho ra giá trị = 0. Vậy có đúng k?
2. Trong công thức của hàm IF sao tớ không thấy biểu thức logic?
3. Nhờ mọi người dịch nghĩa của cả hàm tên VT này.
 

File đính kèm

+Câu 1: Hàm VT này là hàm mãng bạn à, bạn nhấn Enter thì sẽ cho ra giá trị đầu thôi. Bạn thử quét hàm trên thanh Formula, rồi nhấn F9 bạn sẽ thấy kết quả ngay.

+Câu 2: Biểu thức Logic của IF vẫn vậy thôi, luôn nằm trước dấu (;) đầu tiên. Và ở đây không nói gì hết thì kết quả là TRUE.

+Câu 3: Ý nghĩa là dùng để đưa ra vị trí của dữ liệu hiện muốn tìm. Vậy thôi!
<Nếu có gì sai sót thì nhờ mọi người bổ sung thêm hen!>
Thân.
 
Cảm ơn bạn nhiều. Quả thật kiến thức thật rộng lớn. Bạn có thể chỉ ra cách để nhận biết hàm là hàm mảng hay hàm thông thường hay dùng luôn cách mà bạn vừa chỉ là nhấn F9?
 
Cảm ơn bạn nhiều. Quả thật kiến thức thật rộng lớn. Bạn có thể chỉ ra cách để nhận biết hàm là hàm mảng hay hàm thông thường hay dùng luôn cách mà bạn vừa chỉ là nhấn F9?
Cũng khó nói à nha!
- Với 1 công thức nào đó mà bạn phải Ctrl + Shift + Enter nó mới ra kết quả thì ăn chắc đó là công thức mãng
- Một vài hàm mà bản thân nó đã là mãng rồi (như hàm ROW, COLUMN và 1 vài hàm khác) thì không cần bấm Ctrl + Shift + Enter nó vẫn cho kết quả ---> Vì vậy, với 1 công thức mà ta chỉ cần Enter nó đã ra kết quả thì cũng chưa chắc nó không phải là công thức mãng
- Kết quả của 1 công thức mãng là tập hợp của nhiều phần tử ---> Có thể bôi đen công thức trên thanh Formula rồi bấm F9 để kiểm chứng... Nếu thấy có nhiều giá trị trong đó thì ăn chắc đó là công thức mãng ... (điều ngược lại không chắc là đúng)
vân vân.. và.. vân vân...
Đây là định nghĩa về mãng:
About array formulas and array constants
About array formulas and array constants

An array formula can perform multiple calculations and then return either a single result or multiple results. Array formulas act on two or more sets of values known as array arguments. Each array argument must have the same number of rows and columns. You create array formulas in the same way that you create other formulas, except you press CTRL+SHIFT+ENTER to enter the formula.
Array constants can be used in place of references when you don't want to enter each constant value in a separate cell on the worksheet.
Some of the built-in functions are array formulas, and must be entered as arrays to get the correct results.
Bạn hãy tham khảo topic này xem sao:
http://www.giaiphapexcel.com/forum/showthread.php?t=7917
 
Cảm ơn bác. Nhưng bác cho định nghĩa của Array bằng tiếng anh thế thì khó cho em quá. Nhưng qua tìm hiểu sơ bộ của em, thì em hiều hàm mảng như thế này có được k nhé: Hàm nào mà cho kết quả là 1 vùng dữ liệu tập hợp nhiều phần tử thì đó là hàm mảng?
 
Cảm ơn bác. Nhưng bác cho định nghĩa của Array bằng tiếng anh thế thì khó cho em quá. Nhưng qua tìm hiểu sơ bộ của em, thì em hiều hàm mảng như thế này có được k nhé: Hàm nào mà cho kết quả là 1 vùng dữ liệu tập hợp nhiều phần tử thì đó là hàm mảng?
Mình cũng "điếc" về hàm mảng, nhưng cũng tạm hiểu hàm mảng không cho kết quả là một vùng..., mà hàm mảng cho ra một kết quả được tính toán dựa trên dữ liệu của một hay nhiều mảng - một hay nhiều vùng dữ liệu.
 
Hỏi ve hàm countif

Mình đang làm bên công tác BHXH, nhưng mỗi lần báo cáo phát sinh trong tháng gồm có " LD giảm và nghỉ thai sản" nhưng mình không biết dùng hàm gì để nó đếm ra số lượng giảm là 2 người cả. nếu dùng hàm countif thì nó chỉ đếm được ra 1 người thôi như vậy thì không đúng. Bạn nào giúp mình với. Xin cám ơn nhiều
Mình gửi kèm file và các bạn xem ở cột ghi chú nhá.
 

File đính kèm

Nếu cột ghi chú của bạn chỉ để ghi những người nghỉ ( Bao gồm nghỉ Thai sản, giảm lao động ...) và nếu bạn chỉ cần thống kê chung những trường hợp như vậy thì bạn chỉ cần dùng counta() là được
=COUNTA($AA$12:$AA$13)
Còn nếu trong cột ghi chú bạn ghi cả những nội dung khác thì bạn có thể dùng công thức
=COUNTIF($AA$12:$AA$13,"LĐ giảm") +COUNTIF($AA$12:$AA$13,"Nghỉ thai sản")
Để cộng: LĐ giảm, Nghỉ thai sản....
 
Lần chỉnh sửa cuối:
Mình đang làm bên công tác BHXH, nhưng mỗi lần báo cáo phát sinh trong tháng gồm có " LD giảm và nghỉ thai sản" nhưng mình không biết dùng hàm gì để nó đếm ra số lượng giảm là 2 người cả. nếu dùng hàm countif thì nó chỉ đếm được ra 1 người thôi như vậy thì không đúng. Bạn nào giúp mình với. Xin cám ơn nhiều
Mình gửi kèm file và các bạn xem ở cột ghi chú nhá.

Nếu bạn muốn dùng hàm COUNTIF, bạn có thể làm như sau: Tất cả các điều kiện, bạn cứ cộng lại. Trường hợp của bạn như sau:
=COUNTIF($AA$12:$AA$13,"LĐ giảm")+COUNTIF($AA$12:$AA$13,"Nghỉ thai sản")
Nếu bạn dùng hàm COUNTA thì sẽ tiện cho cộng tất cả nhưng nó không nhận ra bất cứ điều kiện nào. Trong trường hợp của bạn, nên dùng COUNTIF, vì chỉ đếm theo điều kiện thôi.
Thân ái.
 
Thêm 1 cách nữa nè:
PHP:
=SUMPRODUCT(COUNTIF(AA12:AA13,{"LĐ giảm","Nghỉ thai sản"}))
Nếu có từ 2 "loại" cần đếm trở lên mà dùng COUNTIF rồi cộng từng cái lại thì công thức sẽ hơi dài (dù là dể hiểu) ---> Lồng thêm SUMPRODUCT vào có thể rút ngắn được công thức
 
Thêm 1 cách nữa nè:
PHP:
=SUMPRODUCT(COUNTIF(AA12:AA13,{"LĐ giảm","Nghỉ thai sản"}))
Nếu có từ 2 "loại" cần đếm trở lên mà dùng COUNTIF rồi cộng từng cái lại thì công thức sẽ hơi dài (dù là dể hiểu) ---> Lồng thêm SUMPRODUCT vào có thể rút ngắn được công thức

Cám ơn Thầy, nhưng em thấy có dấu ngoặc móc ({}) không phải ở ngoài mà bên trong điều kiện, vậy do cấu trúc công thức hay là công mảng (Ctrl+Shift+Enter)?

=============
Xin lỗi, em tự trả lời luôn, đó là do cấu trúc.
Xin cảm ơn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Theo mình bạn làm như thế nầy:
-Trước tiên bạn đối cột tiêu đế số sang kiểu chuổi('1,'2...,'18)
-Lập vùng điều kiện
-Dùng hàm DcountA(A11:AA13,AA11,AA17:AA19)
thi cho ra kết quả ngay!
Ở đây tôi không thấy phần đính kèm file,nếu co vấn đề hãy mail cho tôi:lndung.cg@gmail.com
 
Lần chỉnh sửa cuối:
Mình muốn hỏi hàm countif

Mình có bảng độ tuổi từ 10->60 mình muốn đếm những nguời từ độ tuổi trong khoảng 20-->30 có bao nhiêu nguời mình dùng hàm nào để làm ?
 

File đính kèm

Mình có bảng độ tuổi từ 10->60 mình muốn đếm những nguời từ độ tuổi trong khoảng 20-->30 có bao nhiêu nguời mình dùng hàm nào để làm ?
Dùng countif thử xem
=COUNTIF($B$2:$B$15,">=20") những người >=20
=COUNTIF($B$2:$B$15,">30") những người >30

Vậy ct là
=COUNTIF($B$2:$B$15,">=20") - COUNTIF($B$2:$B$15,">30")
Hay là ct
=SUMPRODUCT(($B$2:$B$15>=20)*($B$2:$B$15<=30))
 
gửi bạn KQ

bạn xem file nhé, bạn dùng hàm dsum
 

File đính kèm

Bạn cũng có thể áp dụng công thức mảng Sumproduc hoặc Sum(if())..
=SUMPRODUCT(($B$2:$B$15<=30)*($B$2:$B$15>=20))
 
Lần chỉnh sửa cuối:
Thank bạn nhiều nhé, mà bạn có thể jải thik thêm cho mình là tại sao hàm countif lại trừ ko?
 
Thank bạn nhiều nhé, mà bạn có thể jải thik thêm cho mình là tại sao hàm countif lại trừ ko?
Trời ơi!
ThuNghi giải thích rõ thế còn gì
- Bạn muốn tính tuổi từ 20 đến 30
- Vậy đêm xem có bao nhiều người từ 20 trở lên, xong trừ đi số người lớn hơn 30
Vậy thôi!
Nguyên tắc cơ bản! Nhìn là hiểu
-----------
Hic... cái này gần giống như đếm xem có bao nhiêu hạt đâu xanh, bao nhiêu hạt đậu đen có trong 1 rổ (đựng 2 loại này)
- Đếm tổng xem có bao nhiêu hạt
- Đếm số đâu đen
- Đến lúc này chả lẽ muốn tìm số hạt đậu xanh bạn lại.. đếm tiếp ---> sao không TRỪ
 
Lần chỉnh sửa cuối:
hàm countif làm được việc này không?

nhờ các anh chị giúp đở, em muốn đếm số người có năm sinh từ 1980 đến 1990 tức là >=1980 <=1990 mà làm hoài sao không được, cột năm sinh thì có nhiều năm sinh rãi rác từ 1950 đến 2008
Mong sự giúp đỡ
 
nhờ các anh chị giúp đở, em muốn đếm số người có năm sinh từ 1980 đến 1990 tức là >=1980 <=1990 mà làm hoài sao không được, cột năm sinh thì có nhiều năm sinh rãi rác từ 1950 đến 2008
Mong sự giúp đỡ
Gởi File lên bạn nhé, theo mô tả thì countif làm được.
 
nhờ các anh chị giúp đở, em muốn đếm số người có năm sinh từ 1980 đến 1990 tức là >=1980 <=1990 mà làm hoài sao không được, cột năm sinh thì có nhiều năm sinh rãi rác từ 1950 đến 2008
mong sự giúp đỡ
Hàm countif không được đâu bạn vì trong đó có cả ngày tháng năm nữa. Bạn dùng sumproduct nhé!
|
a​
|
b​
|
c​
|
1​
|
01/02/1981​
|
4​
|
=sumproduct((year(a1:a5)>=1980)*(year(a1:a5)<=1990))​
|
2​
|
02/03/1981​
| | |
3​
|
02/03/1990​
| | |
4​
|
02/03/1990​
| | |
5​
|
02/03/1992​
| | |
 
Dear all,
--------

Vẫn còn một cách nếu bạn chưa biết đến hàm SUMPRODUCT:

=COUNT(A1:A5)-(COUNTIF(A1:A5;"<1980")+COUNTIF(A1:A5;">1990"))

(Giả định A1:A5 điền giá trị năm sinh chứ không phải ngày sinh nhật)
 
nhờ các anh chị giúp đở, em muốn đếm số người có năm sinh từ 1980 đến 1990 tức là >=1980 <=1990 mà làm hoài sao không được, cột năm sinh thì có nhiều năm sinh rãi rác từ 1950 đến 2008
Mong sự giúp đỡ
Bạn dùng hàm Coutif thử xem :
PHP:
=COUNTIF(A1:A15,"<33238")-COUNTIF(A1:A15,"<29221")+1
 

File đính kèm

Cách của Hoangdanh thì mất công "nhớ" ngày nào "ăn" với số nào (phải test thử bằng cách Format Gerenal mới biết)
Cách của ThuNghi thì... dài quá
Tôi có cách này trực quan hơn:
=COUNTIF(A1:A15,"<1991/1/1")-COUNTIF(A1:A15,"<1980/1/1")
Yêu cầu DATE biểu diển theo dạng yyyy/mm/dd là ăn tiền
 
cảm ơn các anh nhiều em làm theo cách của anh Cường và anh ndn681631 đều giống nhau và đúng với dãy 1980 1991 1986 1985 1982 1999 2001 cả hai cách đều ra kết quả 4
 

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

Back
Top Bottom