Bài tập VBA cho người mới bắt đầu

  • Thread starter Thread starter SA_DQ
  • Ngày gửi Ngày gửi
Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,567
Được thích
22,873
Nghề nghiệp
U80
Các bạn viết cho 1 macro để ta có được kết quả như bảng sau:

2/29/2004​
2/29/2016​
2/29/2000​
2/29/2012​
2/29/2024​
2/29/2008​
2/29/2020​
2/29/2032​
2/29/2044​
2/29/2028​
2/29/2040​
2/29/2052​
2/29/2036​
2/29/2048​
2/29/2060​
2/29/2072​
2/29/2056​
2/29/2068​
2/29/2080​
2/29/2064​
2/29/2076​
2/29/2088​
2/29/2084​
2/29/2096​
2/29/2092​
 
Trình độ chẳng ra gì: (tôi muốn gọi "cao cấp" lắm nhưng tránh người ta phê mình tự phụ, thành ra loãng code)

Bài này là bài tập kinh điển trong lập trình C.
int SoNgay(int thang, int nam)
{
switch (thang)
{
case 2:
return ((thang%400=0||thang%4=0&&thang%100!=0)? 28 : 29);
case 4: case 6: case 9: case 11: return 30;
default: return 31;
}
}
C có đặc điểm là có thể đi tắt, không cần tính các điều kiện khác nếu nó cho rằng đến đó đủ xác định rồi. Vì vậy code trên rất hiệu quả, đi thẳng đến các label và drop trhu nếu cần.
Tháng 2: năm chia chẵn cho 400 là nó biết rồi, không tính chỗ còn lại.
Nếu không chia chẵn 400 thì do Or (||) nó buộc tính tiếp, nếu chia chẵn 4 thì do && nó lại phải tính tiếp con toán chia chẵn 100. Vì số không chia chẵn 4 có tỷ lệ áp đảo 3/1 nên tôi cho nó tính trước.

Code JavaScript cũng gần giống C
function SoNgay {
switch (thang) {
case 2:
return ((thang%400=0||thang%4=0&&thang%100!=0)? 28 : 29);
case 4: case 6: case 9: case 11: return 30;
default: return 31;
}
}
Bi giờ chỉ cần viết code VBA gọi hàm này qua MSScriptControl.ScriptControl
 
Lần chỉnh sửa cuối:
Upvote 0
Base 1 thì code chết tươi, bác ạ.
Tôi sai ở khai báo thứ hai (vì sao khai báo và sử dụng 2 cách thì chẳng biết). Còn khai báo thứ nhất của 12 tháng thì sẽ không lỗi thật.
Ngoài ra, 0 và 1 là LBound chứ không phải UBound
 
Upvote 0
Hình như đề bài cấm dùng If, cho dùng Case. Code sơ cấp:
Mã:
Select Case Th
    Case 1, 3, 5, 7, 8, 10, 12
        Ngay = 31
    Case 4, 6, 9, 11
        Ngay = 30
    Case 2
        'Tính cho tháng 2
    Case Else
         Ngay = "zô ziên"
End Select
 
Upvote 0
Hình như đề bài cấm dùng If, cho dùng Case. Code sơ cấp:
Mã:
Select Case Th
    Case 1, 3, 5, 7, 8, 10, 12
        Ngay = 31
    Case 4, 6, 9, 11
        Ngay = 30
    Case 2
        'Tính cho tháng 2
    Case Else
         Ngay = "zô ziên"
End Select
Bậc này là trung cấp, bác ơi. Bác sẽ ngạc nhiên khi tôi nói với bác rằng trên GPE này còn nhiều người chưa nắm vững sự khác biệt giữa Select và IF (*)
Bài này bậc sơ cấp là dùng hàm VBA, điển hình là code bài #56
Ở bậc trung cấp, tôi cố tình ra điều kiện "không IF" là để test khả năng sử dụng các lệnh rẽ nhánh có điều kiện.

Chú thích (*): Select thay thế IF là một kỹ thuật code bị VBA xem thường vì nó không thuần túy là lệnh "rẽ đến labels" như các ngôn ngữ hiện đại khác.
Một trong những lợi ích khác mà sách vở tiếng Việt không đề cập tới là tuy IF hiệu quả hơn, nhưng khi gặp đúng chỗ, Select có thể chỉ phải tính có số đầu 1 lần trong khi IF phải tính nhiều.
IF (a+b) = 1 OR (a+b) = 10 Then ' ' (a+1) tính 2 lần, so sánh 2 lần
Select (a+b) ' (a+1) tính 1 lần
Case 1, 10 ' tuy vẫn so sánh 2 lần

Chú thích 2: lệnh rẽ đến labels là lệnh rất hiệu quả (lênh switch trong JavaScript). Bài #61 tuy ngoại đạo (dùng ngôn ngữ khác) nhưng tôi đưa vào để ví dụ cho thấy sự hiệu quả của nó.
Bàu #53 trông rườm rà nhưng đó là cách diễn giải gần sát nhất theo VBA.
 
Upvote 0
Bậc này là trung cấp, bác ơi.
Tôi chỉ biết rằng Select Case đọc code ở #64 hiểu ngay lập tức không cần ghi chú. Case Else là nâng cao 1 chút khi dự phòng người dùng dùng sai loại dữ liệu cho hàm, chứ không phải Case Else cho tháng 2 (Case 2 mà đổi thành Case Else nghĩa là mặc định người dùng thông minh không điền 13 trở lên hoặc text)
Lẽ ra nên có 1 điều kiên "nam" > = 1900 nhưng lại cơ bản quá.
 
Upvote 0
Tôi chỉ biết rằng Select Case đọc code ở #64 hiểu ngay lập tức không cần ghi chú. ...
IF-Then-ElseIf cũng là loại dễ hiểu.
Chỗ tôi nhấn mạnh ở vài #65 là "khi nào thì "Select case" hơn hẳn If:
- Khi mà trị Select chỉ cần tính 1 lần, và nếu dùng If-Then-ElseIf thì phải tính nhiều lần.
Khi nào thì IF hơn hẳn:
- If là lệnh căn bản của chính mã máy cho nên nhanh hơn các kiểu rẽ nhánh có điều kiện khác. Vì vậy, lúc không chắc thì If là tốt nhất.

Lẽ ra nên có 1 điều kiên "nam" > = 1900 nhưng lại cơ bản quá.
Chính IBM đã bỏ năm 1900 khi hợp đồng cho Micro-Soft viết mã DOS cho PC thì tội gì ta phải tính?

Chú: ngày xưa, MicroSoft là hai từ nối, và tiêu chuẩn ngày xưa thì hai từ nối phải có gạch ở giữa. Sau này có sự đồng ý không thành văn của các tập đoàn là không dùng "-" nữa.
 
Upvote 0
Chính IBM đã bỏ năm 1900 khi hợp đồng cho Micro-Soft viết mã DOS cho PC thì tội gì ta phải tính?
Ý tôi là bắt lỗi người dùng, giả sử người dùng hàm viết công thức =Ngay(2, 520) thì trả kết quả là "Em hỏng biết" chẳng hạn. Hoặc điền tham số <nam> bằng 1 text
 
Upvote 0
Đầu Xuân năm mới thì: em xin chúc các bác ngon lành cành đào y năm cũ!!!

_)(#; _)(#; _)(#; _)(#; _)(#; _)(#; _)(#; _)(#; _)(#;


Còn các code trên thì: """"""""THẬT LÀ BÁ ĐẠO""""""""

_)(#; _)(#; _)(#;_)(#;
 
Upvote 0
Web KT

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

Back
Top Bottom