1A - 2A - 3B - 4C là giá trị tương ứng của từng ô trên 1 dòng hay là ô 1 có giá trị là A, ô 2 có giá trị là A, ô 3 có giá trị là B, ô 4 có giá trị là C ??Tôi có một dòng có các ô có nội dung (Trên từng ô) lần lượt là 1A - 2A - 3B - 4C .... Làm sao để đếm được dòng đó có bao nhiêu A, B, C ???
Bạn thử code này xem sao:Đúng như ý của Sealand đấy, tuy nhiên kết quả lại không phải như ý muốn hỏi.
Làm sao đếm (hoặc cộng ...) ra được kết quả là 3A; 3B; 4C .... cơ.
{=SUM(--IF(RIGHT(A1:A6)="A",SUBSTITUTE(A1:A6,"A",""),0))&"A"}
=SUMPRODUCT(--(ISNUMBER(--SUBSTITUTE(A1:A6,"A",""))),--LEFT(A1:A6,LEN(A1:A6)-1))&"A"
Function demStr(Rg As Range) As String
Dim tam()
Dim i, j, so As Long
Dim ch, kq As String
If Rg Is Nothing Then Exit Function
ReDim tam(Rg.Cells.Count)
For i = 0 To Rg.Cells.Count - 1
tam(i) = Rg.Cells(i + 1)
Next
If Len(Join(tam, ";")) = UBound(tam) Then Exit Function
For i = 1 To UBound(tam)
If tam(i - 1) <> "" Then
so = Val(tam(i - 1))
ch = Replace(tam(i - 1), so, "")
For j = i To UBound(tam) - 1
If tam(j) Like "*" & ch Then
so = so + Val(tam(j))
tam(j) = ""
End If
Next
kq = kq & so & ch & ";"
End If
Next
demStr = Left(kq, Len(kq) - 1)
End Function
Cám ơn bạn Cadafi đã đưa ra phương án giải quyết rất hay!Bạn thử code này xem sao:
Với A1:A6 là vùng chứa dữ liệu: (Sau khi gõ công thức nhớ ấn tổ hợp phím Ctrl+Shift+Enter nha:
Hoặc không cần Ctrl+Shift+Enter cũng được, dùng công thức sau đây nhé bạn!PHP:{=SUM(--IF(RIGHT(A1:A6)="A",SUBSTITUTE(A1:A6,"A",""),0))&"A"}
Thay chữ A trong dấu nháy đôi bằng chữ bạn muốn tìmPHP:=SUMPRODUCT(--(ISNUMBER(--SUBSTITUTE(A1:A6,"A",""))),--LEFT(A1:A6,LEN(A1:A6)-1))&"A"
Xem file đính kèm nha!
Bài này anh mất đến 3 vòng lập mới ra kết quả. Nếu anh dùng Dictionary Object thì chỉ mất 1 vòng lậpMình tham gia dùng hàm UDF xem sao
Kiểm tra kết quả ở cột KPHP:Function demStr(Rg As Range) As String Dim tam() Dim i, j, so As Long Dim ch, kq As String If Rg Is Nothing Then Exit Function ReDim tam(Rg.Cells.Count) For i = 0 To Rg.Cells.Count - 1 tam(i) = Rg.Cells(i + 1) Next If Len(Join(tam, ";")) = UBound(tam) Then Exit Function For i = 1 To UBound(tam) If tam(i - 1) <> "" Then so = Val(tam(i - 1)) ch = Replace(tam(i - 1), so, "") For j = i To UBound(tam) - 1 If tam(j) Like "*" & ch Then so = so + Val(tam(j)) tam(j) = "" End If Next kq = kq & so & ch & ";" End If Next demStr = Left(kq, Len(kq) - 1) End Function
Function ConsolStr(SrcArray, Optional Sep As String = ", ") As String
Dim elm, Chw As String, Num As Double
With CreateObject("Scripting.Dictionary")
For Each elm In SrcArray
If elm <> "" And elm <> 0 And elm <> "0" Then
With CreateObject("VBScript.RegExp")
.Global = True: .Pattern = "[\d,.,]"
Chw = Mid(elm, InStr(elm, Left(.Replace(elm, ""), 1)), Len(elm))
Num = 1 * Replace(elm, Chw, "")
End With
If Not .Exists(Chw) Then
.Add Chw, Num & Chw
Else
.Item(Chw) = (1 * Replace(.Item(Chw), Chw, "") + Num) & Chw
End If
End If
Next elm
ConsolStr = Join(.Items, Sep)
End With
End Function