Hỏi về bài toán chỉ lấy giới hạn đầu và giới hạn cuối của số (1 người xem)

Liên hệ QC

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

hongquanjp

Thành viên mới
Tham gia
7/3/09
Bài viết
25
Được thích
6
Em có bài toán thế này :
Bên dưới là 1 dãy số, tương ứng mỗi ô là 1 số nguyên như bên dưới.
Làm thế nào để khi chỉ lấy kết quả của số đầu và số cuối
1 2 3 5 6 7 20 21 22

Mong muốn của bài toán là ra kết quả như sau
kết quả = 1-3,5-7,20-22

Vắt nát cả óc mà không thể nào nghĩ ra được
Bác nào cho em xin chút ý kiến với
 
Em có bài toán thế này :
Bên dưới là 1 dãy số, tương ứng mỗi ô là 1 số nguyên như bên dưới.
Làm thế nào để khi chỉ lấy kết quả của số đầu và số cuối
1 2 3 5 6 7 20 21 22

Mong muốn của bài toán là ra kết quả như sau
kết quả = 1-3,5-7,20-22

Vắt nát cả óc mà không thể nào nghĩ ra được
Bác nào cho em xin chút ý kiến với
Các cặp 2-5, 6-20.. lấy không bạn?
Cặp đầu tiên luôn xuất phát số đầu tiên hay số tự chọn?
rồi các cặp đó nối nhau bằng dấu "," phải không?
Chắc phải dùng VBA thôi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn nói lấy số đầu và số cuối của dãy số, nếu vậy kết quả phải là 1-22 chứ sao lại nhiều kết quả vậy bạn.
 
Upvote 0
Tức là mình muốn :tim trong dãy số đó kiểm tra từ số đầu tiên là 1, đếm tiếp nếu ô kế tiếp = ô trước +1 thì tiếp tục đếmNếu không thoả điều kiện thì dừng tại số đó và lấy kết quả giá trị điểm đầu và điểm cuối của lần đếm này. Sau đó cứ tiếp tục thuật toán đến khi nào hết thì thôiSau đó tổng hợp các kết quả đếm...ôi khó quá, các bác giúp em với
 
Upvote 0
Các cặp 2-5, 6-20.. lấy không bạn?
Cặp đầu tiên luôn xuất phát số đầu tiên hay số tự chọn?
rồi các cặp đó nối nhau bằng dấu "," phải không?
Chắc phải dùng VBA thôi

Mình muốn lấy bắt đầu từ số đầu tiên luôn.
Đếm khi nào không thoả điều kiện thì dừng lại, lấy kết quả đầu
Ví dụ : Đếm lần 1 : Bắt đầu từ số 1 đếm thì được kết quả của lần đầu là 1-3
Sau đó vòng đếm kế tiếp sẽ bắt đầu từ con số 5..lại đếm...lại ra kết quả lần này là 5-7..

Tiếp tục cuối cùng mong muốn là : Tổng = 1-3,5-7,20-22

Mong nhận được sự trợ giúp từ các bác
 
Upvote 0
Cám ơn bac viehoai nhé.
Bác pờ rồ quá, chính xác là nó đây rồi
 
Upvote 0
Mình muốn lấy bắt đầu từ số đầu tiên luôn.
Đếm khi nào không thoả điều kiện thì dừng lại, lấy kết quả đầu
Ví dụ : Đếm lần 1 : Bắt đầu từ số 1 đếm thì được kết quả của lần đầu là 1-3
Sau đó vòng đếm kế tiếp sẽ bắt đầu từ con số 5..lại đếm...lại ra kết quả lần này là 5-7..

Tiếp tục cuối cùng mong muốn là : Tổng = 1-3,5-7,20-22

Mong nhận được sự trợ giúp từ các bác
Chẳng hiểu đếm như thế nào và thỏa mãn điều kiện như thế nào
 
Upvote 0
Chẳng hiểu đếm như thế nào và thỏa mãn điều kiện như thế nào
****************
Sub NoiPT()
Dim Arr()
Dim i As Long
Dim Tmp As String
On Error GoTo Thoat
Arr = Sheet1.Range("A1:I1").Value
For i = 1 To UBound(Arr, 2) Step 3
If i + 2 > UBound(Arr, 2) Then Exit For
Tmp = Tmp & Arr(1, i) & "-" & Arr(1, 2 + i) & " , "
Next
Sheet1.Range("A5").Value = Left(Tmp, Len(Tmp) - 3)
Thoat:
End Sub

****************

Bác ơi, cái này là trường hợp bác nhìnthấy rõ là bước step 3 như thế
Nhưng ý của em là :
ví dụ : trong dãy số
1 2 3 6,7,11,16,18,19,20,101,109,120,122,123,124
thì muốn kết quả như thế này :
Kết quả = 1-3,6-7,11,16,18-20,101,109,120,122-124

hix, quả thực thấy cũng hơi khoai
 
Upvote 0
****************
Sub NoiPT()
Dim Arr()
Dim i As Long
Dim Tmp As String
On Error GoTo Thoat
Arr = Sheet1.Range("A1:I1").Value
For i = 1 To UBound(Arr, 2) Step 3
If i + 2 > UBound(Arr, 2) Then Exit For
Tmp = Tmp & Arr(1, i) & "-" & Arr(1, 2 + i) & " , "
Next
Sheet1.Range("A5").Value = Left(Tmp, Len(Tmp) - 3)
Thoat:
End Sub

****************

Bác ơi, cái này là trường hợp bác nhìnthấy rõ là bước step 3 như thế
Nhưng ý của em là :
ví dụ : trong dãy số
1 2 3 6,7,11,16,18,19,20,101,109,120,122,123,124
thì muốn kết quả như thế này :
Kết quả = 1-3,6-7,11,16,18-20,101,109,120,122-124

hix, quả thực thấy cũng hơi khoai

Nếu bạn cần cấp cứu gấp mà bạn không biết cung cấp thông tin như thế này thì đến lúc người ta hiểu được bạn thì e ... đã muộn rồi.
Bài 1 bạn "ú ớ" nên khó hiểu. Bài 2 bạn giải thích thế này:
đếm tiếp nếu ô kế tiếp = ô trước +1 thì tiếp tục đếm
Bạn nói là với dãy 1 2 3 5 6 7 20 21 22 thì lấy 1-3.
Nhưng như thế thì không theo qui tắc như trên. Vì sao? Vì 2, 3 chúng ở 2 ô liên tiếp (2 ở ô trước còn 3 ở ô kế tiếp), vậy tại sao lại dừng ở 3?
Tôi nghĩ là bạn định giải thích thế này.
Ta có nhiều lần đếm như sau:
Lần đếm đầu tiên xuất phát từ số đầu tiên. Ta kiểm tra từ số sau số xuất phát, nếu = số xuất phát + 1 thì kiểm tra số tiếp theo cho tới tận khi tới số cuối cùng hoặc số hiện hành <> số xuất phát + 1 thì dừng. Nếu số ở vị trí dừng <> số xuất phát + 1 (vì có th từ số xuất phát tới số cuối đều = số xuất phát + 1) thì ta kết thúc một lần đếm và lấy cặp (số xuất phát - số dừng). Các lần đếm tiếp theo bắt đầu từ số sau số dừng của lần đếm trước.
Nhưng nó lại không khớp với bài cuối của bạn. Vì bạn cho dãy 1 2 3 6,7,11,16,18,19,20,101,109,120,122,123,124
và bạn nói là lấy: Kết quả = 1-3,6-7,11,16,18-20,101,109,120,122-124
trong khi đó theo "đoán" của tôi thì phải là:
Kết quả = 1-3, 6-11, 16-18, 19-101, 109-120, 122-124

Thuật toán chả có gì cả, cái khó nhất là tìm được phiên dịch để dịch lời của bạn ra ngôn ngữ dễ hiểu
 
Upvote 0
****************
Sub NoiPT()
Dim Arr()
Dim i As Long
Dim Tmp As String
On Error GoTo Thoat
Arr = Sheet1.Range("A1:I1").Value
For i = 1 To UBound(Arr, 2) Step 3
If i + 2 > UBound(Arr, 2) Then Exit For
Tmp = Tmp & Arr(1, i) & "-" & Arr(1, 2 + i) & " , "
Next
Sheet1.Range("A5").Value = Left(Tmp, Len(Tmp) - 3)
Thoat:
End Sub

****************

Bác ơi, cái này là trường hợp bác nhìnthấy rõ là bước step 3 như thế
Nhưng ý của em là :
ví dụ : trong dãy số
1 2 3 6,7,11,16,18,19,20,101,109,120,122,123,124
thì muốn kết quả như thế này :
Kết quả = 1-3,6-7,11,16,18-20,101,109,120,122-124

hix, quả thực thấy cũng hơi khoai
Bạn nói trái ngược nhau quá. Bạn xem file cái nào đúng, nếu sai nói rõ rãng hơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
****************
Sub NoiPT()
Dim Arr()
Dim i As Long
Dim Tmp As String
On Error GoTo Thoat
Arr = Sheet1.Range("A1:I1").Value
For i = 1 To UBound(Arr, 2) Step 3
If i + 2 > UBound(Arr, 2) Then Exit For
Tmp = Tmp & Arr(1, i) & "-" & Arr(1, 2 + i) & " , "
Next
Sheet1.Range("A5").Value = Left(Tmp, Len(Tmp) - 3)
Thoat:
End Sub

****************

Bác ơi, cái này là trường hợp bác nhìnthấy rõ là bước step 3 như thế
Nhưng ý của em là :
ví dụ : trong dãy số
1 2 3 6,7,11,16,18,19,20,101,109,120,122,123,124
thì muốn kết quả như thế này :
Kết quả = 1-3,6-7,11,16,18-20,101,109,120,122-124

hix, quả thực thấy cũng hơi khoai
Hình như là thế này
Thử sửa dữ liệu rồi bấm vào cái mũi tên
Hy vọng.....trúng
Nếu chưa trúng thì.....giải thích tiếp nhé
:=\+Híc:=\+
 

File đính kèm

Upvote 0
Bạn nói trái ngược nhau quá. Bạn xem file cái nào đúng, nếu sai nói rõ rãng hơn

Bây giờ mới có thời gian lên mạng
Cám ơn bác quá...

Và kết quả mong muốn của em là : hàm capso2
Rất xin lỗi vì em trình bày nội dung không được cụ thể dẫn đến cái vấn đề thành ra phức tạp

Rất thanks bác
 
Upvote 0
Bác viehoai ơi, em thử cái của bác rồi
3 cái không cái nào đúng cả

Kết quả em cần là :
= 3,6-7,11,16,18-20,101,109,120,122-124

Cái hàm CapSo2 của bác tí nữa thì đúng
Hàm CapSo2 của bác trả về là :
1-3, 6-11, 16, 18-20, 101, 109, 120, 122-124
Tại điểm 6 và 7 thì nó lại kéo đến 11. Nếu chỗ đó 6-7,11 chứ không phải 6-11 thì đúng bác à...

Cám ơn bác
 
Upvote 0
Bác viehoai ơi, em thử cái của bác rồi
3 cái không cái nào đúng cả

Kết quả em cần là :
= 3,6-7,11,16,18-20,101,109,120,122-124

Cái hàm CapSo2 của bác tí nữa thì đúng
Hàm CapSo2 của bác trả về là :
1-3, 6-11, 16, 18-20, 101, 109, 120, 122-124
Tại điểm 6 và 7 thì nó lại kéo đến 11. Nếu chỗ đó 6-7,11 chứ không phải 6-11 thì đúng bác à...

Cám ơn bác
Vậy thì sửa code hàm CapSo2() lại một tí
Mã:
[B]​[/B]Function CapSo2(Rng As Range) As StringDim Arr()
Dim i As Long, k As Long
Dim Tmp As String
'On Error Resume Next
Arr = Rng.Value
i = 1
Do
    If Arr(1, i + 1) = Arr(1, i) + 1 And i + 1 < UBound(Arr, 2) Then
      If Arr(1, i + 2) = Arr(1, i + 1) + 1 Then
       Tmp = Tmp & Arr(1, i) & "-" & Arr(1, i + 2) & ", "
       i = i + 3
      Else
       Tmp = Tmp & Arr(1, i) & "-" & Arr(1, i + 1) & ", "
       i = i + 2
      End If
    Else
     Tmp = Tmp & Arr(1, i) & ", "
     i = i + 1
    End If
Loop Until i + 2 > UBound(Arr, 2)
CapSo2 = Left(Tmp, Len(Tmp) - 2)
End Function
Nếu như thế này được rồi thì bạn cải tiến code để dữ liệu dạng hàng hoặc cột đều áp dụng được
 
Upvote 0
Web KT

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

Back
Top Bottom