nguyenmanhnam
Thành viên tiêu biểu
- Tham gia
- 24/7/10
- Bài viết
- 434
- Được thích
- 266
Trong Excel cố gắng chọn kiẻu dữ liệu đơn giản để dễ tính toán, text là text mà number ra number, làm chi trong chuỗi có số cho khó khăn thêm.Em xin nhờ mọi người giúp em bài toán tổng hợp theo điều kiện là các mã số trong dấu ngoặc (các mã số thay đổi).
Vì trình độ có hạn, em chưa giải quyết được đều phải làm thủ công, rất mong mọi người giúp đỡ
Dùng công thức này xem:Em xin nhờ mọi người giúp em bài toán tổng hợp theo điều kiện là các mã số trong dấu ngoặc (các mã số thay đổi).
Vì trình độ có hạn, em chưa giải quyết được đều phải làm thủ công, rất mong mọi người giúp đỡ
=SUMPRODUCT((COUNTIF(D3,"*"&$A$3:$A$13&"*")*$B$3:$B$13))
Cảm ơn Ndu... mình vừa học thêm được một "độc chiêu" của Sumproduct() và Countif().
Chữ số lẫn lộn. Quái thật!
Công thức gọn thì có gọn nhưng vẫn tiềm ẩn sai sót nhé! (ví dụ trong list có số 12 lại vừa có số 121 chẳng hạn)
Nói chung: Nhập liệu không theo chuẩn thì phải chấp nhận rủi ro
Xin thày nói rõ hơn, vì em thử có vấn đề gì đâu, nếu có cả 12 và 121 thì nó cộng thêm cả số lượng của 121 vào mà.
TỐI ƯU là dùng VBAThế thì gay quá thày nhỉ, có lẽ em sẽ nhập số liệu theo cách bác Ba Tê cho dễ làm.
Liệu có cách nào tối ưu trong việc bố trí dữ liệu đầu vào hơn không thày? (vì làm thế mỗi khi in em lại phải ẩn cột phụ đi)
- Chuổi Chỉ tiêu A (12,11) gì gì đó, ta sẽ tách ra, lấy từ sau dấu "(" đến trước dấu ")" (cái này công thức cũng làm được)Trước kia đọc một số bài của thày về Dic, em biết chút ít về cách dùng của nó. Tuy vậy, trước khi làm cần tách các số ra riêng biệt, xin thày hộ em bài mẫu này với ah.
Public Function Tong(Vung, Cll)
Dim Tach, d, Mg, I, CoRe, Kq
Set d = CreateObject("scripting.dictionary")
Set CoRe = CreateObject("VBScript.RegExp"): Mg = Vung.Value
For I = 1 To Vung.Rows.Count
If Not d.exists(Mg(I, 1)) Then
d.Add Mg(I, 1), Mg(I, 2)
Else
d.Item(Mg(I, 1)) = d.Item(Mg(I, 1)) + Mg(I, 2)
End If
Next I
With CoRe
.Global = True
.Pattern = "[^0-9,,]"
Tach = .Replace(Cll, "")
End With
Tach = Split(Tach, ",")
For I = LBound(Tach) To UBound(Tach)
Kq = Kq + d.Item(Val(Tach(I)))
Next I
Tong = Kq
End Function
Sub tong()
Dim data, dic As Object, iRow As Long, i As Long, item, VungDL, KQ, KQEnd As Long
Set dic = CreateObject("Scripting.Dictionary")
data = Split(Mid(Replace(Range("D3").Value, "...)", ""), InStr(Range("D3").Value, "(") + 1, 100), ",")
With Sheet1
VungDL = .Range("A3:B13").Value
ReDim KQ(1 To UBound(VungDL, 1), 1 To 2)
For iRow = 1 To UBound(VungDL, 1)
If Not dic.exists(VungDL(iRow, 1)) Then
i = i + 1
dic.item(VungDL(iRow, 1)) = i
KQ(i, 1) = VungDL(iRow, 1)
KQ(i, 2) = VungDL(iRow, 2)
Else
KQ(dic.item(VungDL(iRow, 1)), 2) = KQ(dic.item(VungDL(iRow, 1)), 2) + VungDL(iRow, 2)
End If
Next
For iRow = 1 To i
For Each item In data
If CDbl(item) = KQ(iRow, 1) Then
KQEnd = KQEnd + KQ(iRow, 2)
End If
Next
Next
.Range("E3").Value = KQEnd
End With
End Sub
=SUMPRODUCT((COUNTIF(D3,"*"&$A$3:$A$13&"*")*$B$3:$B$13))
Public Function Tong(Vung, Cll)
Dim Tach, d, Mg, I, CoRe, Kq
Set d = CreateObject("scripting.dictionary")
Set CoRe = CreateObject("VBScript.RegExp"): Mg = Vung.Value
For I = 1 To Vung.Rows.Count
If Not d.exists(Mg(I, 1)) Then
d.Add Mg(I, 1), Mg(I, 2)
Else
d.Item(Mg(I, 1)) = d.Item(Mg(I, 1)) + Mg(I, 2)
End If
Next I
With CoRe
.Global = True
.Pattern = "[^0-9,,]"
Tach = .Replace(Cll, "")
End With
Tach = Split(Tach, ",")
For I = LBound(Tach) To UBound(Tach)
Kq = Kq + d.Item(Val(Tach(I)))
Next I
Tong = Kq
End Function
Cái biến tên CoRe là chữ Cò ghép với 2 chữ đầu của RegExp chứ có gì đâu, còn cái CreateObject("VBScript.RegExp") bạn thử thì từ từ "ngâm cú" nó cho vui chứ giải thích cái này hơi "mơ huyền.....hồ", thí dụ, đọc cái này xong hổng biết bạn có hiểu hông chứ mình.....chẳng hiểu mô tê gì ráoTrong Code của thày Concogia, Dic thì em biết nhưng cái CoRe = CreateObject("VBScript.RegExp") nó là cái gì vậy?
PHP:Public Function Tong(Vung, Cll) Dim Tach, d, Mg, I, CoRe, Kq Set d = CreateObject("scripting.dictionary") Set CoRe = CreateObject("VBScript.RegExp"): Mg = Vung.Value For I = 1 To Vung.Rows.Count If Not d.exists(Mg(I, 1)) Then d.Add Mg(I, 1), Mg(I, 2) Else d.Item(Mg(I, 1)) = d.Item(Mg(I, 1)) + Mg(I, 2) End If Next I With CoRe .Global = True .Pattern = "[^0-9,,]" Tach = .Replace(Cll, "") End With Tach = Split(Tach, ",") For I = LBound(Tach) To UBound(Tach) Kq = Kq + d.Item(Val(Tach(I))) Next I Tong = Kq End Function
HícMột biểu thức RegExp ( chúng ta tạm gọi là biểu thức so mẫu hay biểu thức tìm kiếm) được dùng nhiều trong việc tìm kiếm và xử lí chuỗi.
RegExp Là Gì ?
RegExp có thể hiểu đơn giản là một biểu thức chính qui.
Khi bạn muốn tìm kiếm trong một chuỗi kí tự bạn phải dùng các "mẫu giải thích" để thực hiện việc tìm kiếm. RegExp là một cách viết các "mẫu" đó.
Một "mẫu" đơn giản nhất là một kí tự chẳng hạn : a
Một "mẫu" hoàn chỉnh và đầy đủ sẽ đòi hỏi bao gồm nhiều kí tự ,các kí hiệu thay thế sắp xếp theo một công thức đúng ...
Với các "mẫu" được viết ra bạn có thể dùng nó để xác định và tìm kiếm các vị trí trong một chuỗi và nhiều công việc khác nữa ...
.Global = True
.Pattern = "[^0-9,,]"
Huhu, mình cũng chỉ tự mò mẫm học nên.......... giải thích .....đại nhé, hông hiểu cũng chịu thôiEm vẫn còn dốt lắm chưa hiểu được các cụm từ sau
.Global,Pattern là thuộc tính gì hả thày?PHP:.Global = True .Pattern = "[^0-9,,]"
còn cái Dấu mũ (^) nữa, (lũy thừa chăng?) chắc là không phải).
Các thày giải thích giúp em với.
code chạy hết dữ liệu trong Cll tìm thằng nào thỏa điều kiện thì thay, nếu.Global = True
thì nó chạy tới chỗ đầu tiên thỏa điều kiện thì thay thế, thay xong nó nghỉ luôn, hổng đi kiếm tiếp.Global = False
Cái này lấy câu hỏi của bạn, xóa khúc giữa, thành câu trả lời cho bạn. Ngộ. Híccòn cái Dấu mũ (^) nữa, (lũy thừa chăng?) chắc là không phải).
Nôm na thì thằng này giống như điều kiện để thay thế (còn cú pháp nó thì cực kỳ "dzắc dzối", phải mò mẫm lâu lắm), như trong bài của bạn tìm trong Cll thằng nào hổng phải số & "," thì thay nó bằng ""Pattern
.Pattern = "[^0-9,,]"