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 .