Nhờ anh chị giúp viết công thức tính số lượng trong chuỗi

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

khuong182018

Thành viên mới
Tham gia
25/10/20
Bài viết
6
Được thích
1
Ở 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 đỡ
 

File đính kèm

  • 123.xlsm
    18.4 KB · Đọc: 27
Ở 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 đỡ
Dùng công thức mảng
Mã:
=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
Nhấn Ctrl+Shift+Enter
 

File đính kèm

  • 123.xlsm
    18.6 KB · Đọc: 21
Upvote 0
Dùng công thức mảng
Mã:
=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
Nhấn Ctrl+Shift+Enter
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 ạ
 
Upvote 0
nếu tự viết có thể cho em xin đoạn code với ạ
Thuật toán như sau:
- Loại bỏ khoảng trắng và chuỗi "pcs"
- Split chuỗi với ký tự phân cách là dấu cộng, sẽ được 1 mảng 1 chiều Arr
- Đặt 1 biến tạm tmp. Duyệt qua từng thành phần của mảng:
- Dùng hàm instr xem có chữ "t":
- Nếu có lấy chuỗi n bên trái chữ t: tmp = tmp + n
- Nếu không: tmp = tmp + 1
Kết quả cuối là tmp
 
Upvote 0
Hàm tự tạo như sau:

PHP:
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
1697768353216.png
 
Upvote 0
1 cách khác dùng UDF.

PHP:
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
 
Upvote 0
Bạn thử thêm công thức
Mã:
J2=SUMPRODUCT(ISNUMBER(FIND(ROW($A$1:$A$10)&"t";D2))*ROW($A$1:$A$10))+SUMPRODUCT((LEN(D2)-LEN(SUBSTITUTE(D2;{"t";"+"};"")));{-1;1})+1
 
Upvote 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

1697817640061.png
 
Upvote 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
1698066663205.png
không hiểu sao solg nó ra bằng 1 ạ , a chỉ em với ạ
 
Upvote 0
không hiểu sao solg nó ra bằng 1 ạ , a chỉ em với ạ
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.
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
 
Upvote 0
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.
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
View attachment 296333
Mã:
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
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 ạ
 
Upvote 0
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 ạ
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.
 
Upvote 0
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.
Vâng , e cảm ơn ạ
 
Upvote 0
pcs đâu có đi với thùng được. Phải là carton, box, packet, case, parcel,.... -.,\;
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.
 
Upvote 0
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.
Đó 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.
- you (tiếng Hán là nhĩ)
- he/her (tiếng Hán là tha)
- piece (tiếng Hán không có)
...

Đối với hàng hóa thì có thể tạm gọi "cái". Trừ một vài trường hợp đặc biệt, như "món", "chiếc"

Chú thích cho bạn nào thích học tiếng Anh:
Từ piece rộng đến mức áp dụng vào trái cây thì có nghĩa là "quả" - đừng hiểu lầm là mẫu, miếng.
A piece of fruit = một quả (cam táo lê chuối gì gì đó)
VD. An apple is a piece of fruit.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom