Bạn xem.Nhờ các bạn viết giúp hàm như file đính kèm
Cảm ơn các bạn!
Function dem(ByVal dk As String, ByVal dk1 As String, Optional phancach As String = ";") As Long
Dim a As Long, T, i As Long
T = Split(phancach & dk1, phancach)
For i = 1 To UBound(T)
If UCase(dk) = UCase(T(i)) Then
a = a + 1
End If
Next i
dem = a
End Function
=dem(J11,$H$4)
Cảm ơn bạn @snow25 công thức đã rất chuẩn, hàm của bạn viết rất hay và ngắn gọn.Bạn xem.
Mã:Function dem(ByVal dk As String, ByVal dk1 As String, Optional phancach As String = ";") As Long Dim a As Long, T, i As Long T = Split(phancach & dk1, phancach) For i = 1 To UBound(T) If UCase(dk) = UCase(T(i)) Then a = a + 1 End If Next i dem = a End Function
Mã:=dem(J11,$H$4)
Bạn xem code nhé.Cảm ơn bạn @snow25 công thức đã rất chuẩn, hàm của bạn viết rất hay và ngắn gọn.
Nhưng mình muốn lấy dữ liệu của nhiều ô rời rạc hoặc cả mảng liên tiếp thì làm như nào?
Mong bạn giúp đỡ.
Function dem(ByVal dk As String, ParamArray mang()) As Long
Dim a As Long, T, i As Long, arr, n As Integer, j As Long
For n = LBound(mang) To UBound(mang)
arr = laymang(mang(n))
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
T = Split(";" & arr(i, j), ";")
For k = 1 To UBound(T)
If UCase(dk) = UCase(T(k)) Then
a = a + 1
End If
Next k
Next j
Next i
Next n
dem = a
End Function
Function laymang(ByVal arr As Range)
Dim arr1()
If arr.Count = 1 Then
ReDim arr1(1 To 1, 1 To 1): arr1(1, 1) = arr.Value
Else
arr1 = arr.Value
End If
laymang = arr1()
End Function
=dem(J11,H4,K6)
Không hiểu thì đem giáo chỉ vào đâu đây?Vâng về chuyên môn lập trình thì tôi không hiểu. Vậy xin cao nhân @VetMini ra tay và chỉ giáo!
Làm ngược rồi. Viết sao cho code mảng gọi code đếm chứ.Bạn xem code nhé.
Mã:Function dem(ByVal dk As String, ParamArray mang()) As Long Dim a As Long, T, i As Long, arr, n As Integer, j As Long For n = LBound(mang) To UBound(mang) arr = laymang(mang(n)) For i = 1 To UBound(arr, 1) For j = 1 To UBound(arr, 2) T = Split(";" & arr(i, j), ";") For k = 1 To UBound(T) If UCase(dk) = UCase(T(k)) Then a = a + 1 End If Next k Next j Next i Next n dem = a End Function Function laymang(ByVal arr As Range) Dim arr1() If arr.Count = 1 Then ReDim arr1(1 To 1, 1 To 1): arr1(1, 1) = arr.Value Else arr1 = arr.Value End If laymang = arr1() End Function
Mã:=dem(J11,H4,K6)
Vâng bác.Cháu cảm ơn ạ.Không hiểu thì đem giáo chỉ vào đâu đây?
Làm ngược rồi. Viết sao cho code mảng gọi code đếm chứ.
Function DemTrongO(ByVal s As String, ByVal dk As String) As Integer
Dim v
dk = UCase(dk) ' nếu đặt bên trong vòng lặp như code trên thì con toán này bị lặp lại nhiều lần
For Each v In Split(UCase(s), ";") ' ta chỉ cần đọc phần tử (không sửa đổi) cho nên không cần phải gán nó ra mảng
If v = dk Then DemTrongO = DemTrongO + 1 ' số đếm đơn giản cho nên khong cần biến trung gian
Next v
End Function
Function dem(ByVal dk As String, ParamArray mang()) As Long
...
For each O in mangGiDo
dem = dem + DemTrongO(O)
Next O
...
Bác xem cháu sửa thế này có được không ạ.Không hiểu thì đem giáo chỉ vào đâu đây?
Làm ngược rồi. Viết sao cho code mảng gọi code đếm chứ.
Function DemTrongO(ByVal s As String, ByVal dk As String) As Integer
Dim v
dk = UCase(dk) ' nếu đặt bên trong vòng lặp như code trên thì con toán này bị lặp lại nhiều lần
For Each v In Split(UCase(s), ";") ' ta chỉ cần đọc phần tử (không sửa đổi) cho nên không cần phải gán nó ra mảng
If v = dk Then DemTrongO = DemTrongO + 1 ' số đếm đơn giản cho nên khong cần biến trung gian
Next v
End Function
Function dem(ByVal dk As String, ParamArray mang()) As Long
...
For each O in mangGiDo
dem = dem + DemTrongO(O)
Next O
...
Function dem(ByVal dk As String, ParamArray mang()) As Long
Dim arr, n As Integer, s, s1
For n = LBound(mang) To UBound(mang)
arr = laymang(mang(n))
For Each s In arr
For Each s1 In Split(s, ";")
If UCase(dk) = UCase(s1) Then
dem = dem + 1
End If
Next
Next
Next n
End Function
Function laymang(ByVal arr As Range)
Dim arr1()
If arr.Count = 1 Then
ReDim arr1(1 To 1, 1 To 1): arr1(1, 1) = arr.Value
Else
arr1 = arr.Value
End If
laymang = arr1()
End Function
=dem(J11,H4,K6,K6:K7)
Có thấy sửa gì đâu mà bảo được hay không.Bác xem cháu sửa thế này có được không ạ.
Mã:Function dem(ByVal dk As String, ParamArray mang()) As Long Dim arr, n As Integer, s, s1 For n = LBound(mang) To UBound(mang) arr = laymang(mang(n)) For Each s In arr For Each s1 In Split(s, ";") If UCase(dk) = UCase(s1) Then dem = dem + 1 End If Next Next Next n End Function Function laymang(ByVal arr As Range) Dim arr1() If arr.Count = 1 Then ReDim arr1(1 To 1, 1 To 1): arr1(1, 1) = arr.Value Else arr1 = arr.Value End If laymang = arr1() End Function
Mã:=dem(J11,H4,K6,K6:K7)
Bạn @VetMini hoàn thiện giúp mình code vớiCó thấy sửa gì đâu mà bảo được hay không.
For n = LBound(mang) To UBound(mang) ' n lượt
arr = laymang(mang(n))
For Each s In arr ' m lượt
For Each s1 In Split(s, ";") ' k lượt
If UCase(dk) = UCase(s1) Then
'.. trị dk được UCase tất cả là n*m*k lượt
dem = dem + 1
End If
Next
Next
Next n
Xem codeBác xem cháu sửa thế này có được không ạ.
Mã:Function dem(ByVal dk As String, ParamArray mang()) As Long Dim arr, n As Integer, s, s1 For n = LBound(mang) To UBound(mang) arr = laymang(mang(n)) For Each s In arr For Each s1 In Split(s, ";") If UCase(dk) = UCase(s1) Then dem = dem + 1 End If Next Next Next n End Function Function laymang(ByVal arr As Range) Dim arr1() If arr.Count = 1 Then ReDim arr1(1 To 1, 1 To 1): arr1(1, 1) = arr.Value Else arr1 = arr.Value End If laymang = arr1() End Function
Mã:=dem(J11,H4,K6,K6:K7)
Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long
Dim Arr, iTem, S, iStr
Dim k As Long
Dk = UCase(Dk)
For Each Arr In ArrS
For Each iTem In Arr
S = Split(UCase(iTem), ";")
For Each iStr In S
If iStr = Dk Then k = k + 1
Next iStr
Next iTem
Next Arr
CountIfArrS = k
End Function
Cảm ơn bạn @HieuCD rất xúc tích và ngắn gọnXem code
Mã:Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long Dim Arr, iTem, S, iStr Dim k As Long Dk = UCase(Dk) For Each Arr In ArrS For Each iTem In Arr S = Split(UCase(iTem), ";") For Each iStr In S If iStr = Dk Then k = k + 1 Next iStr Next iTem Next Arr CountIfArrS = k End Function
Cảm ơn bạn @HieuCD cho mình hỏi nếu như chuỗi có dữ liệu nối với nhau bằng nhiều dấu kết hợp ví dụ như ";" và "," và "-" thì có đồng thời dùng hàm trên như nào?Xem code
Mã:Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long Dim Arr, iTem, S, iStr Dim k As Long Dk = UCase(Dk) For Each Arr In ArrS For Each iTem In Arr S = Split(UCase(iTem), ";") For Each iStr In S If iStr = Dk Then k = k + 1 Next iStr Next iTem Next Arr CountIfArrS = k End Function
Cảm ơn bạn @HieuCD cho mình hỏi nếu như chuỗi có dữ liệu nối với nhau bằng nhiều dấu kết hợp ví dụ như ";" và "," và "-" thì có đồng thời dùng hàm trên như nào?
VD: 10;11;12,13,14,15,16-17-18-19-20:ad:ac:ab
Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long
Dim Arr, iTem, S, iStr
Dim i As Long, k As Long
Dk = UCase(Dk)
For Each Arr In ArrS
For Each iTem In Arr
S = Split(UCase(Replace(Replace(Replace(iTem, ",", ";"), "-", ";"), ":", ";")), ";")
For Each iStr In S
If iStr = Dk Then k = k + 1
Next iStr
Next iTem
Next Arr
CountIfArrS = k
End Function
Trời! Cảm ơn bạn rất nhiềuMã:Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long Dim Arr, iTem, S, iStr Dim i As Long, k As Long Dk = UCase(Dk) For Each Arr In ArrS For Each iTem In Arr S = Split(UCase(Replace(Replace(Replace(iTem, ",", ";"), "-", ";"), ":", ";")), ";") For Each iStr In S If iStr = Dk Then k = k + 1 Next iStr Next iTem Next Arr CountIfArrS = k End Function
Chào bạn @HieuCD bạn cho mình làm phiền bạn chút nhéXem code
Mã:Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long Dim Arr, iTem, S, iStr Dim k As Long Dk = UCase(Dk) For Each Arr In ArrS For Each iTem In Arr S = Split(UCase(iTem), ";") For Each iStr In S If iStr = Dk Then k = k + 1 Next iStr Next iTem Next Arr CountIfArrS = k End Function
Chào bạn @HieuCD bạn cho mình làm phiền bạn chút nhé
Để tổng quát hơn khi không biết dấu phân cách như nào.
Vì vậy bạn sửa giúp mình là "Các ký tự liền nhau thì đếm"
VD: Ký tự cần tìm là "1a" trong dãy--- aaadddddđa1a45-1a;uuaa;1ak1a. thì sẽ đếm được chuỗi ký tự 1a=4
Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long
Dim Arr, iTem, n As Long, k As Long
n = Len(Dk)
Dk = UCase(Dk)
For Each Arr In ArrS
For Each iTem In Arr
k = k + (Len(iTem) - Len(Replace(UCase(iTem), Dk, "", 1))) / n
Next iTem
Next Arr
CountIfArrS = k
End Function
Rất cảm ơn bạnMã:Function CountIfArrS(ByVal Dk As String, ParamArray ArrS()) As Long Dim Arr, iTem, n As Long, k As Long n = Len(Dk) Dk = UCase(Dk) For Each Arr In ArrS For Each iTem In Arr k = k + (Len(iTem) - Len(Replace(UCase(iTem), Dk, "", 1))) / n Next iTem Next Arr CountIfArrS = k End Function
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2