Cần giúp đỡ : xử lý chuỗi số quay lại

Liên hệ QC

Cuongtm84

Thành viên mới
Tham gia
29/8/20
Bài viết
12
Được thích
2
Chào các bác, các bác giúp em giải quyết bài toán này với ạ

Em có 1 list dãy số có sẵn đã được phát hành, em muốn khi bấm vào command button thì sẽ dò tìm giá trị của ô giá trị nhập vào từ .... đến ... và điền giá trị vào vị trí tương ứng trong list, khi ô đã đc điền thì sẽ bị lock lại để không cho sửa
1629222741984.png
 
Tôi đã làm cho bạn, bẫy lỗi các trường hợp chưa nhập Từ Số, Đến Số; đảo số lại nếu Từ Số lớn hơn Đến Số; Từ Số nhỏ hơn số đầu của dãy số và Đến Số lớn hơn số cuối của dãy số:

Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim c As Long, e As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
    
    Range("C6:C" & Rows.Count).ClearContents
    
    e = Range("E" & Rows.Count).End(xlUp).Row
    
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
    
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
    
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
    
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
    
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
    
    If FromNum = ToNum Then
        Range("C6").Value = Format(Range("C2").Value, "0000")
        Exit Sub
    End If
    
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        c = c + 1
        arrSeries(c, 1) = Format(r, "0000")
    Next
    
    Range("C6").Resize(c).Value = arrSeries
End Sub
 

File đính kèm

  • DoSo.xlsm
    19.7 KB · Đọc: 10
Upvote 0
em cảm ơn bác, đúng cái em cần ạ. tuy nhiên nhờ bác xem lại giúp em, vì nó không fill từ số '0001 ạ
1629257474084.png
Tôi đã làm cho bạn, bẫy lỗi các trường hợp chưa nhập Từ Số, Đến Số; đảo số lại nếu Từ Số lớn hơn Đến Số; Từ Số nhỏ hơn số đầu của dãy số và Đến Số lớn hơn số cuối của dãy số:

Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim c As Long, e As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
   
    Range("C6:C" & Rows.Count).ClearContents
   
    e = Range("E" & Rows.Count).End(xlUp).Row
   
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
   
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
   
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
   
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
   
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
   
    If FromNum = ToNum Then
        Range("C6").Value = Format(Range("C2").Value, "0000")
        Exit Sub
    End If
   
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        c = c + 1
        arrSeries(c, 1) = Format(r, "0000")
    Next
   
    Range("C6").Resize(c).Value = arrSeries
End Sub
 
Upvote 0
Đầu tiên em nhập số từ 0001-0010 thì nó ra kết quả như vậy
1629267805317.png
sau đó em nhập tiếp từ 0011-0015 thì nó ra như này
1629267842183.png
kết quả em mong muốn sau 2 lần nhập 0001-0010 và 0011-0015 thì sẽ fill vào từ 0001-0015 ạ . và khi mình tìm số nào thì nó fill vào vị trí của số đó, vì số của em k phải về 1 lần là hết mà sẽ về nhiều lần.bác xem lại giúp em với. Em cảm ơn bác
Sao lại không? Tôi chưa hiểu bạn nhập kiểu gì mà nó không fill?
 
Upvote 0
Đầu tiên em nhập số từ 0001-0010 thì nó ra kết quả như vậy

sau đó em nhập tiếp từ 0011-0015 thì nó ra như này

kết quả em mong muốn sau 2 lần nhập 0001-0010 và 0011-0015 thì sẽ fill vào từ 0001-0015 ạ . và khi mình tìm số nào thì nó fill vào vị trí của số đó, vì số của em k phải về 1 lần là hết mà sẽ về nhiều lần.bác xem lại giúp em với. Em cảm ơn bác
À tôi hiểu rồi, bạn xóa code cũ và chép code mới này vào:
Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim c As Long, e As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
    
    e = Range("E" & Rows.Count).End(xlUp).Row
    
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
    
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
    
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
    
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
    
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
    
    e = Range("C" & Rows.Count).End(xlUp).Row
    If e < 6 Then e = 6 Else e = e + 1
    
    If FromNum = ToNum Then
        Range("C" & e).Value = Format(Range("C2").Value, "0000")
        Exit Sub
    End If
    
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        c = c + 1
        arrSeries(c, 1) = Format(r, "0000")
    Next
    
    Range("C" & e).Resize(c).Value = arrSeries
End Sub
 
Upvote 0
Mình có thể khống chế những số đã fill rồi mà chọn lại thì có thông báo không bác vì hiện tại nếu fill 2 lần thì nó sẽ nhảy tiếp xuống bên dưới như hình ạ
1629269552329.png
À tôi hiểu rồi, bạn xóa code cũ và chép code mới này vào:
Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim c As Long, e As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
   
    e = Range("E" & Rows.Count).End(xlUp).Row
   
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
   
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
   
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
   
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
   
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
   
    e = Range("C" & Rows.Count).End(xlUp).Row
    If e < 6 Then e = 6 Else e = e + 1
   
    If FromNum = ToNum Then
        Range("C" & e).Value = Format(Range("C2").Value, "0000")
        Exit Sub
    End If
   
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        c = c + 1
        arrSeries(c, 1) = Format(r, "0000")
    Next
   
    Range("C" & e).Resize(c).Value = arrSeries
End Sub
 
Upvote 0
Mình có thể khống chế những số đã fill rồi mà chọn lại thì có thông báo không bác vì hiện tại nếu fill 2 lần thì nó sẽ nhảy tiếp xuống bên dưới như hình ạ
Tôi phát mệt với bạn rồi đó, bao nhiêu điều kiện bạn nói ra một lần luôn đi, cứ mỗi lần tôi làm xong thì bạn lại phát sinh một vấn đề.
Giả sử bạn nhập từ 5 đến 10 rồi bạn có nhập tiếp từ 1 đến 6 hay không? Hoặc bạn nhập từ 1 đến 5 rồi bạn có nhập từ 7 đến 10 không? Có nghĩa là bạn nhập so le, xen kẽ lẫn nhau đó.
 
Upvote 0
Tôi phát mệt với bạn rồi đó, bao nhiêu điều kiện bạn nói ra một lần luôn đi, cứ mỗi lần tôi làm xong thì bạn lại phát sinh một vấn đề.
Giả sử bạn nhập từ 5 đến 10 rồi bạn có nhập tiếp từ 1 đến 6 hay không? Hoặc bạn nhập từ 1 đến 5 rồi bạn có nhập từ 7 đến 10 không? Có nghĩa là bạn nhập so le, xen kẽ lẫn nhau đó.
sẽ là nhập so le xen kẽ ạ, ví dụ từ 1--100 thì có thể nhập 1-5 ,7-20,50-70,6 ....
 
Upvote 0
sẽ là nhập so le xen kẽ ạ, ví dụ từ 1--100 thì có thể nhập 1-5 ,7-20,50-70,6 ....
Có lúc nhập dãy số lớn, có lúc lại nhập dãy số nhỏ hay không? Nhập dãy số xong nếu mà phát hiện trùng số nào thì không nhập lại số đó nữa phải không, chỉ nhập số chưa nhập phải không?
 
Upvote 0
Đồng thời cột kết quả có sắp xếp lại từ nhở đến lớn không?
 
Upvote 0
thực tế là em dựa vào danh sách đã có sẵn và đc sắp sếp từ nhỏ đến lớn, nên kết quả khi fill vào đúng vị trí thì cũng sắp xếp từ nhỏ đến lớn luôn rồi.
lúc nhập thì đúng là sẽ nhập dãy nhỏ, lúc nhập dãy lỡn. và khi đã nhập rồi thì k cho nhập tiếp vào nữa, mục đích cuối cùng là 2 cột giống hệt nhau ạ
 
Upvote 0
thực tế là em dựa vào danh sách đã có sẵn và đc sắp sếp từ nhỏ đến lớn, nên kết quả khi fill vào đúng vị trí thì cũng sắp xếp từ nhỏ đến lớn luôn rồi.
lúc nhập thì đúng là sẽ nhập dãy nhỏ, lúc nhập dãy lỡn. và khi đã nhập rồi thì k cho nhập tiếp vào nữa, mục đích cuối cùng là 2 cột giống hệt nhau ạ
Khi nhập lúc thì dãy số nhỏ, lúc thì dãy số lớn thì làm sao nó sắp xếp được? Bạn phải sắp xếp lại ngay sau khi nó được dán tiếp theo sau chứ? Nếu OK tôi làm một lần luôn, còn không bạn tự sắp xếp thủ công, chứ tôi không chỉnh sửa theo yêu cầu của bạn nữa.
 
Upvote 0
vâng, bác sắp xếp luôn giúp em ạ, em cảm ơn bác
Khi nhập lúc thì dãy số nhỏ, lúc thì dãy số lớn thì làm sao nó sắp xếp được? Bạn phải sắp xếp lại ngay sau khi nó được dán tiếp theo sau chứ? Nếu OK tôi làm một lần luôn, còn không bạn tự sắp xếp thủ công, chứ tôi không chỉnh sửa theo yêu cầu của bạn nữa.
 
Upvote 0
vâng, bác sắp xếp luôn giúp em ạ, em cảm ơn bác
Tôi nghĩ lần này phù hợp với yêu cầu của bạn:
Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim rngList As Range
    Dim c As Long, e As Long, k As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
    
    e = Range("E" & Rows.Count).End(xlUp).Row
    
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
    
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
    
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
    
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
    
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
    
    e = Range("C" & Rows.Count).End(xlUp).Row
    
    If e < 6 Then e = 6 Else e = e + 1
    
    Set rngList = Range("C6:C" & e)

    If FromNum = ToNum Then
        k = Val(Range("C2").Value)
        If WorksheetFunction.CountIf(rngList, k) = 0 Then
            Range("C" & e).Value = Format(Range("C2").Value, "0000")
        End If
        Exit Sub
    End If
    
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        If WorksheetFunction.CountIf(rngList, r) = 0 Then
            c = c + 1
            arrSeries(c, 1) = Format(r, "0000")
        End If
    Next
    If c > 0 Then
        Range("C" & e).Resize(c).Value = arrSeries
    End If
    
    e = Range("C" & Rows.Count).End(xlUp).Row
    Range("C6:C" & e).Sort Range("C6")
End Sub
 
Upvote 0
Em cảm ơn bác đã nhiệt tình giúp đỡ ạ :D:D:D:D:D
Tôi nghĩ lần này phù hợp với yêu cầu của bạn:
Mã:
Sub FindNumber()
    Dim arrSeries()
    Dim rngList As Range
    Dim c As Long, e As Long, k As Long, r As Long
    Dim StartNum As Long, LastNum As Long, FromNum As Long, ToNum As Long
   
    e = Range("E" & Rows.Count).End(xlUp).Row
   
    StartNum = Val(Range("E5").Value)
    LastNum = Val(Range("E" & e).Value)
   
    FromNum = Val(Range("C2").Value)
    ToNum = Val(Range("C3").Value)
   
    'Bay loi neu khong nhap tu so den so:
    If FromNum + ToNum = 0 Then
        MsgBox "Ban phai nhap tu so den so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum = 0 And ToNum > 0 Then
        MsgBox "Ban phai nhap tu so!"
        Range("C2").Select
        Exit Sub
    End If
    If FromNum > 0 And ToNum = 0 Then
        MsgBox "Ban phai nhap den so!"
        Range("C3").Select
        Exit Sub
    End If
   
    'Dao lai so neu tu so lon hon den so
    If FromNum > ToNum Then
        Dim BigNum As String
        BigNum = Range("C2").Value
        Range("C2").Value = Range("C3").Value
        Range("C3").Value = BigNum
        FromNum = Val(Range("C2").Value)
        ToNum = Val(Range("C3").Value)
    End If
   
    'Bay loi neu so ngoai danh sach co san (nho hon so dau hoac/va lon hon so cuoi)
    If FromNum < StartNum Then
        MsgBox "Ban phai nhap lai tu so!" & vbLf & "(Tu so nho hon so dau cua day so cho truoc!)"
        Range("C2").ClearContents
        Range("C2").Select
        Exit Sub
    End If
    If ToNum > LastNum Then
        MsgBox "Ban phai nhap lai den so!" & vbLf & "(Den so lon hon so cuoi cua day so cho truoc!)"
        Range("C3").ClearContents
        Range("C3").Select
        Exit Sub
    End If
   
    e = Range("C" & Rows.Count).End(xlUp).Row
   
    If e < 6 Then e = 6 Else e = e + 1
   
    Set rngList = Range("C6:C" & e)

    If FromNum = ToNum Then
        k = Val(Range("C2").Value)
        If WorksheetFunction.CountIf(rngList, k) = 0 Then
            Range("C" & e).Value = Format(Range("C2").Value, "0000")
        End If
        Exit Sub
    End If
   
    ReDim arrSeries(1 To ToNum, 1 To 1)
    For r = FromNum To ToNum
        If WorksheetFunction.CountIf(rngList, r) = 0 Then
            c = c + 1
            arrSeries(c, 1) = Format(r, "0000")
        End If
    Next
    If c > 0 Then
        Range("C" & e).Resize(c).Value = arrSeries
    End If
   
    e = Range("C" & Rows.Count).End(xlUp).Row
    Range("C6:C" & e).Sort Range("C6")
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom