khuong182018
Thành viên mới
- Tham gia
- 25/10/20
- Bài viết
- 6
- Được thích
- 1
Dùng công thức mảngỞ cột J em có thử công thức nhưng không đúng với trường hợp bôi vàng , số thùng tính ra bị sai ạ , mong anh chị giúp đỡ
=SUM(MMULT(--(MID("+"&D2,ROW($1:$30),3)="+"&{1,2,3,4,5,6,7,8,9}&"t"),ROW($1:$9)^0)*IFERROR(MID(D2,ROW($1:$30),1)-1,0))+LEN(D2)-LEN(SUBSTITUTE(D2,"+",""))+1
Cảm ơn anh ạ , hiện tại em vẫn chưa đọc hiểu đc , e sẽ tìm hiểu thêm . Cho em hỏi thêm nếu recorde thì có lấy đc macro ko hay phải tự viết mới đc , nếu tự viết có thể cho em xin đoạn code với ạDùng công thức mảngNhấn Ctrl+Shift+EnterMã:=SUM(MMULT(--(MID("+"&D2,ROW($1:$30),3)="+"&{1,2,3,4,5,6,7,8,9}&"t"),ROW($1:$9)^0)*IFERROR(MID(D2,ROW($1:$30),1)-1,0))+LEN(D2)-LEN(SUBSTITUTE(D2,"+",""))+1
Thuật toán như sau:nếu tự viết có thể cho em xin đoạn code với ạ
Function SThung(Txt As String) As Long
Dim Arr, p As Long, Tmp As Long
Txt = Replace(Txt, "pcs", "")
Arr = Split(Txt, "+")
For i = 0 To UBound(Arr)
p = InStr(1, Arr(i), "t")
If p > 0 Then
Tmp = Tmp + Left(Arr(i), p - 1)
Else
Tmp = Tmp + 1
End If
Next
SThung = Tmp
End Function
Option Explicit
Function sothung(ce As Range)
Dim sp
sp = Split(ce, "+")
For Each sp In Split(ce, "+")
If InStr(1, sp, "t*") Then
sothung = sothung + CLng(Left(sp, InStr(1, sp, "t*") - 1))
Else
sothung = sothung + 1
End If
Next
End Function
Function SoLg(Txt As String)
Dim Arr, p As Long, Tmp1 As Long, Tmp2 As Long
Txt = Replace(Txt, "pcs", "")
Arr = Split(Txt, "+")
For i = 0 To UBound(Arr)
p = InStr(1, Arr(i), "t")
If p > 0 Then
Tmp1 = Tmp1 + Left(Arr(i), p - 1)
Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 5)
Else
Tmp1 = Tmp1 + 1
Tmp2 = Tmp2 + Arr(i)
End If
Next
SoLg = Array(Tmp1, Tmp2)
End Function
=MAP(D2:D29,LAMBDA(m,LET(t,TEXTSPLIT(m,{"+"," "}),SUM(IFERROR(SIGN(t),--TEXTBEFORE(t,"t",,,,0))))))
Rảnh quá mà chưa ngủ được, làm 1 hàm mảng tính thêm số lượng
PHP:Function SoLg(Txt As String) Dim Arr, p As Long, Tmp1 As Long, Tmp2 As Long Txt = Replace(Txt, "pcs", "") Arr = Split(Txt, "+") For i = 0 To UBound(Arr) p = InStr(1, Arr(i), "t") If p > 0 Then Tmp1 = Tmp1 + Left(Arr(i), p - 1) Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 5) Else Tmp1 = Tmp1 + 1 Tmp2 = Tmp2 + Arr(i) End If Next SoLg = Array(Tmp1, Tmp2) End Function
View attachment 295936
Hàm tính ra 2 giá trị, 1 là số thùng, 2 là số pcs. Ô D2 1 thùng phải rồi.không hiểu sao solg nó ra bằng 1 ạ , a chỉ em với ạ
View attachment 296333Hàm tính ra 2 giá trị, 1 là số thùng, 2 là số pcs. Ô D2 1 thùng phải rồi.
Nếu office của bạn 2016 trở xuống thì tô khối 2 ô hàng ngang (K2:L2), gõ công thức rồi Ctrl Shift Enter, sẽ ra 1 và 21
Function SoLg(txt As String)
Dim Arr, p, q, m, n As Long, Tmp2 As Long
m = InStr(1, txt, "r")
n = InStr(1, txt, "pcs")
If m > 0 Then
txt = Replace(txt, "r", "")
End If
If n > 0 Then
txt = Replace(txt, "pcs", "")
End If
Arr = Split(txt, "+")
For i = 0 To UBound(Arr)
p = InStr(1, Arr(i), "t")
q = InStr(1, Arr(i), "k")
If p > 0 Then
If q > 0 Then
Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 5) * 1000
Else
Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 5)
End If
Else
If q > 0 Then
Tmp2 = Tmp2 + Arr(i) * 1000
Else
Tmp2 = Tmp2 + Arr(i)
End If
End If
Next
SoLg = Tmp2
End Function
Sửa như sau:Em đang tự học với kiểu chuỗi mới như vậy , "pcs',"r" nếu có thì bỏ , "k" nếu có sẽ *1000. A chỉ em lỗi sai ở đâu với ạ
Function SoLg(txt As String)
Dim Arr, p, q, m, n As Long, Tmp2 As Long
txt = Replace(txt, "r", "")
txt = Replace(txt, "pcs", "")
Arr = Split(txt, "+")
For i = 0 To UBound(Arr)
p = InStr(1, Arr(i), "t")
q = InStr(1, Arr(i), "k")
If p > 0 Then
If q > 0 Then
Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Replace(Mid(Arr(i), p + 2, 10), "k", "") * 1000
Else
Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 10)
End If
Else
If q > 0 Then
Tmp2 = Tmp2 + Replace(Arr(i), "k", "") * 1000
Else
Tmp2 = Tmp2 + Arr(i)
End If
End If
Next
SoLg = Tmp2
End Function
pcs đâu có đi với thùng được. Phải là carton, box, packet, case, parcel,....Hàm tính ra 2 giá trị, 1 là số thùng, 2 là số pcs. Ô D2 1 thùng phải rồi.
...
Vâng , e cảm ơn ạSửa như sau:
PHP:Function SoLg(txt As String) Dim Arr, p, q, m, n As Long, Tmp2 As Long txt = Replace(txt, "r", "") txt = Replace(txt, "pcs", "") Arr = Split(txt, "+") For i = 0 To UBound(Arr) p = InStr(1, Arr(i), "t") q = InStr(1, Arr(i), "k") If p > 0 Then If q > 0 Then Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Replace(Mid(Arr(i), p + 2, 10), "k", "") * 1000 Else Tmp2 = Tmp2 + Left(Arr(i), p - 1) * Mid(Arr(i), p + 2, 10) End If Else If q > 0 Then Tmp2 = Tmp2 + Replace(Arr(i), "k", "") * 1000 Else Tmp2 = Tmp2 + Arr(i) End If End If Next SoLg = Tmp2 End Function
Lý do:
- không cần biết có pcs hay không, hoặc có r hay không, cứ replace không cần If
- nếu có k thì nhân 1 000, nhưng trước khi nhân phải replace k mới trở thành số để nhân được.
Lấy tên trong file mà anh. Code tôi dùng tên hàm là tiếng Việt (Sothung, SoLg), nhưng khi diễn giải bằng lời lại không biết cụ thể món hàng gì nên không gọi là cái, cục, thỏi, miếng, ... được. Đành dùng từ chung của Mẽo.pcs đâu có đi với thùng được. Phải là carton, box, packet, case, parcel,....
Đó là một điểm nhược của tiếng Việt: không có từ danh xưng chung. Nhất là đại danh từ ngôi thứ 2, 3, 5, 6.Lấy tên trong file mà anh. Code tôi dùng tên hàm là tiếng Việt (Sothung, SoLg), nhưng khi diễn giải bằng lời lại không biết cụ thể món hàng gì nên không gọi là cái, cục, thỏi, miếng, ... được. Đành dùng từ chung của Mẽo.