Lấy các số chỉ định bắt đầu từ phải qua trái liền kề nhau trong một dãy số

Liên hệ QC

Cu Tồ

Tìm đến kiến thức! ꧁༺ Cu Tồ ༻꧂
Tham gia
6/5/20
Bài viết
735
Được thích
347
Chào các bác các thầy và các anh chị!
Em có một một dãy số gồm 12 số như sau :

522385555555
522405555555
522446155555
522447975555
522399906555
522417493455
522445219655
522372845555
522365155555

cho em hỏi dùng VBA có cách nào để đếm các số 5 liền kề nhau từ đuôi lên không ạ?kết quả mong muốn của em sẽ như sau:



522385555555 ------------ 5555555 => 7
522405255555 ------------ 555555 => 6
522446155555 ------------ 55555 => 5
522447955555 ------------ 5555 => 4
522399907555 ------------ 555 => 3
522417498855 ------------ 55 => 2
522445216375 ------------ 5 =》 1
522372845555 ------------ 5555 => 4
522365155555 ------------ 55555 = > 5
Em cảm ơn nhiều ạ!
 
Bạn cho biết đáp án của các trường hợp này:
Số tìmTìm sốĐáp án
123456789012
1​
?1
123456789002
0​
?2
123456709002
0​
?3
123450709002
0​
?4
 
Upvote 0
Bạn cho biết đáp án của các trường hợp này:
Số tìmTìm sốĐáp án
123456789012
1​
?1
123456789002
0​
?2
123456709002
0​
?3
123450709002
0​
?4
Chào bác,với trường hợp như thế này thì không lấy ạ.chỉ tính từ cuối dãy số lên,bắt đầu bằng số được chỉ định là số 5 và lấy các số liền kề cho tới khi gặp số khác thì dừng lại ạ
Bài đã được tự động gộp:

Chào bác,với trường hợp như thế này thì không lấy ạ.chỉ tính từ cuối dãy số lên,bắt đầu bằng số được chỉ định là số 5 và lấy các số liền kề cho tới khi gặp số khác thì dừng lại ạ
ví dụ trong dãy số này 123456789012 thì sẽ bỏ qua vì cuỗi dãy số không có số được chỉ định (ở đây cháu lấy là số 5 ạ)
còn với trường hợp như thế này thì 123456789055 thì sẽ tính là hai số,vì số cuỗi dãy số bắt đầu là 5 và có hai số liền kề nên lấy là 2 số,còn số 5 thứ 3 nằm ở giữa số 4 và số 6 do bị đứt đoạn nên sẽ không lấy ạ
Bài đã được tự động gộp:

Bạn cho biết đáp án của các trường hợp này:
Số tìmTìm sốĐáp án
123456789012
1​
?1
123456789002
0​
?2
123456709002
0​
?3
123450709002
0​
?4
còn trả lời về trường hợp Bâc đưa ra thì nếu như theo bài của cháu đáp án sẽ là ··

Số tìmTìm sốĐáp án
12345678901210
12345678900200
12345670900200
12345070900200
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bác các thầy và các anh chị!
Em có một một dãy số gồm 12 số như sau :

522385555555
522405555555
522446155555
522447975555
522399906555
522417493455
522445219655
522372845555
522365155555

cho em hỏi dùng VBA có cách nào để đếm các số 5 liền kề nhau từ đuôi lên không ạ?kết quả mong muốn của em sẽ như sau:



522385555555 ------------ 5555555 => 7
522405255555 ------------ 555555 => 6
522446155555 ------------ 55555 => 5
522447955555 ------------ 5555 => 4
522399907555 ------------ 555 => 3
522417498855 ------------ 55 => 2
522445216375 ------------ 5 =》 1
522372845555 ------------ 5555 => 4
522365155555 ------------ 55555 = > 5
Em cảm ơn nhiều ạ!
Thử code dưới đây
Mã:
Option Explicit
Sub demso()
Dim dayso
Dim kq
Dim i, j, k

k = CStr(5)
dayso = Sheet1.Range("A1:A9")
ReDim kq(1 To 9, 1 To 1)
For i = 1 To 9
    If Right(dayso(i, 1), 1) = k Then
        kq(i, 1) = 1
        For j = Len(dayso(i, 1)) - 1 To 1 Step -1
            If Mid(dayso(i, 1), j, 1) = k Then
                kq(i, 1) = kq(i, 1) + 1
            Else
                Exit For
            End If
        Next j
    End If
Next i
Sheet1.Range("C1:C9") = kq
End Sub
 
Upvote 0
Bạn có thể sử dụng hàm dưới đây sử dụng VBA UDF, bạn copy code vào một module và sử dụng:

B1=S_NumberAlternate(A1:A1000)
C1=S_NumberAlternate(A1:B1000)


---------------------------------------
JavaScript:
Option Explicit

#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

'///////////////////////////////////////////////////////
#If Win64 Then
  Private gTimerID As LongPtr, gTimerID2 As LongPtr
#Else
  Private gTimerID As Long, gTimerID2 As Long
#End If
'///////////////////////////////////////////////////////
Private NumberAlternate_OArgs(), NumberAlternate_OIndex As Integer

Function S_NumberAlternate(ByVal values As Range) As Variant
  On Error Resume Next
  KillTimer 0&, gTimerID: gTimerID = 0
  '-----------------------------------------------
  Dim Arg As Variant
  Arg = values.value
  S_NumberAlternate = NumberAlternate(Arg(1, 1))
  '-----------------------------------------------
  If values.Cells.Count > 1 Then
    Dim UB As Integer, K As Integer
    '-----------------------------------------------
    UB = UBound(NumberAlternate_OArgs, 2): K = UB
    K = K + 1
    ReDim Preserve NumberAlternate_OArgs(1 To K)
    NumberAlternate_OArgs(K) = Array(Arg, Application.Caller)
    gTimerID = SetTimer(0&, 0&, 1, AddressOf S_NumberAlternate_callback)
  End If
End Function
'///////////////////////////////////////////////////////
Private Sub S_NumberAlternate_callback()
  On Error Resume Next
  Call KillTimer(0&, gTimerID): gTimerID = 0
  Call KillTimer(0&, gTimerID2): gTimerID2 = 0
  On Error GoTo 0
  '----------------------------------
  Dim UA As Integer
  UA = UBound(NumberAlternate_OArgs)
  If UA > 0 Then
    NumberAlternate_OIndex = NumberAlternate_OIndex + 1
    '-------------------------------------------
    Dim Args, R As Long, C As Integer, total(), total2(), UB As Long, UB2 As Integer
    Args = NumberAlternate_OArgs(NumberAlternate_OIndex)
    UB = UBound(Args(0)): UB2 = UBound(Args(0), 2)
    ReDim total(2 To UB, 1 To UB2)
    For R = 2 To UB
      For C = 1 To UB2
        If Args(0)(R, C) <> "" Then
          total(R, C) = NumberAlternate(Args(0)(R, C))
        End If
      Next
    Next
    Args(1)(2, 1).Resize(UBound(total) - 1, UB2).value = total
    If UB2 > 1 Then
      ReDim total2(1 To 1, 2 To UB2)
      For C = 2 To UB2
        If Args(0)(1, C) <> "" Then
          total2(1, C) = NumberAlternate(Args(0)(1, C))
        End If
      Next
      Args(1)(1, 2).Resize(, UB2 - 1).value = total2
    End If
    '-------------------------------------------
    If NumberAlternate_OIndex >= UA Then
      Erase NumberAlternate_OArgs: NumberAlternate_OIndex = 0
    Else
      gTimerID = SetTimer(0&, 0&, 1, AddressOf S_NumberAlternate_callback2)
    End If
  End If
End Sub
Private Sub S_NumberAlternate_callback2()
  S_NumberAlternate_callback
End Sub
Private Function NumberAlternate(ByVal value As String) As Variant
  Dim l As Long, s As String, t As String
  l = Len(value): t = Right(value, 1)
  Do Until l <= 1
    l = l - 1: s = Mid(value, l)
    If Not s Like t & "*" Then Exit Do
    t = s
  Loop
  NumberAlternate = t
End Function
 
Upvote 0
Mã:
Function demso(chuoiso as string,so as string) as long
Demso = len(chuoiso) - len(rtrim(replace(chuoiso, so, " ")))
End function
 
Upvote 0
Chào các bác các thầy và các anh chị!
Em có một một dãy số gồm 12 số như sau :

522385555555
522405555555
522446155555
522447975555
522399906555
522417493455
522445219655
522372845555
522365155555

cho em hỏi dùng VBA có cách nào để đếm các số 5 liền kề nhau từ đuôi lên không ạ?kết quả mong muốn của em sẽ như sau:



522385555555 ------------ 5555555 => 7
522405255555 ------------ 555555 => 6
522446155555 ------------ 55555 => 5
522447955555 ------------ 5555 => 4
522399907555 ------------ 555 => 3
522417498855 ------------ 55 => 2
522445216375 ------------ 5 =》 1
522372845555 ------------ 5555 => 4
522365155555 ------------ 55555 = > 5
Em cảm ơn nhiều ạ!
Hoặc công thức:
PHP:
=MATCH(1,INDEX(--(--MID(A1,13-ROW(INDIRECT("1:12")),1)<>5),),0)-1
 
Upvote 0
522385555555 ------------ 5555555 => 7 OK
522405255555 ------------ 555555 => 6 ??
522446155555 ------------ 55555 => 5 OK
522447955555 ------------ 5555 => 4 ??
522399907555 ------------ 555 => 3
522417498855 ------------ 55 => 2
522445216375 ------------ 5 =》 1
522372845555 ------------ 5555 => 4
522365155555 ------------ 55555 = > 5
$$$$@
 
Upvote 0
Cảm ơn bác nhiều. Hiện e không ngồi máy tính. Tối về e chạy thử ạ
Bài đã được tự động gộp:

Bạn có thể sử dụng hàm dưới đây sử dụng VBA UDF, bạn copy code vào một module và sử dụng:

B1=S_NumberAlternate(A1:A1000)
C1=S_NumberAlternate(A1:B1000)


---------------------------------------
JavaScript:
Option Explicit

#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

'///////////////////////////////////////////////////////
#If Win64 Then
  Private gTimerID As LongPtr, gTimerID2 As LongPtr
#Else
  Private gTimerID As Long, gTimerID2 As Long
#End If
'///////////////////////////////////////////////////////
Private NumberAlternate_OArgs(), NumberAlternate_OIndex As Integer

Function S_NumberAlternate(ByVal values As Range) As Variant
  On Error Resume Next
  KillTimer 0&, gTimerID: gTimerID = 0
  '-----------------------------------------------
  Dim Arg As Variant
  Arg = values.value
  S_NumberAlternate = NumberAlternate(Arg(1, 1))
  '-----------------------------------------------
  If values.Cells.Count > 1 Then
    Dim UB As Integer, K As Integer
    '-----------------------------------------------
    UB = UBound(NumberAlternate_OArgs, 2): K = UB
    K = K + 1
    ReDim Preserve NumberAlternate_OArgs(1 To K)
    NumberAlternate_OArgs(K) = Array(Arg, Application.Caller)
    gTimerID = SetTimer(0&, 0&, 1, AddressOf S_NumberAlternate_callback)
  End If
End Function
'///////////////////////////////////////////////////////
Private Sub S_NumberAlternate_callback()
  On Error Resume Next
  Call KillTimer(0&, gTimerID): gTimerID = 0
  Call KillTimer(0&, gTimerID2): gTimerID2 = 0
  On Error GoTo 0
  '----------------------------------
  Dim UA As Integer
  UA = UBound(NumberAlternate_OArgs)
  If UA > 0 Then
    NumberAlternate_OIndex = NumberAlternate_OIndex + 1
    '-------------------------------------------
    Dim Args, R As Long, C As Integer, total(), total2(), UB As Long, UB2 As Integer
    Args = NumberAlternate_OArgs(NumberAlternate_OIndex)
    UB = UBound(Args(0)): UB2 = UBound(Args(0), 2)
    ReDim total(2 To UB, 1 To UB2)
    For R = 2 To UB
      For C = 1 To UB2
        If Args(0)(R, C) <> "" Then
          total(R, C) = NumberAlternate(Args(0)(R, C))
        End If
      Next
    Next
    Args(1)(2, 1).Resize(UBound(total) - 1, UB2).value = total
    If UB2 > 1 Then
      ReDim total2(1 To 1, 2 To UB2)
      For C = 2 To UB2
        If Args(0)(1, C) <> "" Then
          total2(1, C) = NumberAlternate(Args(0)(1, C))
        End If
      Next
      Args(1)(1, 2).Resize(, UB2 - 1).value = total2
    End If
    '-------------------------------------------
    If NumberAlternate_OIndex >= UA Then
      Erase NumberAlternate_OArgs: NumberAlternate_OIndex = 0
    Else
      gTimerID = SetTimer(0&, 0&, 1, AddressOf S_NumberAlternate_callback2)
    End If
  End If
End Sub
Private Sub S_NumberAlternate_callback2()
  S_NumberAlternate_callback
End Sub
Private Function NumberAlternate(ByVal value As String) As Variant
  Dim l As Long, s As String, t As String
  l = Len(value): t = Right(value, 1)
  Do Until l <= 1
    l = l - 1: s = Mid(value, l)
    If Not s Like t & "*" Then Exit Do
    t = s
  Loop
  NumberAlternate = t
End Function
Cảm ơn bác nhiều ạ. Dùng hàm thì hơi bất tiện là mỗi lần chạy số liệu lại phải gõ hàm nên e muốn dùng thẳng vba để chạy luôn. Nhưng e sẽ thử cách của bác để học hỏi thêm. Rất cảm ơn bác
Bài đã được tự động gộp:

Thử code dưới đây
Mã:
Option Explicit
Sub demso()
Dim dayso
Dim kq
Dim i, j, k

k = CStr(5)
dayso = Sheet1.Range("A1:A9")
ReDim kq(1 To 9, 1 To 1)
For i = 1 To 9
    If Right(dayso(i, 1), 1) = k Then
        kq(i, 1) = 1
        For j = Len(dayso(i, 1)) - 1 To 1 Step -1
            If Mid(dayso(i, 1), j, 1) = k Then
                kq(i, 1) = kq(i, 1) + 1
            Else
                Exit For
            End If
        Next j
    End If
Next i
Sheet1.Range("C1:C9") = kq
End Sub
Cảm ơn bác nhiều nha. Tối về ngồi máy tính e chạy thử code ạ
Bài đã được tự động gộp:

Mã:
Function demso(chuoiso as string,so as string) as long
Demso = len(chuoiso) - len(rtrim(replace(chuoiso, so, " ")))
End function
Cảm ơn bác nhiều ạ
Bài đã được tự động gộp:

Hoặc công thức:
PHP:
=MATCH(1,INDEX(--(--MID(A1,13-ROW(INDIRECT("1:12")),1)<>5),),0)-1
Vâng. Cũng học thêm được một công thức. Cảm ơn bác nhiều nha
Bài đã được tự động gộp:

Ui cái này cháu viết nhầm bác ơi. Tại lúc tối cháu làm đêm. Tầm 3 4 giờ sáng hoa hết mắt bác ạ. Đáp án đúng là 6 thì là 5. Còn chỗ 4 kia cũng là 5 bác ạ. Vẫn hi vong bác đóng góp giúp thêm cho một cách ạ
Bài đã được tự động gộp:

Rất cảm ơn các bác đã nhiệt tình giúp đỡ. Mỗi giúp đỡ là một cách và thêm một thứ để học hỏi. Nhưng hiện tại e đang không ngồi máy tính nên xin phép các bác tối về e thử các cách mà các bác đã giúp đỡ. Một lần nữa cảm ơn các bác nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Công thức bình thường được mà:
Mã:
=COUNT(1/(RIGHT(A1,ROW($1:$12))=REPT(5,ROW($1:$12))))
Nếu dữ liệu thuộc dạng text thì có thể dùng COUNTIF
Mã:
=COUNT(1/COUNTIF(A1,"*"&REPT(5,ROW($1:$12))))
Tùy
 
Upvote 0
Dùng SUMPRODUCT chỉ cần Enter.
 
Upvote 0
Box lập trình, thớt hỏi VBA.
 
Upvote 0
Upvote 0
Trên máy tôi dùng Excel 2010, Enter kết quả là 1, Ctrl+Shift+Enter kết quả là 7

Các bạn thử trên các phiên bản khác xem sao?
Già cả phải dùng 3 ngón, tuổi trẻ chỉ cần 1 ngón
Ẹc... Ẹc...
(của mình là 365, xoáy cực mạnh)
 
Upvote 0
Rất cảm ơn các bác và các thầy đã nhiệt tình giúp đỡ.tất cả các cách mà các bác và cacs thầy đưa ra điều cho kết quả như ý ạ
 
Upvote 0
Web KT

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

Back
Top Bottom