Lọc Tìm Khoảng thời gian nhập hàng và sau đó nhập (1 người xem)

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 là thành viên mới nên chưa biết nhiều mong các bác chỉ bảo
Em có bài toán: Dựa vào mốc nhập hàng lọc tìm khoảng thời gian bao lâu nhập tiếp. các bước bài toán như sau:

B1: các bác lấy tất cả 2 ô kế tiếp nhau có giá trị A và A trong 1 hàng (của mã hàng)làm mốc nhập rồi so sánh mốc nhập xa nhất có thể để đưa ra giá trị nhập sau đó.

B2: sau khi có được giá tri nhập xa nhất, các bác cho em cái giá trị nhập ngay sau đó gần nhất.(Mốc đó nhiều lúc so sánh với chính mốc kế tiếp ví dụ AA:A….AA:A)

B3: Tìm mốc cuối cùng hiện chưa nhập(như mô tả file)

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 ý.

Bài Toán có phần phức tạp các bác xem không hiều cứ cho e ý kiến.

Em có gửi kèm file mô tả.
Xin Cảm ơn GPE!
 

File đính kèm

(1) Theo mình, bạn nên xoay dữ liệu lại: Hàng thành cột; Cột thành hàng.

(2) Bạn nên nếu kết quả của từng bước với 1 một mặt hàng nào đó.
Có vậy mới nhanh có câu trả lời.

)*&^) )*&^) )*&^)
 
Upvote 0
Em là thành viên mới nên chưa biết nhiều mong các bác chỉ bảo
Em có bài toán: Dựa vào mốc nhập hàng lọc tìm khoảng thời gian bao lâu nhập tiếp. các bước bài toán như sau:

B1: các bác lấy tất cả 2 ô kế tiếp nhau có giá trị A và A trong 1 hàng (của mã hàng)làm mốc nhập rồi so sánh mốc nhập xa nhất có thể để đưa ra giá trị nhập sau đó.

B2: sau khi có được giá tri nhập xa nhất, các bác cho em cái giá trị nhập ngay sau đó gần nhất.(Mốc đó nhiều lúc so sánh với chính mốc kế tiếp ví dụ AA:A….AA:A)

B3: Tìm mốc cuối cùng hiện chưa nhập(như mô tả file)

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 ý.

Bài Toán có phần phức tạp các bác xem không hiều cứ cho e ý kiến.

Em có gửi kèm file mô tả.
Xin Cảm ơn GPE!

số 2 để bạn mô tả hay nó là số liệu trong cái bảng đó vậy?
 
Upvote 0
(1) Theo mình, bạn nên xoay dữ liệu lại: Hàng thành cột; Cột thành hàng.

(2) Bạn nên nếu kết quả của từng bước với 1 một mặt hàng nào đó.
Có vậy mới nhanh có câu trả lời.

)*&^) )*&^) )*&^)
với bài toán này đặt cột hay hàng như nhau mà bác. hihi( nhưng nếu bác muốn dễ nhìn bác thử copy thành cột coi xem sao)
 
Upvote 0
Chào bác!
nó là số liệu bảng đó bác let'gâu gâu ah!

Giải thích vẫn chưa rõ, đề nghị kết quả mẫu có giải thích là con số đó là tính từ ô nào đến ô nào trong hàng, lý do?
Đếm ô trống giữa AA............A, Còn kiểu A2.................2, hay AA...............2, hay gì gì khác thì sao?
Kết quả mẫu trên cột KY của bạn có chắc là đúng chưa?
Cột KX từ đâu mà có.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào bác!
nó là số liệu bảng đó bác let'gâu gâu ah!

đếm khoảng cách giữa 2 chữ A
Mã:
Function KhoangCach(rng As Range, ch As String)
Dim arr, mcnt, cnt As Long, switch As Boolean
arr = rng.Value
For I = 1 To UBound(arr, 2)
    If arr(1, I) = ch Then
        switch = True
    Else
        switch = False
    End If
    
    If switch = True Then
        If cnt > mcnt Then mcnt = cnt
        cnt = 0
    Else
        cnt = cnt + 1
    End If
Next
KhoangCach = mcnt
End Function
Mã:
KZ=khoangcach(B2:KV2,"A")
==>kq 16
 
Upvote 0
đếm khoảng cách giữa 2 chữ A
Mã:
Function KhoangCach(rng As Range, ch As String)
Dim arr, mcnt, cnt As Long, switch As Boolean
arr = rng.Value
For I = 1 To UBound(arr, 2)
    If arr(1, I) = ch Then
        switch = True
    Else
        switch = False
    End If
    
    If switch = True Then
        If cnt > mcnt Then mcnt = cnt
        cnt = 0
    Else
        cnt = cnt + 1
    End If
Next
KhoangCach = mcnt
End Function
Mã:
KZ=khoangcach(B2:KV2,"A")
==>kq 16
liệu có nhầm không bác? sao kết quả 16 được?
 
Upvote 0
Giải thích vẫn chưa rõ, đề nghị kết quả mẫu có giải thích là con số đó là tính từ ô nào đến ô nào trong hàng, lý do?
Đếm ô trống giữa AA............A, Còn kiểu A2.................2, hay AA...............2, hay gì gì khác thì sao?
Kết quả mẫu trên cột KY của bạn có chắc là đúng chưa?
Cột KX từ đâu mà có.

Lấy 2 ô A và A kế tiếp nhau làm mốc.tính đến ô nào có giá tri A( có thể thay đổi bằng chữ hoặc số) hoặc 2, 3 xa nhất. kiểu A2...2 có ở đâu bác bảo em(kiểu 2 ô gần đó là 2 giá trị khác). Kết quả ở KY chắc đúng vì em ngồi dò lại rồi
 
Upvote 0
xét dòng đâu tiên nha (dòng số 2)
có phải từ AA (2 cell liên tiếp có A) tới A, khoảng dài nhất là CR2:DG2==>16 cell rổng liên tiếp?
Bác nhầm lẫn chút rồi 2 ô A A kế tiếp cho tới A(có thể là số hoặc chữ) CR2:DA2 Có 9 ô rỗng bác ah!
bác coi giúp em file đó có phải vậy k? Các con số 2,3,4 cũng là giá trị dữ liệu.
 
Upvote 0
Lấy 2 ô A và A kế tiếp nhau làm mốc.tính đến ô nào có giá tri A( có thể thay đổi bằng chữ hoặc số) hoặc 2, 3 xa nhất. kiểu A2...2 có ở đâu bác bảo em(kiểu 2 ô gần đó là 2 giá trị khác). Kết quả ở KY chắc đúng vì em ngồi dò lại rồi

Kiểu A2.....2 hay gì đó là tôi nói tổng quát tất cả các kiểu có thể xảy ra thì tính sao mà thôi.
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 ý.
Kết quả KY bạn bảo "chắc đúng" thì thôi vậy, KY4 của bạn là 11 - code tôi =10 (KZ4), KW5 của bạn là 6 - Code tôi =7 (LA5), không hiểu nên "chạy tét"
 

File đính kèm

  • Hic115.jpg
    Hic115.jpg
    31.4 KB · Đọc: 58
Lần chỉnh sửa cuối:
Upvote 0
Kiểu A2.....2 hay gì đó là tôi nói tổng quát tất cả các kiểu có thể xảy ra thì tính sao mà thôi.

Kết quả KY bạn bảo "chắc đúng" thì thôi vậy, KY4 của bạn là 11 - code tôi =10 (KZ4), KW5 của bạn là 6 - Code tôi =7 (LA5), không hiểu nên "chạy tét"
Code bác chạy như hình minh họa là ổn cho sheet Đơn AA rồi nhưng em lăn tăn chỗ KZ6 giá trị của nó 16 mà(DQ6:EF6) Nhưng kết quả 18 là bác tính AN6:BE6 sai, chỉ lấy 2 ô kế tiếp nhau là A A còn nếu tính 3 ô kế tiếp là bài sheet bên bác ah. em kiểm tra lại thông số trên. chắc bác đang hiệu chỉnh chưa muốn đưa lên. Bác xem lại cẩn thận giúp em.
Cảm ơn bác!
 
Lần chỉnh sửa cuối:
Upvote 0
Code bác chạy như hình minh họa là ổn cho sheet Đơn AA rồi nhưng em lăn tăn chỗ KZ6 giá trị của nó 16 mà(DQ6:EF6) Nhưng kết quả 18 là bác tính AN6:BE6 sai, chỉ lấy 2 ô kế tiếp nhau là A A còn nếu tính 3 ô kế tiếp là bài sheet bên bác ah. em kiểm tra lại thông số trên. chắc bác đang hiệu chỉnh chưa muốn đưa lên. Bác xem lại cẩn thận giúp em.
Cảm ơn bác!
- Bạn vẫn chưa chịu nhận kết quả mẫu của bạn có chính xác không, nếu chính xác thì code tôi chạy ổn sao được? Vì thế tôi không đưa code lên. Bạn thử nhập thủ công hết 10 dòng trong 3 cột kết quả xem sao. Bạn giải thích khó hiểu quá.
- Tôi chẳng có hiệu chỉnh gì cả, chỉ là hiểu sao làm vậy, có dạng AA............... gì đó thì đếm.
Bạn đâu có giải thích là chỉ có AA, còn nếu AAA, hay AAAA thì không tính.
AAA ......gì đó thì tôi có thể lấy từ AA......gì đó vẫn đúng điều kiện mà.
 
Lần chỉnh sửa cuối:
Upvote 0
- Bạn vẫn chưa chịu nhận kết quả mẫu của bạn có chính xác không, nếu chính xác thì code tôi chạy ổn sao được? Vì thế tôi không đưa code lên. Bạn thử nhập thủ công hết 10 dòng trong 3 cột kết quả xem sao. Bạn giải thích khó hiểu quá.
- Tôi chẳng có hiệu chỉnh gì cả, chỉ là hiểu sao làm vậy, có dạng AA............... gì đó thì đếm.
Bạn đâu có giải thích là chỉ có AA, còn nếu AAA, hay AAAA thì không tính.
AAA ......gì đó thì tôi có thể lấy từ AA......gì đó vẫn đúng điều kiện mà.

Trước A A chỉ có thể là 3 hoặc ô trống, hoặc khác có A.
Bác coi giúp em bảng em gửi đầy đủ, toét mắt có sai bác chỉ giáo.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trước A A chỉ có thể là 2, 3 hoặc ô trống k có A.
Bác coi giúp em bảng em gửi đầy đủ, toét mắt có sai bác chỉ giáo.

Bạn thử xem cái này đúng với yêu cầu 1 ko
Mã:
Function KhoangCach(rng As Range, ch As String, k As Integer)
Dim arr, mcnt, cnt, j As Long, switch As Boolean, prest As String
arr = rng.Value

For i = 1 To UBound(arr, 2)
If prest = arr(1, i) And prest = ch Then
    j = j + 1
Else
    j = 1
End If

    If j = k And arr(1, i) = ch And prest = ch Then switch = True
    If switch = True And j <> k And arr(1, i) <> "" Then switch = False
    
    If arr(1, i) = "" Then
        cnt = cnt + 1
        If switch = True And cnt > mcnt Then mcnt = cnt
    Else
        cnt = 0
    End If
prest = arr(1, i)
Next
KhoangCach = mcnt
End Function
Mã:
KY2=KhoangCach(B2:KV2,"A",2)
với 2 là AA, 3 là AAA
yêu cầu số 2 vẫn chưa hiểu, số 3 thì hiểu nhưng chưa làm được....hihi
 
Upvote 0
Bạn thử xem cái này đúng với yêu cầu 1 ko
Mã:
Function KhoangCach(rng As Range, ch As String, k As Integer)
Dim arr, mcnt, cnt, j As Long, switch As Boolean, prest As String
arr = rng.Value

For i = 1 To UBound(arr, 2)
If prest = arr(1, i) And prest = ch Then
    j = j + 1
Else
    j = 1
End If

    If j = k And arr(1, i) = ch And prest = ch Then switch = True
    If switch = True And j <> k And arr(1, i) <> "" Then switch = False
    
    If arr(1, i) = "" Then
        cnt = cnt + 1
        If switch = True And cnt > mcnt Then mcnt = cnt
    Else
        cnt = 0
    End If
prest = arr(1, i)
Next
KhoangCach = mcnt
End Function
Mã:
KY2=KhoangCach(B2:KV2,"A",2)
với 2 là AA, 3 là AAA
yêu cầu số 2 vẫn chưa hiểu, số 3 thì hiểu nhưng chưa làm được....hihi
với 2 là AA, 3 là AAA Không phải như vậy bác ah?(hay em hiểu sai nhưng em cứ giải thích cho mọi đọc được đâu hay đó bác nhỉ?)
Mà nó như khi nào có 2 ô chứa giá Trị A và A kế tiếp nhau.(và chỉ lấy 2 ô chứa giá Trị A và A kế tiếp nhau) làm mốc để tính khoảng giá trị lớn nhất.
Tương tự bài 3 ô kế tiếp chứa giá trị A,A và A
Em có góp ý này. nếu vậy các bác không làm 1 công thức sau đó người dùng có thể thay giá trị A bằng chữ hoặc số vào cho hay, tương tự bài 3 ô kế tiếp chứa giá tri A cũng vậy hay không? Nếu không đúng bác bỏ qua cho.
Cảm ơn bác let'gâu gâu!
 
Upvote 0
với 2 là AA, 3 là AAA Không phải như vậy bác ah?(hay em hiểu sai nhưng em cứ giải thích cho mọi đọc được đâu hay đó bác nhỉ?)
Mà nó như khi nào có 2 ô chứa giá Trị A và A kế tiếp nhau.(và chỉ lấy 2 ô chứa giá Trị A và A kế tiếp nhau) làm mốc để tính khoảng giá trị lớn nhất.
Tương tự bài 3 ô kế tiếp chứa giá trị A,A và A
Em có góp ý này. nếu vậy các bác không làm 1 công thức sau đó người dùng có thể thay giá trị A bằng chữ hoặc số vào cho hay, tương tự bài 3 ô kế tiếp chứa giá tri A cũng vậy hay không? Nếu không đúng bác bỏ qua cho.
Cảm ơn bác let'gâu gâu!
Sao bạn không thử?
2 có nghĩa là 2 cell liên tiep có chữ A
còn bạn muốn thay bằng ký tự gì thì thay vào trong cthuc, chổ "" đó. Ve muốn thay bằng B thi "B"
 
Upvote 0
Sao bạn không thử?
2 có nghĩa là 2 cell liên tiep có chữ A
còn bạn muốn thay bằng ký tự gì thì thay vào trong cthuc, chổ "" đó. Ve muốn thay bằng B thi "B"
Em thay rồi bác. Vấn đề ở đây là 2 chữ A khác nhau Em có chút nhầm lẫn khi đưa ra không lường trước( đó là giá Trị A A kế tiếp, mà không đưa ra là A B kế tiếp nhau trước ô A, A B kế tiếp đó khác có giá trị khác A hoặc là rỗng và giá trị A, B có thể thay đổi đc). Hai nữa cái yêu cầu tính sau đó nhập tiếp chưa biết sao, vẫn còn chưa rõ sau đó yêu cầu khoảng 2 AA cuối. bác xem thế nào?
Rất mong bác và mọi người coi giúp!
Cảm ơn bác và GPE!
 
Lần chỉnh sửa cuối:
Upvote 0
Em thay rồi bác. Vấn đề ở đây là 2 chữ A khác nhau Em có chút nhầm lẫn khi đưa ra không lường trước( đó là giá Trị A A kế tiếp, mà không đưa ra là A B kế tiếp nhau trước ô A, A B kế tiếp đó khác có giá trị khác A hoặc là rỗng và giá trị A, B có thể thay đổi đc). Hai nữa cái yêu cầu tính sau đó nhập tiếp chưa biết sao, vẫn còn chưa rõ sau đó yêu cầu khoảng 2 AA cuối. bác xem thế nào?
Rất mong bác và mọi người coi giúp!
Cảm ơn bác và GPE!
PHP:
Public Function GPE_1(Rng As Range, Str As String)
Dim Arr(), J As Long, Dem As Long, N As Long, Tem As String
Arr = Rng.Value
    For J = UBound(Arr, 2) To 1 Step -1
        If Arr(1, J) = "" Then
            Dem = Dem + 1
        Else
            For N = J To J - Len(Str) + 1 Step -1
                Tem = Arr(1, N) & Tem
            Next N
            If Tem = Str Then GPE_1 = Dem
            Exit For
        End If
    Next J
End Function
Public Function GPE_3(Rng As Range, Str As String) As Long
Dim Arr(), J As Long, Dem As Long, Tem As String, L As Long, N As Long
Arr = Rng.Value: L = Len(Str)
For J = L + 1 To UBound(Arr, 2)
    If Arr(1, J) <> "" Then
        Tem = Tem & Arr(1, J)
    Else
        If Tem = Str Then
            For N = J To UBound(Arr, 2)
                If Arr(1, N) = "" Then
                    Dem = Dem + 1
                Else
                    If GPE_3 < Dem Then GPE_3 = Dem
                    Dem = 0
                    J = N - 1
                    Exit For
                End If
            Next N
        End If
        Tem = ""
    End If
Next J
End Function

Public Function GPE_2(Rng As Range, Str As String)
Dim Arr(), I As Long, J As Long, Dem As Long, Tem As String, L As Long, N As Long, LuBu As Long, X As Long
Arr = Rng.Value: L = Len(Str)
LuBu = GPE_3(Rng, Str)
For I = L + 1 To UBound(Arr, 2) - LuBu
    For J = I To I + LuBu - 1
        If Arr(1, J) = "" Then X = X + 1
    Next J
    If X = LuBu Then
        Tem = ""
        For N = I - L To I - 1
            Tem = Tem & Arr(1, N)
        Next N
        If Tem = Str Then
            If Arr(1, I - L - 1) = "" And Arr(1, I + LuBu) <> "" Then
                For N = I + LuBu + 1 To UBound(Arr, 2)
                    If Arr(1, N) = "" Then
                        Dem = Dem + 1
                    Else
                        Exit For
                    End If
                Next N
            End If
        End If
    Else
        X = 0
    End If
Next I
GPE_2 = Dem
End Function
Công thức:
PHP:
KW2=GPE_1(B2:KV2;"AA")
KX2=GPE_2(B2:KV2;"AA")
KY2=GPE_3(B2:KV2;"AA")
Muốn thay AA bằng AB hay AAA hay ABA gì đó thì thử xem.
Chỉ giải quyết được trước AA hay AAA là ô trống, nếu là số thì chưa xét đến.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác BaTe ah! code có sử dung cho bài toán này đc không? nếu được cần điều chỉnh gì không bác? nếu không được em nên viết đề tài khác không? mong bác và mọi người chỉ bảo? nếu em có gì sai xót.
Cảm ơn GPE!
 

File đính kèm

Upvote 0
nếu chỉ đi tìm 2->A rồi A-2 thì đơn giản quá rồi
tìm A-2
Mã:
=maxA2($B2:$EQQ2,"A2")
tìm khoảng cách sau A->2
Mã:
=maxA2($B2:$EQQ2,"A2",2)
khoảng trống cuối cùng của A
Mã:
=KTSA2(B2:EQQ2,"A")

nếu đổi lại là 2->A thì thay "A2" thành "2A"
khoảng trống cuối cùng của 2
Mã:
=KTSA2(B2:EQQ2,2)

Mã:
Public Function maxA2(sourceRG As Range, targetName As String, _
Optional ByVal typeFind As Byte = 1) As Long
Dim Arr As Variant, tempDist As Long, maxDist As Long, isMax As Boolean
Dim r As Long, lastTG As String, afterMax As Long, k As Long
Arr = sourceRG.Value
For r = 1 To UBound(Arr, 2) Step 1
    If IsEmpty(Arr(1, r)) Then
        tempDist = tempDist + 1
    Else
        If isMax Then
            afterMax = tempDist
            isMax = False
        End If
        If lastTG & Arr(1, r) = targetName Then
            If tempDist > maxDist Then
                maxDist = tempDist
                isMax = True
                afterMax = 0
            End If
        End If
        lastTG = Arr(1, r)
        tempDist = 0
    End If
Next
maxA2 = IIf(typeFind = 1, maxDist, afterMax)
End Function

Mã:
Public Function KTSA2(sourceRG As Range, targetName As Variant) As Variant
Dim r As Long, Arr As Variant, dCount As Long
Arr = sourceRG.Value
For r = UBound(Arr, 2) To 1 Step -1
    If IsEmpty(Arr(1, r)) Then
        dCount = dCount + 1
    Else
        If Arr(1, r) = targetName Then
            KTSA2 = dCount
        Else
            KTSA2 = ""
        End If
        Exit Function
    End If
Next
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
PHP:
Public Function GPE_1(Rng As Range, Str As String)
Dim Arr(), J As Long, Dem As Long, N As Long, Tem As String
Arr = Rng.Value
    For J = UBound(Arr, 2) To 1 Step -1
        If Arr(1, J) = "" Then
            Dem = Dem + 1
        Else
            For N = J To J - Len(Str) + 1 Step -1
                Tem = Arr(1, N) & Tem
            Next N
            If Tem = Str Then GPE_1 = Dem
            Exit For
        End If
    Next J
End Function
Public Function GPE_3(Rng As Range, Str As String) As Long
Dim Arr(), J As Long, Dem As Long, Tem As String, L As Long, N As Long
Arr = Rng.Value: L = Len(Str)
For J = L + 1 To UBound(Arr, 2)
    If Arr(1, J) <> "" Then
        Tem = Tem & Arr(1, J)
    Else
        If Tem = Str Then
            For N = J To UBound(Arr, 2)
                If Arr(1, N) = "" Then
                    Dem = Dem + 1
                Else
                    If GPE_3 < Dem Then GPE_3 = Dem
                    Dem = 0
                    J = N - 1
                    Exit For
                End If
            Next N
        End If
        Tem = ""
    End If
Next J
End Function

Public Function GPE_2(Rng As Range, Str As String)
Dim Arr(), I As Long, J As Long, Dem As Long, Tem As String, L As Long, N As Long, LuBu As Long, X As Long
Arr = Rng.Value: L = Len(Str)
LuBu = GPE_3(Rng, Str)
For I = L + 1 To UBound(Arr, 2) - LuBu
    For J = I To I + LuBu - 1
        If Arr(1, J) = "" Then X = X + 1
    Next J
    If X = LuBu Then
        Tem = ""
        For N = I - L To I - 1
            Tem = Tem & Arr(1, N)
        Next N
        If Tem = Str Then
            If Arr(1, I - L - 1) = "" And Arr(1, I + LuBu) <> "" Then
                For N = I + LuBu + 1 To UBound(Arr, 2)
                    If Arr(1, N) = "" Then
                        Dem = Dem + 1
                    Else
                        Exit For
                    End If
                Next N
            End If
        End If
    Else
        X = 0
    End If
Next I
GPE_2 = Dem
End Function
Công thức:
PHP:
KW2=GPE_1(B2:KV2;"AA")
KX2=GPE_2(B2:KV2;"AA")
KY2=GPE_3(B2:KV2;"AA")
Muốn thay AA bằng AB hay AAA hay ABA gì đó thì thử xem.
Chỉ giải quyết được trước AA hay AAA là ô trống, nếu là số thì chưa xét đến.

Với vụ này bác BaTe đã cho em cái code chạy ổn rồi.
Bác có thể giải quyết bài toán này giúp em đc k?
Bài toàn bài đầu ấy là AA đến 1 giá trị bất kỳ (có thể là 1 hoặc 2). giờ bài toán ấy ngược lại(nói cách khác là bài toán đối xứng, bài toán trước AA=>1 or 2, or 3. bài toán này ngược lại từ 1 or 2 đến AA) từ giá trị bất kỳ đến AA, hoặc AAA được không bác BaTe?
Cảm ơn GPE, Cảm ơn bác BaTe và mọi người quan tâm giúp đỡ em chân ướt chân ráo vào diễn đàn!
 
Lần chỉnh sửa cuối:
Upvote 0
nếu chỉ đi tìm 2->A rồi A-2 thì đơn giản quá rồi
tìm A-2
Mã:
=maxA2($B2:$EQQ2,"A2")
tìm khoảng cách sau A->2
Mã:
=maxA2($B2:$EQQ2,"A2",2)
khoảng trống cuối cùng của A
Mã:
=KTSA2(B2:EQQ2,"A")

nếu đổi lại là 2->A thì thay "A2" thành "2A"
khoảng trống cuối cùng của 2
Mã:
=KTSA2(B2:EQQ2,2)

Mã:
Public Function maxA2(sourceRG As Range, targetName As String, _
Optional ByVal typeFind As Byte = 1) As Long
Dim Arr As Variant, tempDist As Long, maxDist As Long, isMax As Boolean
Dim r As Long, lastTG As String, afterMax As Long, k As Long
Arr = sourceRG.Value
For r = 1 To UBound(Arr, 2) Step 1
    If IsEmpty(Arr(1, r)) Then
        tempDist = tempDist + 1
    Else
        If isMax Then
            afterMax = tempDist
            isMax = False
        End If
        If lastTG & Arr(1, r) = targetName Then
            If tempDist > maxDist Then
                maxDist = tempDist
                isMax = True
                afterMax = 0
            End If
        End If
        lastTG = Arr(1, r)
        tempDist = 0
    End If
Next
maxA2 = IIf(typeFind = 1, maxDist, afterMax)
End Function

Mã:
Public Function KTSA2(sourceRG As Range, targetName As Variant) As Variant
Dim r As Long, Arr As Variant, dCount As Long
Arr = sourceRG.Value
For r = UBound(Arr, 2) To 1 Step -1
    If IsEmpty(Arr(1, r)) Then
        dCount = dCount + 1
    Else
        If Arr(1, r) = targetName Then
            KTSA2 = dCount
        Else
            KTSA2 = ""
        End If
        Exit Function
    End If
Next
End Function
Khiếu nại bác doveandrose bài toán này bác cũng tính mốc 2 của đoạn [A:2] hoặc đoạn [2:A] này đều lấy liền kề các giá trị khác. không lấy trước và sau A (nếu A là điểm mốc ví A->2) hoặc 2(nếu 2 làm mốc ví như 2-A) là ô trống. bác coi giúp em. Xem chỉnh sửa sao cho phù hợp, em vừa nghiệm thử. hoa hết mắt.
Cảm ơn bác doveandrose!
 
Lần chỉnh sửa cuối:
Upvote 0
Khiếu nại bác doveandrose bài toán này bác cũng tính mốc 2 của đoạn [A:2] hoặc đoạn [2:A] này đều lấy liền kề các giá trị khác. không lấy trước và sau A (nếu A là điểm mốc ví A->2) hoặc 2(nếu 2 làm mốc ví như 2-A) là ô trống. bác coi giúp em. Xem chỉnh sửa sao cho phù hợp, em vừa nghiệm thử. hoa hết mắt.
Cảm ơn bác doveandrose!

bạn diễn tả vậy ai hiểu ? đem file nào sai lên đây . tô màu chỗ nào làm sai
 
Upvote 0
Mã:
Public Function maxA2(sourceRG As Range, targetName As String, _
Optional ByVal typeFind As Byte = 1) As Long
Dim Arr As Variant, tempDist As Long, maxDist As Long, isMax As Boolean
Dim r As Long, lastTG As String, afterMax As Long, k As Long, uc As Long
Arr = sourceRG.Value
uc = UBound(Arr, 2)
For r = 1 To uc Step 1
    If IsEmpty(Arr(1, r)) Then
        tempDist = tempDist + 1
        If r = uc And isMax Then afterMax = tempDist
    Else
        If isMax Then
            afterMax = tempDist
            isMax = False
        End If
        If lastTG & Arr(1, r) = targetName And _
        (r = uc Or Arr(1, WorksheetFunction.Min(r + 1, uc)) = Empty) Then
            If tempDist > maxDist Then
                maxDist = tempDist
                isMax = True
                afterMax = 0
            End If
        End If
        lastTG = IIf(r = 1 Or Arr(1, WorksheetFunction.Max(r - 1, 1)) = Empty, Arr(1, r), "")
        tempDist = 0
    End If
Next
maxA2 = IIf(typeFind = 1, maxDist, afterMax)
End Function

Mã:
Public Function KTSA2(sourceRG As Range, targetName As Variant) As Variant
Dim r As Long, Arr As Variant, dCount As Long
Arr = sourceRG.Value
For r = UBound(Arr, 2) To 1 Step -1
    If IsEmpty(Arr(1, r)) Then
        dCount = dCount + 1
    Else
        If Arr(1, r) = targetName And Arr(1, r - 1) = Empty Then
            KTSA2 = dCount
        Else
            KTSA2 = ""
        End If
        Exit Function
    End If
Next
End Function
 
Upvote 0
Với vụ này bác BaTe đã cho em cái code chạy ổn rồi.
Bác có thể giải quyết bài toán này giúp em đc k?
Bài toàn bài đầu ấy là AA đến 1 giá trị bất kỳ (có thể là 1 hoặc 2). giờ bài toán ấy ngược lại(nói cách khác là bài toán đối xứng, bài toán trước AA=>1 or 2, or 3. bài toán này ngược lại từ 1 or 2 đến AA) từ giá trị bất kỳ đến AA, hoặc AAA được không bác BaTe?
Cảm ơn GPE, Cảm ơn bác BaTe và mọi người quan tâm giúp đỡ em chân ướt chân ráo vào diễn đàn!


Qua quá trình sử dụng có phát sinh điều kiện này: bác cho thêm cái code tô màu vào các ô giá trị liên tiếp đó theo bảng màu tự chọn tùy ý( theo số hiệu quy định).
Chân thành cảm ơn bác.
 
Upvote 0
bác BaTe vào chỉ giáo giúp em, bài toán này.
 
Upvote 0

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

Back
Top Bottom