Kiểm tra các ký tự đầu trong chuỗi giống nhau

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
461
Được thích
20
Em chào mọi người.

Em có 1 bài toán về kiểm tra sản phẩm mà em có phác họa bởi ví dụ như file e gửi ạ.

Các sản phẩm rất nhiều, nhưng nhiều sản phẩm cùng model với nhau nhưng mã code nó chỉ khác nhau tí ti 1 số ký tự ở cuối... e muốn kiểm tra sau đó cộng dồn như sau ạ :

-1. Nếu mã sản phẩm có 2 ký tự đầu là "AB"... khi đó nó sẽ kiểm tra 4 ký tự đầu của các mã sản phẩm có 2 ký tự đầu là AB.. nếu giống nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên như ảnh ạ.

-2. Nếu mã sản phẩm có 3 ký tự đầu là QWE ... khi đó nó sẽ kiểm tra 5 ký tự đầu của các mã sản phẩm này.... nếu như nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên ạ.

Em mong mọi người giúp đỡ ạ.

Em xin cảm ơn!
 

File đính kèm

  • File.xlsm
    File.xlsm
    11.3 KB · Đọc: 9
  • Pic.png
    Pic.png
    204.1 KB · Đọc: 15
Em chào mọi người.

Em có 1 bài toán về kiểm tra sản phẩm mà em có phác họa bởi ví dụ như file e gửi ạ.

Các sản phẩm rất nhiều, nhưng nhiều sản phẩm cùng model với nhau nhưng mã code nó chỉ khác nhau tí ti 1 số ký tự ở cuối... e muốn kiểm tra sau đó cộng dồn như sau ạ :

-1. Nếu mã sản phẩm có 2 ký tự đầu là "AB"... khi đó nó sẽ kiểm tra 4 ký tự đầu của các mã sản phẩm có 2 ký tự đầu là AB.. nếu giống nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên như ảnh ạ.

-2. Nếu mã sản phẩm có 3 ký tự đầu là QWE ... khi đó nó sẽ kiểm tra 5 ký tự đầu của các mã sản phẩm này.... nếu như nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên ạ.

Em mong mọi người giúp đỡ ạ.

Em xin cảm ơn!
Chẳng hiểu bạn muốn như thế nào?
Dựa vào bảng kết quả của bạn, tôi dùng cột phụ rồi sử dụng PivotTable.
 

File đính kèm

Upvote 0
Chẳng hiểu bạn muốn như thế nào?
Dựa vào bảng kết quả của bạn, tôi dùng cột phụ rồi sử dụng PivotTable.
Dạ e cảm ơn anh.

Nhưng trong file của em như đính kèm không dung dc Pivot ạ.

Em xin phép trình bày lại :

1. Nó sẽ chạy và kiểm tra những mã sản phẩm có 2 ký tự đầu là "AB"... kiểm tra tiếp 4 ký tự đầu của các sản phẩm đó mà giống nhau thì sẽ cộng dồn lại Quantity và % như hình ạ.

2. Nó sẽ chạy và kiểm tra những mã sản phẩm có 3 ký tự đầu là "QWE"... kiểm tra tiếp 5 ký tự đầu của các sản phẩm đó mà giống nhau thì sẽ cộng dồn lại Quantity và % như hình ạ.

Anh chưa hiểu chỗ nào để e trình bày rõ them ạ ?
 

File đính kèm

  • File.xlsm
    File.xlsm
    16.6 KB · Đọc: 8
  • Pic.png
    Pic.png
    203.3 KB · Đọc: 12
Upvote 0
Dạ.

Em có làm đoạn code như này nhưng đang chưa biết làm tnao để nó chỉ "Sum" tại dòng đầu tiên của các mã sản phẩm được tìm thấy mà thõa mãn điều kiện.

lRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lRow
For i1 = i + 1 To lRow

If Left(Cells(i, 1), 2) = "AB" And Left(Cells(i1, 1), 2) = "AB" Then

If Left(Cells(i, 1), 4) = Left(Cells(i1, 1), 4) Then

'' Sum Code

End If

End If

Next i1
Next i
 
Upvote 0
Mã:
D2=(COUNTIF($A$2:$A2,LEFT($A2,5-(FIND("-",$A2)<>4))&"*")=1)*SUMIF($A$2:$A$11,LEFT($A2,5-(FIND("-",$A2)<>4))&"*",B$2:B$11)
'Chép cho cả 2 cột
 
Upvote 0
Mã:
D2=(COUNTIF($A$2:$A2,LEFT($A2,5-(FIND("-",$A2)<>4))&"*")=1)*SUMIF($A$2:$A$11,LEFT($A2,5-(FIND("-",$A2)<>4))&"*",B$2:B$11)
'Chép cho cả 2 cột
Gửi anh.

Em cảm ơn anh nhưng trong file data nó thay đổi liên tục và không cố định dòng để mình đặt công thức cố định được như vậy ạ.

Em muốn code để nó tìm được các cell có điều kiện thỏa mãn đưa ra rồi Sum lại tại vị trí đầu tiên như ảnh ạ.
 

File đính kèm

  • Pic.png
    Pic.png
    203.3 KB · Đọc: 15
Upvote 0
trong file data nó thay đổi liên tục và không cố định dòng để mình đặt công thức cố định được
Từ đầu tới đây, từ trên xuống dưới chưa thấy chỗ nào nêu thay đổi gì cả. Muốn viết code thì cũng bó tay với cái thay đổi không rõ ràng kia.
 
Upvote 0
Từ đầu tới đây, từ trên xuống dưới chưa thấy chỗ nào nêu thay đổi gì cả. Muốn viết code thì cũng bó tay với cái thay đổi không rõ ràng kia.
Dạ em chạy thử formula của anh thấy ổn ạ.

Tuy nhiên nếu được e rất mong anh hỗ trợ e đoạn code VB cho bài toán này ạ.

Dữ lieu liên tục thay đổi nên nó sẽ tìm ra các cells mà thỏa mã điều kiện, sau đó sẽ Sum lại tại ví trí cell đầu tiên.... nó giống với kết quả mà formula của anh chạy ra ạ.

E cảm ơn anh!
Bài đã được tự động gộp:

Vì trong file có nhiều mã sản phẩm.. có những mã tận 7-8 ký tự đầu giống nhau. Nên e cần đặt điều kiện theo từng mã cho bài toán này ạ.

Ví dụ như:

- Sẽ chạy cả cột A để tìm ra những mã sản phẩm mà có 4 ký tự đầu giống nhau trong đó 2 ký tự đầu là "AB" .. sau đó Sum lại cell đầu tiên thỏa mãn điều kiện như thế
- Sẽ chạy cả cột A để tìm ra những mã sản phẩm mà có 5 ký tự đầu giống nhau trong đó 3 ký tự đầu là "QWE" .. sau đó Sum lại cell đầu tiên thỏa mãn điều kiện như thế
 
Upvote 0
...
Vì trong file có nhiều mã sản phẩm.. có những mã tận 7-8 ký tự đầu giống nhau. Nên e cần đặt điều kiện theo từng mã cho bài toán này ạ.

Ví dụ như:

- Sẽ chạy cả cột A để tìm ra những mã sản phẩm mà có 4 ký tự đầu giống nhau trong đó 2 ký tự đầu là "AB" .. sau đó Sum lại cell đầu tiên thỏa mãn điều kiện như thế
- Sẽ chạy cả cột A để tìm ra những mã sản phẩm mà có 5 ký tự đầu giống nhau trong đó 3 ký tự đầu là "QWE" .. sau đó Sum lại cell đầu tiên thỏa mãn điều kiện như thế
Lập ra một bảng mã và quy luật để tìm đi rồi mới hy vọng giúp được.
Ít nhất bạn cũng phải xác định được điều kiện của mình theo một tuần tự có lô gic. Code sẽ đọc cái bảng điều kiện ấy để làm việc.
 
Upvote 0
Lập ra một bảng mã và quy luật để tìm đi rồi mới hy vọng giúp được.
Ít nhất bạn cũng phải xác định được điều kiện của mình theo một tuần tự có lô gic. Code sẽ đọc cái bảng điều kiện ấy để làm việc.
Gửi anh.

Dạ em thấy nó cũng có logic anh ạ.

Ví dụ như e làm đoạn code bên dưới để :

Bước1: Tìm các sản phẩm có 2 ký tự đầu là AB
Bước2: Với các sản phẩm đó, thì tìm ra các sản phẩm có 4 ký tự đầu giống nhau

Nhưng em đang không biết cách để Sum giá trị tại vị trí đầu tiên tìm được với mỗi trường hợp ạ.

Anh xem giúp em với ạ.

Em xin cảm ơn!

lRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lRow
For i1 = i + 1 To lRow

If Left(Cells(i, 1), 2) = "AB" And Left(Cells(i1, 1), 2) = "AB" Then
If Left(Cells(i, 1), 4) = Left(Cells(i1, 1), 4) Then

End If
End If

Next i1
Next i
 
Upvote 0
Tôi không hỏi code. Tôi hỏi cái bảng tra điều kiện.

...
Vì trong file có nhiều mã sản phẩm.. có những mã tận 7-8 ký tự đầu giống nhau. Nên e cần đặt điều kiện theo từng mã cho bài toán này ạ.
...
Cả đống điều kiện mà không có bảng tra thì code dài khoảng cây số.

...
-1. Nếu mã sản phẩm có 2 ký tự đầu là "AB"... khi đó nó sẽ kiểm tra 4 ký tự đầu của các mã sản phẩm có 2 ký tự đầu là AB.. nếu giống nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên như ảnh ạ.

-2. Nếu mã sản phẩm có 3 ký tự đầu là QWE ... khi đó nó sẽ kiểm tra 5 ký tự đầu của các mã sản phẩm này.... nếu như nhau thì sẽ cộng dồn Quantity và % vào sản phẩm đầu tiên ạ.
...
Ở đây nói 4-5 ký tự đầu. Ở trên kia nói 7-8 ký tự đầu.
Lô gic của bài toán bạn chưa nắm vững.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không hỏi code. Tôi hỏi cái bảng tra điều kiện.


Cả đống điều kiện mà không có bảng tra thì code dài khoảng cây số.


Ở đây nói 4-5 ký tự đầu. Ở trên kia nói 7-8 ký tự đầu.
Lô gic của bài toán bạn chưa nắm vững.
Dạ. Em muốn chỉ cần 1 ví dụ cho 1 điều kiện như dưới, sau đó em sẽ tự mở rộng sau ạ.

1. Code sẽ chạy từ A2 đến A1000, nó sẽ kiểm tra các mã code mà có 4 ký tự đầu giống nhau.. trong đó 2 ký tự đầu phải là "AB".... khi đó nó sẽ Sum Quantity và % Total lại ạ. Và giá trị Sum này sẽ đặt ở vị trí đầu tiên như trong ảnh ạ.

Em đã làm được điều kiện là kiểm tra 4 ký tự đầu tiên giống nhau, trong đó có 2 ký tự đầu là "AB" rồi ạ.... nhưng sau đó thì em chưa biết Sum thế nào. Mong anh giúp đỡ em đoạn tiếp theo ạ.

lRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lRow
For i1 = i To lRow

'' Check 4 ky tu dau giong nhau, trong do co 2 ky tu dau la AB

If Left(Cells(i, 1), 2) = "AB" And Left(Cells(i1, 1), 2) = "AB" Then
If Left(Cells(i, 1), 4) = Left(Cells(i1, 1), 4) Then

'''''' Code để Sum sẽ nằm ở đây

End If
End If

Anh lấy file excel ở đầu bài post của em nhé.

Em cảm ơn anh!
 

File đính kèm

  • Pic.png
    Pic.png
    203.3 KB · Đọc: 7
Upvote 0
Dạ. Em muốn chỉ cần 1 ví dụ cho 1 điều kiện như dưới, sau đó em sẽ tự mở rộng sau ạ.

1. Code sẽ chạy từ A2 đến A1000, nó sẽ kiểm tra các mã code mà có 4 ký tự đầu giống nhau.. trong đó 2 ký tự đầu phải là "AB".... khi đó nó sẽ Sum Quantity và % Total lại ạ. Và giá trị Sum này sẽ đặt ở vị trí đầu tiên như trong ảnh ạ.
Bạn thử Sub này, chỉ 2 điều kiện "AB*" và "QWE*".
Muốn thêm "quá nhiều điều kiện" nữa thì bạn tự "mở rộng".
PHP:
Option Explicit

Public Sub sGpe()
Dim Dic As Object, sArr(), dArr(), I As Long, R As Long, Rw As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
    sArr = Range("A2", Range("A1000000").End(xlUp)).Resize(, 3).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
    For I = 1 To R
        If sArr(I, 1) Like "AB*" Then
            Txt = Left(sArr(I, 1), 4)
        ElseIf sArr(I, 1) Like "QWE*" Then
            Txt = Left(sArr(I, 1), 5)
        End If
        If Not Dic.Exists(Txt) Then
            Dic.Item(Txt) = I
            dArr(I, 1) = sArr(I, 2)
            dArr(I, 2) = sArr(I, 3)
        Else
            Rw = Dic.Item(Txt)
            dArr(Rw, 1) = dArr(Rw, 1) + sArr(I, 2)
            dArr(Rw, 2) = dArr(Rw, 2) + sArr(I, 3)
        End If
    Next I
Range("D2").Resize(10000, 2).ClearContents
Range("D2").Resize(R, 2) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn thử Sub này, chỉ 2 điều kiện "AB*" và "QWE*".
Muốn thêm "quá nhiều điều kiện" nữa thì bạn tự "mở rộng".
PHP:
Option Explicit

Public Sub sGpe()
Dim Dic As Object, sArr(), dArr(), I As Long, R As Long, Rw As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
    sArr = Range("A2", Range("A1000000").End(xlUp)).Resize(, 3).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
    For I = 1 To R
        If sArr(I, 1) Like "AB*" Then
            Txt = Left(sArr(I, 1), 4)
        ElseIf sArr(I, 1) Like "QWE*" Then
            Txt = Left(sArr(I, 1), 5)
        End If
        If Not Dic.Exists(Txt) Then
            Dic.Item(Txt) = I
            dArr(I, 1) = sArr(I, 2)
            dArr(I, 2) = sArr(I, 3)
        Else
            Rw = Dic.Item(Txt)
            dArr(Rw, 1) = dArr(Rw, 1) + sArr(I, 2)
            dArr(Rw, 2) = dArr(Rw, 2) + sArr(I, 3)
        End If
    Next I
Range("D2").Resize(10000, 2).ClearContents
Range("D2").Resize(R, 2) = dArr
Set Dic = Nothing
End Sub
Em cảm ơn anh rất nhiều ạ... đúng mong muốn của em rồi. Em sẽ chỉnh lại cho phù hợp với bài toán của em ạ.

Một lần nữa cảm anh anh cùng mọi người rất nhiều ạ.

Chúc mọi người cuối tuần vui vẻ!
 
Upvote 0
For I = 1 To R
If sArr(I, 1) Like "AB*" Then
Txt = Left(sArr(I, 1), 4)
ElseIf sArr(I, 1) Like "QWE*" Then
Txt = Left(sArr(I, 1), 5)
End If
' nếu sArr(I, 1) không thoả cả "AB*" và "QWE*" thì Txt sẽ giữ lại trị trước đó
' và nó vẫn cộng tổng vào cái trị trước đó.
' và kết quả là tất cả các dòng sẽ được tổng thành 3 loại mã. Loại "", "AB%%", và loại "QWE%%"

If Not Dic.Exists(Txt) Then
Dic.Item(Txt) = I
dArr(I, 1) = sArr(I, 2)
dArr(I, 2) = sArr(I, 3)
Else
Rw = Dic.Item(Txt)
dArr(Rw, 1) = dArr(Rw, 1) + sArr(I, 2)
dArr(Rw, 2) = dArr(Rw, 2) + sArr(I, 3)
End If
Next I
.
Nếu tất cả mã đều hoặc "AB*", hoặc "QWE*" thì code mới chạy đúng.

Chú: cách dễ nhất để sửa là thêm:
...Else Txt = ""
và If Txt <> "" Then...
 
Upvote 0
Web KT

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

Back
Top Bottom