So sánh các khoảng giá trị theo hàng (1 người xem)

  • Thread starter Thread starter switch93
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

switch93

Thành viên chính thức
Tham gia
11/8/15
Bài viết
51
Được thích
0
Em nhờ các bác viết code cho bài toán sau:

B1: các bác lấy tất cả 2 ô kế tiếp nhau có giá trị là A trong 1 hàng (của mã hàng)làm mốc nhập rồi so sánh mốc hay chính so sánh các đoạn [AA:AA] với nhau
B2: sau khi có được giá tri so sánh có [AA:AA] Max rồi tô màu đoạn đó và khoảng ô trống ngay sau đó gần nhất.
B3: Tìm mốc cuối cùng có 2 ô liên tiếp có giá trị A
Lưu ý : Trong bài toán này các bác có thể hiểu A có thể là chữ có thể là số thay đổi tùy ý.

em có gửi file đính kèm mong các xem và giúp đỡ.
Bác doveandrose, BaTe, let's gâu gâu.. Qua giúp em.
Cảm ơn GPE, cảm ơn các bác !
 

File đính kèm

Vâng bác. bác coi phần lọc đó giúp em đc k?
 
Upvote 0
tìm max sau [A-XY] = NN
Mã:
=maxXY(B3:NK3,"A","XY",3,NN3)

Mã:
Public Function maxXY(sourceRG As Range, fromStr As String, toStr As String, _
Optional ByVal countType As Byte = 1, Optional ByVal countDist As Long = -1) As Long
Dim hisT(1 To 3) As String, arr As Variant, matHead As Boolean, tempCount As Long
Dim c As Long, maxCount As Long, afterMax As Long, isAfter As Boolean, uc As Long


arr = sourceRG.Resize(, sourceRG.Columns.Count + 1).Value
uc = UBound(arr, 2)
arr(1, uc) = ""
For c = 1 To uc Step 1
    If arr(1, c) = "" Then
        If hisT(3) = Right(toStr, 1) And hisT(2) = Mid(toStr, 3 - Len(toStr), 1) And _
        hisT(3 - Len(toStr)) = "" And matHead Then
             If maxCount < tempCount Or countType = 3 Then
                 maxCount = tempCount
                 If countType <> 3 Or countDist = tempCount Then isAfter = True
                 If countType <> 3 Then afterMax = 0
             End If
        End If
        
        If hisT(3) = Right(fromStr, 1) And hisT(2) = Mid(fromStr, 3 - Len(fromStr), 1) And _
        hisT(3 - Len(fromStr)) = "" Then
            matHead = True
        Else
            If Not hisT(3) = "" Then matHead = False
        End If
        
        If hisT(3) <> "" Then tempCount = 0
        If c = uc And isAfter And (countType <> 3 Or afterMax < tempCount) Then afterMax = tempCount
        tempCount = tempCount + 1
    ElseIf isAfter Then
        If countType <> 3 Or afterMax < tempCount Then afterMax = tempCount
        isAfter = False
    End If
    hisT(1) = hisT(2): hisT(2) = hisT(3): hisT(3) = arr(1, c)
Next
maxXY = IIf(countType = 1, maxCount, afterMax)
End Function
 
Upvote 0
Bác chưa hiểu ý em rồi. Ô NN1 em chon giá trị 3 thì tìm theo hàng tất cả các khoảng là A=>XY là 3 còn hàng nào k có bỏ. sau đó tìm khoảng giá trị sau giá trị tùy chọn đó. Giống như bài toán kia, nhưng là lọc các giá trị tùy thích bác ah!
 
Upvote 0
Bác chưa hiểu ý em rồi. Ô NN1 em chon giá trị 3 thì tìm theo hàng tất cả các khoảng là A=>XY là 3 còn hàng nào k có bỏ. sau đó tìm khoảng giá trị sau giá trị tùy chọn đó. Giống như bài toán kia, nhưng là lọc các giá trị tùy thích bác ah!

e2445fbab407be61d533360ad2d9ea41.png



5c15124076a6b9812667f688c8205815.png
 
Upvote 0
Qua quá trình sử dụng em thấy vẫn còn sót lại vài trường hợp bác doveandrose xem xét giúp e.
vẫn làm bài toán cũ nhưng bài toán :
Theo ý kiến của bác em cũng khiếu nại 3 bài toán cùng dạng bài này.

Bài Toán 1:
Bài toán Xuôi như sau tìm và so sánh các khoảng [A:XYZ] (điều kiện trước và sau A trống, A, X, Yvà Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc theo các khoảng theo ý bên cạnh như file mô tả tại sheets1.
Tương tự như bài toán xuôi ta có bài toán ngược [XYZ:A] (điều kiện trước và sau XY trống, A, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc theo các khoảng theo ý bên cạnh như file mô tả tại sheets2.

Bài Toán 2:
Bài toán Xuôi như sau tìm và so sánh các khoảng [AB:XYZ] (điều kiện trước và sau A,B kế tiếp trống, A,B, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.
Tương tự như bài toán xuôi ta có bài toán ngược [XYZ:AB] (điều kiện trước và sau XYZ trống, A,B, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.

Bài Toán 3:
Bài toán Xuôi như sau tìm và so sánh các khoảng [AB:XY] (điều kiện trước và sau A,B kế tiếp trống, A,B, X, Y có thể là chữ tùy ý. X, Y là 2 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.

Nếu có điều gì còn vướng mắc bác cứ ý kiến em biết. Em sẽ gửi file 2 bài toán sau bác thông cảm!
Cảm ơn GPE, Cảm ơn bác Doveandrose đã giúp đỡ!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ GPE, nhờ bác doveandrose qua coi giúp em giải quyết bài toán đó.
Cảm ơn mọi người quan tâm và giúp đỡ!
 
Upvote 0
Em chưa hiểu lắm bác ah!
Bạn di chuột trái vào vùng phía dưới đường kẻ ngang của bài #28 sẽ thấy những chữ tàng hình đó hiện ra.
Anh Doveandrose này hay "lừa tình" lắm đấy, làm việc với anh ấy bạn phải thật tỉnh táo vào....:-=:-=:-=
 
Upvote 0
Qua quá trình sử dụng em thấy vẫn còn sót lại vài trường hợp bác doveandrose xem xét giúp e.
vẫn làm bài toán cũ nhưng bài toán :
Theo ý kiến của bác em cũng khiếu nại 3 bài toán cùng dạng bài này.

Bài Toán 1:
Bài toán Xuôi như sau tìm và so sánh các khoảng [A:XYZ] (điều kiện trước và sau A trống, A, X, Yvà Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc theo các khoảng theo ý bên cạnh như file mô tả tại sheets1.
Tương tự như bài toán xuôi ta có bài toán ngược [XYZ:A] (điều kiện trước và sau XY trống, A, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc theo các khoảng theo ý bên cạnh như file mô tả tại sheets2.

Bài Toán 2:
Bài toán Xuôi như sau tìm và so sánh các khoảng [AB:XYZ] (điều kiện trước và sau A,B kế tiếp trống, A,B, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.
Tương tự như bài toán xuôi ta có bài toán ngược [XYZ:AB] (điều kiện trước và sau XYZ trống, A,B, X, Y và Z có thể là chữ tùy ý. X, Y và Z là 3 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.

Bài Toán 3:
Bài toán Xuôi như sau tìm và so sánh các khoảng [AB:XY] (điều kiện trước và sau A,B kế tiếp trống, A,B, X, Y có thể là chữ tùy ý. X, Y là 2 ô kế tiếp nhau) sau đó lọc tương tự như bài toán trên.

Nếu có điều gì còn vướng mắc bác cứ ý kiến em biết. Em sẽ gửi file 2 bài toán sau bác thông cảm!
Cảm ơn GPE, Cảm ơn bác Doveandrose đã giúp đỡ!

cú pháp không có gì thay đổi , đem về chạy thử

Mã:
Public Function maxXY(sourceRG As Range, ByVal fromStr As String, ByVal toStr As String, _
Optional ByVal countType As Byte = 1, Optional ByVal countDist As Long = -1) As Long
Dim hisT, arr As Variant, matHead As Boolean, tempCount As Long, sTmp As String
Dim c As Long, maxCount As Long, afterMax As Long, isAfter As Boolean, uc As Long
Dim lenFromStr As Long, lenToStr As Long, i As Byte, ubHist As Long


ReDim hisT(1 To WorksheetFunction.Max(Len(fromStr) + 2, Len(toStr) + 2))
ubHist = UBound(hisT)
sTmp = ";"
For c = 1 To Len(fromStr) Step 1
    sTmp = sTmp & ";" & Mid(fromStr, c, 1)
Next
fromStr = sTmp: lenFromStr = Len(fromStr)
sTmp = ";"
For c = 1 To Len(toStr) Step 1
    sTmp = sTmp & ";" & Mid(toStr, c, 1)
Next
toStr = sTmp: lenToStr = Len(toStr)


arr = sourceRG.Resize(, sourceRG.Columns.Count + 1).Value
uc = UBound(arr, 2)
arr(1, uc) = ""
For c = 1 To uc Step 1
    If arr(1, c) = "" Then
        sTmp = Join(hisT, ";")
        If Right(sTmp, Len(fromStr)) = fromStr Then
            matHead = True
        Else
            If Right(sTmp, Len(toStr)) = toStr And matHead Then
                 If maxCount < tempCount Or countType = 3 Then
                     maxCount = tempCount
                     If countType <> 3 Or countDist = tempCount Then isAfter = True
                     If countType <> 3 Then afterMax = 0
                 End If
                 
            End If
            If Not hisT(ubHist) = "" Then matHead = False
        End If
        If Not hisT(ubHist) = "" Then tempCount = 0
         [COLOR=#000000]If c = uc And isAfter And (countType <> 3 Or afterMax < tempCount) Then afterMax = tempCount[/COLOR]
        tempCount = tempCount + 1
    Else
        If isAfter Then
            If countType <> 3 Or afterMax < tempCount Then afterMax = tempCount
            isAfter = False
        End If
    End If
    For i = 1 To ubHist - 1 Step 1
        hisT(i) = hisT(i + 1)
    Next
    hisT(ubHist) = arr(1, c)
Next
maxXY = IIf(countType = 1, maxCount, afterMax)
End Function
 
Upvote 0
Gì thế Diễm. Chữ ký của anh Đỗ Văn Hồng chỉ là cái Note khi cần mà lấy ra thôi...Anh ấy khó nhớ mấy cái câu cửa Miệng đó (nói trắng ra là không nhớ nỗi mà gõ)...Nên anh ấy cố tình để ở dứoi đó thôi... Chứ có gì là bí mật & lừa tềnh đâu Diễm ơi!--=0--=0--=0--=0--=0

Thế mà em tưởng đó là gợi ý ảnh viết ra giúp bạn chủ thớt kia chứ >>>hóa ra là takeNote à....Chắc là có 1 sự hiểu nhầm "nhẹ" ở đây .. Sorry sorry ...
Mà cha nội này chả cũng chơi trội quá cơ... takeNote thường thường người ta hay ghi nét to màu đậm còn cha này chả cho "tàng hình " luôn ....
 
Lần chỉnh sửa cuối:
Upvote 0
cú pháp không có gì thay đổi , đem về chạy thử

Mã:
Public Function maxXY(sourceRG As Range, ByVal fromStr As String, ByVal toStr As String, _
Optional ByVal countType As Byte = 1, Optional ByVal countDist As Long = -1) As Long
Dim hisT, arr As Variant, matHead As Boolean, tempCount As Long, sTmp As String
Dim c As Long, maxCount As Long, afterMax As Long, isAfter As Boolean, uc As Long
Dim lenFromStr As Long, lenToStr As Long, i As Byte, ubHist As Long


ReDim hisT(1 To WorksheetFunction.Max(Len(fromStr) + 2, Len(toStr) + 2))
ubHist = UBound(hisT)
sTmp = ";"
For c = 1 To Len(fromStr) Step 1
    sTmp = sTmp & ";" & Mid(fromStr, c, 1)
Next
fromStr = sTmp: lenFromStr = Len(fromStr)
sTmp = ";"
For c = 1 To Len(toStr) Step 1
    sTmp = sTmp & ";" & Mid(toStr, c, 1)
Next
toStr = sTmp: lenToStr = Len(toStr)


arr = sourceRG.Resize(, sourceRG.Columns.Count + 1).Value
uc = UBound(arr, 2)
arr(1, uc) = ""
For c = 1 To uc Step 1
    If arr(1, c) = "" Then
        sTmp = Join(hisT, ";")
        If Right(sTmp, Len(fromStr)) = fromStr Then
            matHead = True
        Else
            If Right(sTmp, Len(toStr)) = toStr And matHead Then
                 If maxCount < tempCount Or countType = 3 Then
                     maxCount = tempCount
                     If countType <> 3 Or countDist = tempCount Then isAfter = True
                     If countType <> 3 Then afterMax = 0
                 End If
                 
            End If
            If Not hisT(ubHist) = "" Then matHead = False
        End If
        If Not hisT(ubHist) = "" Then tempCount = 0
         [COLOR=#000000]If c = uc And isAfter And (countType <> 3 Or afterMax < tempCount) Then afterMax = tempCount[/COLOR]
        tempCount = tempCount + 1
    Else
        If isAfter Then
            If countType <> 3 Or afterMax < tempCount Then afterMax = tempCount
            isAfter = False
        End If
    End If
    For i = 1 To ubHist - 1 Step 1
        hisT(i) = hisT(i + 1)
    Next
    hisT(ubHist) = arr(1, c)
Next
maxXY = IIf(countType = 1, maxCount, afterMax)
End Function

bác doveandrose xem cho em cái hàm cho mỗi bài. Giúp em
cảm ơn bác nhiệt tình giúp đỡ.
 
Upvote 0
switch93 lại post file xls kiểm tra kiểu gì, chị nhiệt tình quá đấy, nghỉ đi cho đẹp
có kiểm tra được hay không tự tôi biết mà , đâu cần người khác phải thẩm định
có nghỉ đi cho đẹp hay không tự tôi cũng có chủ kiến , không cần đợi người khác chọt vào
 
Upvote 0
Web KT

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

Back
Top Bottom