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
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?!
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
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
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
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 = 4 và vung.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 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 = 4 và vung.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.
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
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 .
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 .
Đú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.
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))
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
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]
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)
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
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
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
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à!
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à!
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 ạ
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 đó)
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.
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
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!
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_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! 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!
Có thể em hiểu sai ý chăng??!?! 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.
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!??
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 ạ??
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:
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
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 đỡ
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
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!?!
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
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
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
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...
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....
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
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
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ự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.
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.
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.
Đồ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ỉ
???
Đồ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à
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.
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
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
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
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.
Đâ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.
+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.
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.
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 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....
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.
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
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.
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
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Ừ
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 đỡ
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 đỡ
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