Sắp xếp thứ tự số seri theo điều kiện

Liên hệ QC

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
2,477
Được thích
2,933
Giới tính
Nam
Em xin chào các anh chị và thầy cô.
Có bài toán này muốn giúp ạ
Do em có code ra phần kết quả là những số seri riêng lẻ như hình. kết quả mong muốn là từ số nào tới số nào nếu như số tăng dần đều mà lại không biết làm thế nào.
Do 1 quyển gồm 10 số bắt đầu từ 01 tới 10
Em muốn gom lại như hình bên.
1645619092502.png
Mong mọi người hướng giúp em cách giải quyết với ạ
Em xin cám ơn nhiều
 

File đính kèm

  • demo.xlsx
    17.5 KB · Đọc: 15
Em xin chào các anh chị và thầy cô.
Có bài toán này muốn giúp ạ
Do em có code ra phần kết quả là những số seri riêng lẻ như hình. kết quả mong muốn là từ số nào tới số nào nếu như số tăng dần đều mà lại không biết làm thế nào.
Do 1 quyển gồm 10 số bắt đầu từ 01 tới 10
Em muốn gom lại như hình bên.
View attachment 272398
Mong mọi người hướng giúp em cách giải quyết với ạ
Em xin cám ơn nhiều
Chay code . . .
Mã:
Sub XYZ()
  Dim sArr(), res(), num$, fN$, sRow&, i&, k&
 
  With Sheets("Sheet3")
    sArr = .Range("A3:A" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  sRow = UBound(sArr) - 1
  ReDim res(1 To sRow, 1 To 3)
  fN = sArr(1, 1)
  sArr(sRow + 1, 1) = sArr(sRow, 1) + 9
  For i = 1 To sRow
    num = sArr(i, 1)
    If Right(num, 1) = "0" Or sArr(i + 1, 1) - num > 1 Then
      k = k + 1
      res(k, 1) = fN
      res(k, 2) = num
      res(k, 3) = num - fN + 1
      fN = sArr(i + 1, 1)
    End If
  Next i
  With Sheets("Sheet3")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("C3:E" & i).ClearContents
    .Range("C3").Resize(k, 2).NumberFormat = "@"
    .Range("C3").Resize(k, 3) = res
  End With
End Sub
 
Upvote 0
Chay code . . .
Mã:
Sub XYZ()
  Dim sArr(), res(), num$, fN$, sRow&, i&, k&
 
  With Sheets("Sheet3")
    sArr = .Range("A3:A" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  sRow = UBound(sArr) - 1
  ReDim res(1 To sRow, 1 To 3)
  fN = sArr(1, 1)
  sArr(sRow + 1, 1) = sArr(sRow, 1) + 9
  For i = 1 To sRow
    num = sArr(i, 1)
    If Right(num, 1) = "0" Or sArr(i + 1, 1) - num > 1 Then
      k = k + 1
      res(k, 1) = fN
      res(k, 2) = num
      res(k, 3) = num - fN + 1
      fN = sArr(i + 1, 1)
    End If
  Next i
  With Sheets("Sheet3")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("C3:E" & i).ClearContents
    .Range("C3").Resize(k, 2).NumberFormat = "@"
    .Range("C3").Resize(k, 3) = res
  End With
End Sub
Cám ơn thầy nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Phân tích:
- Dãy số của bạn đã sắp xếp.
- Số có 12 chữ số, tức là còn trong hạn định 15 chữ số của máy tính.
- Nếu hai điều kiện trên đúng thì chi tiết 01 đến 10 không quan trọng. Trừ phi bạn muốn 893404449140 và 893404449141 là hai dãy khác nhau.

Muốn tìm những khúc số nối tiếp nhau thì có thể áp dụng giải thuật đọc dãy sắp xếp:
- đọc số đầu tiên, ghi vào cột 1
- tiếp tục đọc từ trên xuống dưới (vòng lặp)
- nếu lớn hơn số trước đó + 1 thì:
-- ghi số trước đó vào cột 2
-- ghi (số trước đó) - (số ở cột 1) + 1 vào cột 3
-- tăng 1 dòng
-- ghi số mới vào cột 1
Nếu 893404449140 và 893404449141 là hai dãy khác nhau thì cần thêm một chút ở chỗ so sánh [nếu lớn hơn số trước đó + 1] : hoặc số kết bằng 1

Chúi thích:
Giải thuât đọc dãy sắp xếp là một trong những giải thuật căn bản của lập trình dùng để phân loại, đếm, và lọc duy nhất.
Chỉ là kể từ khi GPE khám phá ra cái đít sần thì họ thấy tiện lợi hơn nên cứ dùng mãi. Đến nổi về sau này không có mấy người còn nhớ thuật toán đọc dãy sắp xếp.
 
Lần chỉnh sửa cuối:
Upvote 0
Phân tích:
- Dãy số của bạn đã sắp xếp.
- Số có 12 chữ số, tức là còn trong hạn định 15 chữ số của máy tính.
- Nếu hai điều kiện trên đúng thì chi tiết 01 đến 10 không quan trọng. Trừ phi bạn muốn 893404449140 và 893404449141 là hai dãy khác nhau.

Muốn tìm những khúc số nối tiếp nhau thì có thể áp dụng giải thuật đọc dãy sắp xếp:
- đọc số đầu tiên, ghi vào cột 1
- tiếp tục đọc từ trên xuống dưới (vòng lặp)
- nếu lớn hơn số trước đó + 1 thì:
-- ghi số trước đó vào cột 2
-- ghi (số trước đó) - (số ở cột 1) + 1 vào cột 3
-- tăng 1 dòng
-- ghi số mới vào cột 1
Nếu 893404449140 và 893404449141 là hai dãy khác nhau thì cần thêm một chút ở chỗ so sánh [nếu lớn hơn số trước đó + 1] : hoặc số kết bằng 1

Chúi thích:
Giải thuât đọc dãy sắp xếp là một trong những giải thuật căn bản của lập trình dùng để phân loại, đếm, và lọc duy nhất.
Chỉ là kể từ khi GPE khám phá ra cái đít sần thì họ thấy tiện lợi hơn nên cứ dùng mãi. Đến nổi về sau này không có mấy người còn nhớ thuật toán đọc dãy sắp xếp.
Con cám ơn Chú đã gợi ý. Để con ngồi đọc cái của Chú và Thầy @HieuCD xem ngộ ra được không ạ
 
Upvote 0
Sorry, đọc chưa kỹ nên tưởng code sai.
 
Upvote 0
Tôi không hiểu chuyện seri 10 là thế nào. Là chia dữ liệu cột A thành từng nhóm ĐÚNG 10 dòng rồi xét RIÊNG RẼ từng nhóm?

Nếu thế thì nhóm 3 gồm các dòng từ A23 = 893405007063, tới A32 = 893413646888. Và kết quả phải là

893413646882 893413646888

chứ nhỉ.

Mà thôi, không hiểu đề bài nên tôi không tham gia.
 
Upvote 0
Nếu thế thì nhóm 3 gồm các dòng từ A23 = 893405007063, tới A32 = 893413646888. Và kết quả phải là

893413646882 893413646888

chứ nhỉ.
Con xin giải thích thêm thế này ạ
Cái này chính là số seri trong 1 quyển Bảo hiểm oto, xe máy ấy ạ. (1 quyển gồm 10 tờ = 10 số seri liên tăng liên tục theo số thứ tự) như chú @VetMini nói:
- Nếu hai điều kiện trên đúng thì chi tiết 01 đến 10 không quan trọng
Lúc xuất bán đi thì có thể hỏng hoặc bán không hết còn lại, Nên muốn gom lại theo số seri của từng tờ nếu nó cứ liên tục tăng thêm theo số thứ tự á
 
Upvote 0
Web KT
Back
Top Bottom