Bài tập VBA đơn giản dành cho người mới bắt đầu [Phần 2]

Liên hệ QC

ChanhTQ@

0901452không62
Tham gia
5/9/08
Bài viết
4,254
Được thích
4,861
Xin các bạn có bài tập nào hay hay đăng lên để cùng nhau luyện cho mau tiến bộ nhe!
Mình xin mở màn bài đầu:
ĐỀ BÀI 1:

Tôi có bảng số liệu từ cột [A..E] như sau:

| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W 2 |HoTen|Date1|Date2|Date3|Date4|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18
3 |Hồ Lễ|3|5|7|13|Do|Do|Do|Xh|Xh|Vg|Vg|Tm|Tm|Tm|Tm|Tm|Tm||.|||
4 |Đỗ Nè|4|8|13|15|Nu|Nu|Nu|Nu|Xh|Xh|Xh|Xh|Xm|Xm|Xm|Xm|Xm|Dn|Dn|||
5 |Vũ Xe|2|4|12|13|Do|Do|Vg|Vg|Nu|Nu|Nu|Nu|Nu|Nu|Nu|Nu|Hg|||.|||

Phần từ cột [F] trở đi là phần cần viết 1 macro để nó tô màu nền khác nhau theo những giá trị cùng dòng từ cột [B..E];
Màu tô do bạn tự chọn, cốt fân biệt giữa chúng & dịu mắt là được!


PHẦN TỔNG HỢP CÁC ĐỀ BÀI TẬP:

Tên|Tóm tắc|Bài thứ
Đề bài 1|Tô màu theo trị số các ô bên trái cùng dòng| #1
Đề bài 1A|Lọc theo các số cần thiết từ các chuỗi số| #73
Đề bài 1B|Xác định loại tam giác dựa trên 3 số ngẫu nhiên được tạo ra| #82
Đề bài 2|Lập danh sách học sinh theo từng lớp| #11
Đề bài 2A|Dịch ngôn ngữ VBA sang tiếng Việt| #19
BĐT(*)|Lập danh sách các nữ HS có ngày sinh trong 1 quí| #101
Đề bài 3|Thống kế kết quả điểm của từng lớp theo từng môn học| #22
Đề bài 4|Lập danh sách HS các lớp đạt điểm cực trị của từng môn| #46
Đề bài 4A|Tìm trong danh sách thí sinh, số báo danh nào có tổng điểm các môn cao nhất| #94
Đề bài 5|Thống kê từng khoảng điểm của môn học| #58
Đề bài 6|Thống kê điểm trung bình theo giới tính| #71

(*) BĐT: Bài đọc thêm

.
.
.
 
Lần chỉnh sửa cuối:
Bài đọc thêm: Lọc danh sách các em nữ, sinh theo các quí khác nhau.

Trên nền CSDL của bài #46, chúng ta tự đề ra nhiệm vụ cho mình là lọc ra danh sách các em nữ sinh của trường có ngày tháng sinh vào quí nào đó (như quí II) chảng hạn.

Vì đây là danh sách học sinh fổ thông, nên tuổi của các em không chênh nhau là bao nhiêu.
Bỡi vậy mình đề xuất cách lọc như trong file; Trong thực tiển cuộc sống chuyện này khó áp dụng rọng rãi trong các cơ quan, xí nghiệp. Vì ở đó độ rọng tuổi là quá lớn.
Trong trường hợp là CQ/xí nghiệp, chúng ta fải tìm cách làm khác

Sau khi đọc xong bài, rất mong các bạn thử sức mình với 1 trong các nhiệm vụ sau:

(*) Lọc thử danh sách HS nam theo các quí.

(*) Lọc & xếp theo tuần tự tăng dần theo ngày tháng sinh của các em trong quí;

(*) Lọc danh sách sinh nhật theo quí của các nhân viên toàn cơ quan/xí nghiệp (Độ tuổi lao động)
 

File đính kèm

  • gpeBaiTap.rar
    50.8 KB · Đọc: 18
Upvote 0
Bài tập TVT (Tìm vị trí trong chuỗi)

(A) Giả dụ tôi có 1 chuỗi gốc là "GIAIPHAPEXCEL.COM"

Nhiệm vụ đề ra là tìm & liệt kê vị trí lần lượt các kí tự trong cụm "GPE.COM" có trong chuỗi góc trên
(Đáp án: 1_5_9_14_11_16_17)

(B) Giả dụ chuỗi gốc của tôi bây giờ là "ABAEBAC"
Cũng nhiệm vụ trên, tôi cần có đáp án là: "1_2_3_6_7" khi tìm vị trí của "ABAAC"
(Có nghĩa là con số 6 trong đáp án chỉ ra vị trí thứ 3 của "A" trong chuỗi gốc.)

Chúc các bạn thành công zới vòng lặp For. . .Next thôi nha!
 
Upvote 0
(A) Giả dụ tôi có 1 chuỗi gốc là "GIAIPHAPEXCEL.COM"

Nhiệm vụ đề ra là tìm & liệt kê vị trí lần lượt các kí tự trong cụm "GPE.COM" có trong chuỗi góc trên
(Đáp án: 1_5_9_14_11_16_17)

(B) Giả dụ chuỗi gốc của tôi bây giờ là "ABAEBAC"
Cũng nhiệm vụ trên, tôi cần có đáp án là: "1_2_3_6_7" khi tìm vị trí của "ABAAC"
(Có nghĩa là con số 6 trong đáp án chỉ ra vị trí thứ 3 của "A" trong chuỗi gốc.)

Chúc các bạn thành công zới vòng lặp For. . .Next thôi nha!
bài tập này cho người mới bắt đầu cũng hơi căng đó, nếu xét từng ký tự phải 2 vòng lặp, rồi sau đó sắp xếp các số thứ tự lại nữa?
 
Upvote 0
. . . cũng hơi căng đó, nếu xét từng ký tự phải 2 vòng lặp, rồi sau đó sắp xếp các số thứ tự lại nữa?
Có thể xài chỉ 1 vòng lặp thôi, thêm 1 mẹo nhỏ là . . .
--=0 --=0 --=0
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
bài tập này cho người mới bắt đầu cũng hơi căng đó, nếu xét từng ký tự phải 2 vòng lặp, rồi sau đó sắp xếp các số thứ tự lại nữa?

Tôi tưởng chỉ 1 vòng lập là được chứ!
???!!!
Ẹc... Ẹc...
(hàm InStr(Start.... chú ý chỗ Start là được rồi)
 
Upvote 0
Các cao thủ cứ tranh luận ko khéo lại đưa đáp án luôn bây giờ đó. Các thầy cứ bình tĩnh để các thành viên mới học tham gia ạ!
 
Upvote 0
Các cao thủ cứ tranh luận ko khéo lại đưa đáp án luôn bây giờ đó. Các thầy cứ bình tĩnh để các thành viên mới học tham gia ạ!
xin lỗi là không để ý tới hàm InStr
nếu các thành viên mới giải được rồi? thì có thể viết 1 function để giải quyết bài trên không cần hàm InStr
 
Upvote 0
GPE chắc bây giờ toàn thành viên "cạo gội" rồi hay sao mà không thấy thành viên mới học VBA nào tham gia topic này qua!
Người ra để chắc cũng chán!
 
Upvote 0
Upvote 0
Bạn cũng gạo cội? Tôi không thấy bạn tham gia giải đề?
Ý tôi muốn nói các thành viên mới học VBA chứ còn với cá nhân tôi thì bài này tôi làm xong lâu rồi. Tôi muốn để các thành viên mới nghiên cứu VBA giải nên không đưa đáp án nên thôi. Thầy nói vậy em mạo muội gửi đáp án ạ!
Mã:
Option Explicit
Public Sub timvitri()
Dim d As Long, i As Long, tmp As String, vt As Long
Dim Strm As String, Strc As String
    Strm = Sheet1.Range("A12")
    Strc = Sheet1.Range("B12")
For i = 1 To Len(Strc)
    vt = InStr(i, Strm, Mid(Strc, i, 1))
    tmp = tmp & vt & " - "
Next i
    MsgBox Left(tmp, Len(tmp) - 2)
End Sub
 

File đính kèm

  • Tim vi trí .xlsm
    17.3 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
(A) Giả dụ tôi có 1 chuỗi gốc là "GIAIPHAPEXCEL.COM"

Nhiệm vụ đề ra là tìm & liệt kê vị trí lần lượt các kí tự trong cụm "GPE.COM" có trong chuỗi góc trên
(Đáp án: 1_5_9_14_11_16_17)

(B) Giả dụ chuỗi gốc của tôi bây giờ là "ABAEBAC"
Cũng nhiệm vụ trên, tôi cần có đáp án là: "1_2_3_6_7" khi tìm vị trí của "ABAAC"
(Có nghĩa là con số 6 trong đáp án chỉ ra vị trí thứ 3 của "A" trong chuỗi gốc.)

Chúc các bạn thành công zới vòng lặp For. . .Next thôi nha!

Trong khi chờ các bạn khác làm với Instr hay phương án khác, dhn46 cũng tham gia tí cho thêm phần không khí. Ngày mới chập chững VBA qua những bài tập của bác Sa DHN46 đã học hỏi được rất nhiều.

Mã:
Sub Gpe()
    Dim SourceStr As String
    Dim SearchStr As String
    Dim i As Long


    SourceStr = "GIAIPHAPEXCEL.COM"
    SearchStr = "GPE.COM"


    For i = 1 To Len(SourceStr)
        SearchStr = Replace(SearchStr, Mid(SourceStr, i, 1), i & "_")
    Next


    MsgBox Left(SearchStr, Len(SearchStr) - 1)
    
End Sub
 
Upvote 0
(1)
Trong khi chờ các bạn khác làm với Instr hay phương án khác, dhn46 cũng tham gia tí cho thêm phần không khí. Ngày mới chập chững VBA qua những bài tập DHN46 đã học hỏi được rất nhiều.
Macro này mới đúng cho trường hợp (A) thôi đó nha các bạn; Các bạn khác hãy tiếp tục đi nào!

(2)

Hàm InStr(Start, ..., ...) (chú ý chỗ Start là được rồi)

Có thể có 1 số bạn trẻ sẽ lúng túng với tham biến "Start" này.
Có thể có cách khác xíu để tránh xài tham biến này đó các bạn, Đó là hàm Replace() trong VBA mà DHN46 đã đưa ra; Các bạn thử tham khảo xem sao.

(3) Chàng chuột 0106 thân mến!
Trong trường hợp đặc biệt này, khi mà
Chuỗi góc là "CCABAEBAC"
& chuỗi đem tra là "CACBAA"
Thì bạn sẽ sai đáp án kia đấy.
 
Lần chỉnh sửa cuối:
Upvote 0
(1)

Macro này mới đúng cho trường hợp (A) thôi đó nha các bạn; Các bạn khác hãy tiếp tục đi nào!

(2)



Có thể có 1 số bạn trẻ sẽ lúng túng với tham biến "Start" này.
Có thể có cách khác xíu để tránh xài tham biến này đó các bạn, Đó là hàm Replace() trong VBA mà DHN46 đã đưa ra; Các bạn thử tham khảo xem sao.
Code ở bài trên của em test thấy đúng cho cả 2 TH thầy ạ!
 
Upvote 0
..................................................
(3) Chàng chuột 0106 thân mến!
Trong trường hợp đặc biệt này, khi mà
Chuỗi góc là "CCABAEBAC"
& chuỗi đem tra là "CACBAA"
Thì bạn sẽ sai đáp án kia đấy.
Mong thầy đưa đáp án để em còn kiểm tra kết quả khi viết code xong.
 
Upvote 0
Em xin tham gia câu 2, điều kiện chuỗi tìm kiếm không có "$"
Mã:
Function TimViTri$(ByVal ChuoiGoc$, ByVal ChuoiTim$)
    Dim i&, s$
    For i = 1 To Len(ChuoiTim)
        s = Mid(ChuoiTim, i, 1)
        TimViTri = TimViTri & InStr(ChuoiGoc, s) & "_"
        ChuoiGoc = Replace(ChuoiGoc, s, "$", 1, 1)
    Next
    If Len(TimViTri) > 0 Then TimViTri = Left(TimViTri, Len(TimViTri) - 1)
End Function
Sub test()
    MsgBox TimViTri("ABAEBAC", "ABAAC")
End Sub
 
Upvote 0
Mong được đưa đáp án để em còn kiểm tra kết quả khi viết code xong.
Chuỗi góc là "CCABAEBAC"
& chuỗi đem tra là "CACBAA"

Đáp án sẽ là 1_3_2_4_5_8 mới là đúng trong trường hợp này

Tuy nhiên trong macro của bạn, khi xét đến kí tự "C" thứ 2 trong chuỗi tìm, bạn đã cắt cụt fần 2 kí tự đầu của chuỗi nguồn/gốc đi rối; May thay còn anh 'C' cuối nên nó lấy ra & báo cáo láo như những BC lâu nay của các cấp, các ngành của nước ta!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Đáp án sẽ là 1_3_2_4_5_8 mới là đúng trong trường hợp này

Tuy nhiên trong macro của bạn, khi xét đến kí tự "C" thứ 2 trong chuỗi tìm, bạn đã cắt cụt fần 2 kí tự đầu của chuỗi nguồn/gốc đi rối; May thay còn anh 'C' cuối nên nó lấy ra & báo cáo láo như những BC lâu nay của các cấp, các ngành của nước ta!
Nếu vẫn làm theo theo cách của em thì chỗ start phải xử lí như thế nào ạ? Mong thầy chỉ giúp ạ.(Không dùng hàm Replace)
 
Upvote 0
Nếu vẫn làm theo theo cách của em thì chỗ start phải xử lí như thế nào ạ? Mong thầy chỉ giúp ạ.(Không dùng hàm Replace)

Cố suy nghĩ chút là ra chứ gì! Ở đây là BÀI TẬP VBA ĐƠN GIẢN, nếu không "cố" được thì còn chỗ nào để mà "cố" nữa đây?
 
Upvote 0
Web KT

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

Back
Top Bottom