Tại dãy số tăng dần theo danh sách số cho trước (2 người xem)

Liên hệ QC

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

heyhey1994

Thành viên chính thức
Tham gia
16/3/17
Bài viết
78
Được thích
17
Em có 1 dãy số hàng dọc ở cột A, bây giờ em em tạo 1 cái button, click cái là nó sẽ hiện ra như cột B. Anh chị nào giúp em với ạ :D
upload_2017-7-15_20-49-46.png
 
Theo tôi sẽ viết code như sau
Tạo day số từ 1 đến trúnc( max) của range
Gán dãy số đó vào cột b
Copy range hiện tại vào dưới dãy số vừa tạo.
Dùng remove duplicate hoặc advanced filter Để lấy Duy nhất
Sort A_z
Có ngay kết quả.
Thích cách này nhất! Đơn giản, thuần Excel, ai cũng làm được và thậm chí làm bằng tay cũng xong
 
Upvote 0
Thích cách này nhất! Đơn giản, thuần Excel, ai cũng làm được và thậm chí làm bằng tay cũng xong

Tôi nghĩ là các bạn ở đây chỉ viết code chơi cho vui thôi. Chứ loại bài dữ liệu quái đản thế này tôi phải hỏi lại dùng làm gì trước khi thực sự phân tích cách giải.
Lắm lúc nắm được mục đích rồi thì cách làm khác hoàn toàn.
 
Upvote 0
Gải thuật thô: nhìn sơ qua thì đề bài là một khoảng số, với nhiều khoảng con không đều nhau. Thêm điều kiện là các khoảng con bắt đầu bằng một số nguyên nhưng kết thúc là số thập phân.
Sau đó, chủ thớt thêm điều kiện nếu khoảng con kết thúc là số nguyên thì khoảng con kế tiếp cũng bắt đầu từ số nguyên ấy (thay vì số nguyên kế tiếp).

Code thô để diễn tả giải thuật trên. Gồm 2 vòng lặp, vòng ngoài duyệt qua khoảng mẹ để lấy từng khoảng con, và vòng trong duyệt qua mỗi khoảng con.
Chỉ cần để ý 3 chỗ:
Chỗ thứ nhất là vì điểm cuối cùng của khoảng con có thể là số thập phân cho nên vòng lặp duyệt khoảng con phải tìm một số nguyên bao qua trị này. (hàm ceiling)
Chỗ thứ ba là vì có vấn đề "số nguyên bao qua" cho nên lúc chép sô phải xét lại xem nó có phải là số bao qua hay không (hàm IIf(num > valIn...))
Chỗ thứ ba là vì vòng lặp for kết thúc khi chỉ số đếm vượt qua điểm cuối. Vì vậy, sau khi dứt vòng con thì lấy chỉ số này trừ đi 1 sẽ ra điểm bắt đầu của khoảng con kế tiếp. (numStrt = num - 1)

Mã:
Sub ChaHieuMucDich()
Dim aIn, aOut(1 To 65535, 1 To 2)
Dim iIn As Long, iOut As Long, numStrt As Long, num As Long
Dim valIn As Double
aIn = Range("A1", Range("A65535").End(3)).Resize(, 2).Value
numStrt = 1
For iIn = 1 To UBound(aIn) ' duyet lay tung khoang con
    valIn = aIn(iIn, 2)
    For num = numStrt To Application.Ceiling(valIn, 1) ' duyet khoang con
        iOut = iOut + 1
        aOut(iOut, 1) = aIn(iIn, 1)
        aOut(iOut, 2) = IIf(num > valIn, valIn, num) ' ghi cho dung tri
    Next num
    numStrt = num - 1
    ' muon thu chia 10 gi gi do thi thu va chinh sua numStrt o day
Next iIn
Range("c1").Resize(iOut, 2) = aOut
End Sub
 
Upvote 0
Em cảm ơn tất cả anh chị giúp em ạ. :) Cuối cùng em cũng làm xong bảng tính của mình rồi. Hôm nay sực nhớ là chưa có lên cảm ơn nên giờ quay lại cảm ơn :D Chúc anh chị có 1 tuần làm việc tốt lành :)
 
Upvote 0
Web KT

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

Back
Top Bottom