Sắp xếp sinh nhật trong Excel VBA
Dưới đây chúng ta sẽ xem xét một chương trình trong Excel VBA sắp xếp sinh nhật theo tháng đầu tiên và ngày thứ hai (vì vậy chúng tôi bỏ qua năm). Chúng tôi muốn sinh nhật có số tháng thấp nhất ở vị trí đầu tiên. Nếu có sinh nhật với số tháng bằng nhau, trước tiên chúng ta muốn sinh nhật có số ngày thấp nhất. Bạn đã sẵn sàng chưa? Tình huống:
Lưu ý: Ngày ở Định dạng Hoa Kỳ. Tháng đầu tiên, Ngày thứ hai. Loại định dạng này phụ thuộc vào cài đặt khu vực cửa sổ của bạn.
-
Đầu tiên, chúng tôi khai báo tám biến. Một biến Ngày chúng tôi gọi là tempDate, một biến Chuỗi chúng tôi gọi là tempName. Sáu biến còn lại là biến Số nguyên với các tên monthToCheck, dayToCheck, monthNext, dayNext, i và j.
Dim tempDate As Date, tempName As String Dim monthToCheck As Integer, dayToCheck As Integer, monthNext As Integer, dayNext As Integer, i As Integer, j As Integer
-
Chúng tôi bắt đầu hai vòng lặp For Next.
For i = 2 To 13 For j = i + 1 To 13
Ví dụ: với i = 2, j = 3, 4, …, 12 và 13 được kiểm tra.
-
Chúng tôi khởi tạo bốn biến Integer. Chúng ta sử dụng hàm Tháng để lấy tháng của ngày và hàm Ngày để lấy ngày của một ngày.
monthToCheck = month(Cells(i, 2).Value) dayToCheck = day(Cells(i, 2).Value) monthNext = month(Cells(j, 2).Value) dayNext = day(Cells(j, 2).Value)
Ví dụ: ở đầu, for i = 2; ngày của Bregje, và j = i + 1 = 2 + 1 = 3; ngày của Niels sẽ được chọn.
-
Để sắp xếp các ngày đúng cách, chúng ta so sánh ngày đầu tiên (monthToCheck và dayToCheck) với ngày tiếp theo (monthNext và dayNext). Nếu ngày tiếp theo là ‘thấp hơn’, chúng tôi hoán đổi ngày và tên. Thêm câu lệnh If Then sau đây.
If (monthNext < monthToCheck) Or (monthNext = monthToCheck And dayNext < dayToCheck) Then End If
Nếu tuyên bố trên là đúng, chúng tôi hoán đổi ngày và tên.
Ví dụ: đối với i = 2 và j = 3, ngày của Bregje và Niels được kiểm tra. MonthNext = 6, monthToCheck = 2. Câu lệnh trên không đúng vì monthNext cao hơn monthToCheck. Excel VBA tăng j lên 1 và lặp lại các dòng mã cho i = 2 và j = 4. Bạn có thể dễ dàng thấy rằng Joost (j = 4) có số tháng cao hơn Bregje, vì vậy chúng ta chuyển sang phần tiếp theo. Chúng ta nhận được kết quả tương tự cho j = 5 và j = 6. Khi chúng ta đến j = 7, chúng ta có các biến sau: monthNext = 2 và dayNext = 9. MonthToCheck = 2 và dayToCheck = 12. Bây giờ câu lệnh trên là đúng kể từ monthNext = monthToCheck và dayNext (9) thấp hơn dayToCheck (12).
-
Chúng tôi
liên kết: / vba -amples-swap-values [swap]
các ngày tháng. Chúng tôi tạm thời lưu trữ một ngày vào tempDate, để Excel VBA có thể hoán đổi ngày đúng cách. Thêm các dòng mã sau vào câu lệnh If.
'swap dates tempDate = Cells(i, 2).Value Cells(i, 2).Value = Cells(j, 2).Value Cells(j, 2).Value = tempDate
-
Chúng tôi làm tương tự với các tên. Thêm các dòng mã sau vào câu lệnh If.
'swap names tempName = Cells(i, 1).Value Cells(i, 1).Value = Cells(j, 1).Value Cells(j, 1).Value = tempName
-
Chúng ta đóng vòng lặp For Next thứ hai (Bên ngoài câu lệnh If).
Next j
Đối với i = 2 và j = 7, Excel VBA đã hoán đổi ngày và tên. Điều đó có nghĩa là chúng tôi nhận được Richard ở vị trí đầu tiên và Bregje ở vị trí 7. Điều đó cũng có nghĩa là chúng tôi nhận được một thángToCheck mới và dayToCheck khi bắt đầu lần lặp tiếp theo của chúng tôi (cho i = 2 và j = 8). Bây giờ chúng ta sẽ so sánh Richard với Dineke (j = 8). Bạn có thể dễ dàng nhận thấy rằng không cần phải thay thế các ngày và tên đó vì Richard có ngày ‘thấp hơn’. Trên thực tế, không cần phải thay Richard (i = 2) bằng Jan (j = 9), Wendy (j = 10), Jeroen (j = 11), John (j = 12) và Debby (j = 13). Đó là bởi vì Richard có ngày ‘thấp nhất’. Bằng cách này, Excel VBA sẽ nhận được (đối với i = 2) ngày ‘thấp nhất’ ở vị trí đầu tiên. Để có ngày ‘thấp nhất’ thứ hai ở vị trí thứ hai, Excel VBA lặp lại các bước tương tự chính xác cho i = 3. Để có ngày ‘thấp nhất’ thứ ba ở vị trí thứ ba, Excel VBA lặp lại các bước chính xác tương tự cho i = 4, vv
-
Đóng vòng lặp For Next đầu tiên (Bên ngoài câu lệnh If).
Next i
-
Kiểm tra chương trình của bạn.
Kết quả: