Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Với tinh thần chơi mà học, học mà chơi, nên tôi đã mở ra topic này, hy vọng các thành viên tham gia, nhất là các thành viên mới biết về VBA.

Sau đây là câu hỏi đầu tiên:

Câu hỏi 1: Bằng phương pháp nào nhanh nhất để tìm ra ô nào trong một cột chứa một điều kiện.

Tôi có 1 file Excel 2007, với cột A, từ A1 đến A1048576 đều có giá trị.

Bằng phương pháp nào nhanh nhất (dùng mảng, dùng For Each v.v...) để tìm ra ô nào trong cột A chứa chữ "Nghia", đồng thời với ô ở cột B tương ứng nhập giá trị "OK" vào đó?

Ví dụ tìm thấy trong ô A2 có giá trị là "Nghia" thì ô B2 nhập vào "OK".

Hiện tại, đáp án nhanh nhất mà tôi có được đã gửi mail riêng (nhằm ghi lại thời gian gửi, để tránh nói ăn gian).

Để tiện việc theo dõi các câu đố, các bài tập tôi đã tạo ra topic này các bạn click vào đây:

Các link của topic "Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA"
 

File đính kèm

Lần chỉnh sửa cuối:
Em đề nghị các ace tiếp tục cho các đề bài cơ bản/ căn bản khác để những người mới như em rèn luyện/ trao đổi thêm...
tks
 
Upvote 0
Một câu trong bài test cuối khóa VBA căn bản:
(Người ra đề: ptm0412)
Đề trong file word, làm bài trong file excel.

Các bạn có thể tham khảo và làm thử. Chương trình căn bản gói gọn trong đó, không có biến mảng.
Em xin được trả lời bài tập, mong các anh chị đừng ném đá em tội nghiệp.

[GPECODE=vb]Sub BaiTap_XiTin()
Dim adoConn As Object, adoRS As Object
Dim strDK As Variant, Kho As String, i As Integer, strKQ As String
Kho = UCase(InputBox("Ban chon loai SP nao?" & vbLf & "(a,b,c,d)", "Chon loai"))
If Len(Kho) = 0 Then Exit Sub
strDK = Filter(Array("A", "B", "C", "D"), Kho)
If UBound(strDK) >= 0 Then
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "SELECT F1,sum(F2),sum(F3),sum(F4),sum(F5) " & _
"FROM [Tinhtong$A3:E16] " & _
"GROUP BY F1 " & _
"HAVING UCASE(F1) like '" & Kho & "'"
For i = 1 To 4
strKQ = strKQ & vbNewLine & "- Store 0" & i & ": " & Format(.Fields(i).Value, "#,##0")
Next i
MsgBox "Tong doanh so mat hang " & .Fields(0).Value & ":" & strKQ, , "Ket qua"
End With
Else
MsgBox "Chon khong dung san pham"
Exit Sub
End If
Erase strDK
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing


End Sub


[/GPECODE]
 
Upvote 0
[GPECODE=vb]
With adoRS
.ActiveConnection = adoConn
.Open "SELECT F1,sum(F2),sum(F3),sum(F4),sum(F5) " & _
"FROM [Tinhtong$A3:E16] " & _
"GROUP BY F1 " & _
"HAVING UCASE(F1) like '" & Kho & "'"
For i = 1 To 4
strKQ = strKQ & vbNewLine & "- Store 0" & i & ": " & Format(.Fields(i).Value, "#,##0")
Next i
MsgBox "Tong doanh so mat hang " & .Fields(0).Value & ":" & strKQ, , "Ket qua"
End With
[/GPECODE]
Hic, Lính mới như em nhìn code ADO là "hoa hết cả mắt". Nếu được, mong các Anh chị giải thích cặn kẽ hơn code trên từng dòng một; F1, 2, 3, 4, 5 lấy ở đâu, lấy ntn, nguyên tắc lấy? và xin cho biết những kinh nghiệm/ lưu ý khi sử dụng ADO
many tks
 
Lần chỉnh sửa cuối:
Upvote 0
Hic, Lính mới như em nhìn code ADO là "hoa hết cả mắt". Nếu được, mong các Anh chị giải thích cặn kẽ hơn code trên từng dòng một; F1, 2, 3, 4, 5 lấy ở đâu, lấy ntn, nguyên tắc lấy? và xin cho biết những kinh nghiệm/ lưu ý khi sử dụng ADO
many tks
F1 ->F5 là thứ tự cột trong vùng A3:E16 (A là F1, B là F2...) vì khai báo HDR=No nên mặc định như thế.
Bạn muốn học ado thì tải ebook sau về đọc nhé.

http://www.giaiphapexcel.com/forum/content.php?44-eBook-ADO-tòan-tập
 
Upvote 0
Nói về bài Ending-Test, đối với trình độ căn bản và tôi chấm điểm thì chỉ cần thế này là đạt:
(Code để trong sheet)
PHP:
Sub tinhtong()
Dim Loai As String, Tong1 As Double, Tong2 As Double, Tong3 As Double, Tong4 As Double
Dim EndR As Long

EndR = [A1000].End(xlUp).Row
Loai = InputBox("Ban chon loai SP nao?" & Chr(13) & "(a, b, c, d)", "Chon loai", "a")
If Loai = "" Then Exit Sub
For i = 3 To EndR
    If Cells(i, 1) = Loai Then
        Tong1 = Tong1 + Cells(i, 2)
        Tong2 = Tong2 + Cells(i, 3)
        Tong3 = Tong3 + Cells(i, 4)
        Tong4 = Tong4 + Cells(i, 5)
     End If
Next
MsgBox "Tong doanh so mat hang " & Loai & ":" & Chr(13) & _
    "- " & [B2] & ": " & Format(Tong1, "#,##0") & Chr(13) & _
    "- " & [C2] & ": " & Format(Tong2, "#,##0") & Chr(13) & _
    "- " & [D2] & ": " & Format(Tong3, "#,##0") & Chr(13) & _
    "- " & [E2] & ": " & Format(Tong4, "#,##0"), vbOKOnly, "Ket qua"
End Sub

1. Không cần Do loop để chọn đúng mặt hàng, bởi vì gõ sai tên mặt hàng thì tổng doanh số bằng 0, MsgBox cũng thể hiện kết quả bằng 0 cho cả 4 cửa hàng. Kết quả đúng.
2. InputBox có Default là 1 mặt hàng a, nếu ok ngay thì tính mặt hàng a, nếu nhấn Cancel thì thoát, không tính.
3. Định dạng #,##0 thì kết quả 0 cũng thể hiện 0

Ngoài ra, nếu viết code dùng vòng lặp ghi các dòng đúng mặt hàng chọn ra vùng tạm rồi tính tổng vùng tạm, cũng OK

Các bài giải trên đây đã sử dụng thêm code kiểm tra tên mặt hàng gõ vào, càng tốt. Tuy nhiên như bài 138 và 141 có viết:
- Không bắt buộc người dùng phải tính, họ có quyền cancel trên InputBox
- Khi chọn sai, MsgBox thông báo không dùng vbOKOnly (mặc định) để hành hạ người dùng phải nhập đúng mới cho thoát, mà người dùng cũng có quyền cancel trên MsgBox thông báo này.

Để thân thiện, nếu người dùng chọn sai, bạn hỏi người dùng có muốn chọn lại không, và dùng vbYesNo, để người dùng có thể chọn No

Vậy đoạn code đó như sau:

PHP:
Do
    Loai = InputBox("Ban chon loai SP nao?" & Chr(13) & "(a, b, c, d)", "Chon loai", "a")
    If Loai = "" Then Exit Sub
    If Loai = "a" Or Loai = "b" Or Loai = "c" Or Loai = "d" Then
        Exit Do
    Else
        Thongbao = MsgBox("Khong co mat hang nay, ban co chon lai khong?", _
        vbYesNo, "Thong bao")
        If Thongbao = vbNo Then Exit Sub
    End If
       
Loop
For i = 3 To EndR
...
 
Lần chỉnh sửa cuối:
Upvote 0
Nói thêm: Vì bài EndingTest là bài kiểm tra cuối khóa, nên ra đề buộc phải sử dụng những vấn đề đã giới thiệu trong khóa học:

- Khai báo biến, kiểu biến (chưa dùng biến mảng)
- Phương thức End
- Cấu trúc If Then Else End If
- Cấu trúc vòng lặp For Next và/hoặc Do loop
- Giao tiếp với người dùng: InputBox, MsgBox với đầy đủ trường hợp nhấn nút trên phương thức giao tiếp.
- Hàm Format

Còn áp dụng thuật toán nào, tạo ra bao nhiêu biến, sử dụng biến thế nào để ra kết quả, là việc của người làm bài.

Câu hỏi sau đây dễ hơn, nhưng cũng cần phải suy luận:

a. Dùng vòng lặp For - Next để thể hiện 56 màu của Bảng màu Excel 2003 lên cột A bắt đầu từ A1. Đồng thời trên cột B ghi chỉ số màu tương ứng
b. Cũng giống câu a, nhưng dùng step 2 để chỉ thể hiện các màu có chỉ số màu chẵn, liên tục từ A1 đến A28, chỉ số màu tương ứng trên cột B
 
Lần chỉnh sửa cuối:
Upvote 0
Nói thêm: Vì bài EndingTest là bài kiểm tra cuối khóa, nên ra đề buộc phải sử dụng những vấn đề đã giới thiệu trong khóa học:

- Khai báo biến, kiểu biến (chưa dùng biến mảng)
- Phương thức End
- Cấu trúc If Then Else End If
- Cấu trúc vòng lặp For Next và/hoặc Do loop
- Giao tiếp với người dùng: InputBox, MsgBox với đầy đủ trường hợp nhấn nút trên phương thức giao tiếp.
- Hàm Format

Còn áp dụng thuật toán nào, tạo ra bao nhiêu biến, sử dụng biến thế nào để ra kết quả, là việc của người làm bài.

Câu hỏi sau đây dễ hơn, nhưng cũng cần phải suy luận:

a. Dùng vòng lặp For - Next để thể hiện 56 màu của Bảng màu Excel 2003 lên cột A bắt đầu từ A1. Đồng thời trên cột B ghi chỉ số màu tương ứng
b. Cũng giống câu a, nhưng dùng step 2 để chỉ thể hiện các màu có chỉ số màu chẵn, liên tục từ A1 đến A28, chỉ số màu tương ứng trên cột B
2 câu hỏi làm tại 1 điểm , khi chấm bài phải dò code từng em rồi " chứ đâu thể chấm kết quả nữa

bài dễ thử lên bảng 1 bài xem có bị gõ đầu ko

thay đổi vị trí hiện thị câu B sang cột c và d
[GPECODE=vb]Sub tomau()Dim i As Integer
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Cells(i, 2) = i
If i / 2 = Int(i / 2) Then
Cells(i / 2, 3).Interior.ColorIndex = i
Cells(i / 2, 4) = i
End If
Next i
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
2 câu hỏi làm tại 1 điểm , khi chấm bài phải dò code từng em rồi " chứ đâu thể chấm kết quả nữa
Thì xóa kết quả làm lại, hoặc làm sheet khác, hoặc làm file mới, hoặc làm cột C và D, ...
Trời ạ!

Chưa nói thậm chí ghi đè lên cũng có thể kiểm tra code đúng sai được.

Chàng Edit bài rồi, cuối cùng cũng đã dời kết quả sang C và D. Tuy nhiên, yêu cầu cầu b là For Next với step 2 (câu b riêng biệt với câu a).
 
Lần chỉnh sửa cuối:
Upvote 0
2 câu hỏi làm tại 1 điểm , khi chấm bài phải dò code từng em rồi " chứ đâu thể chấm kết quả nữa

Thế bạn không nghĩ là câu a "viết" ở sheet1, câu b viết ở sheet2?
Khi đi thi bạn ghi đáp án cho câu 1 từ dòng đầu trang 1, cho câu 2 từ dòng đầu trang 1, ..., cho câu n từ dòng đầu trang 1? Làm thế thì thầy cho 0 điểm với lý do: làm nhưng không biết suy nghĩ. Đâu phải cái gì cũng phải thầy giải thích, cầm tay dẫn đi? Có ông thầy nói: "nếu anh không biết suy nghĩ thì nghỉ học luôn cho khỏi tốn "đèn sách. Mà tôi e rằng quét đường cũng cần suy nghĩ". Chí lý quá. Cứ thử quét đường 1 ngày thì sẽ thấy: quét đường cũng cần suy nghĩ.

Tất nhiên thầy phải kiểm tra code chứ không thể chỉ nhìn kết quả. Nhìn code thấy "em này" có ý tưởng rất hay, cách giải quyết vượt trội các bạn khác thì cho thêm điểm, "em kia" hiểu sai thì trừ điểm.

Ví dụ code bài #156 (code các bài #128, #132, #147 tương tự)

Mã:
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , [COLOR=#ff0000]vbYesNoCancel[/COLOR])
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" [COLOR=#ff0000]Or Kho = vbCancel[/COLOR])

Ở bài này thì vbYesNoCancel và OR Kho = vbCancel không ảnh hưởng tới quá trình tính (luôn có Kho = vbCancel = FALSE) nhưng rõ ràng viết như thế là không hiểu đúng về hàm InputBox. Về Kho = vbCancel thì cái không hiểu là: Hàm Input trả về chuỗi có trong trường Textbox chứ không trả về giá trị được gán cho các nút. Về vbYesNoCancel thì cái không hiểu là: thông số thứ tư trong hàm Inputbox có ý nghĩa khác. Vả lại không có thông số nào xác định số và "loại" nút cần có trong Inputbox.

Tóm lại tuy code viết như trên trong trường hợp cụ thể này không ảnh hưởng tới quá trình tính nhưng code cho thấy người viết hiểu chưa đúng về Inputbox. Như thế tuy ra kết quả đúng cũng phải bị trừ điểm. Không nhiều nhưng phải bị trừ.

Gọi là mượn bài để viết chính về vấn đề khác (Inputbox) chứ tôi cũng biết là bạn đùa thôi. Tất nhiên với phần đùa thì tôi cũng đùa. Nhưng đùa là với bạn còn thật là ở chỗ nếu tôi là thầy mà ai viết kiểu "đè lên nhau" là tôi không nhận bài.
 
Upvote 0
Một vài nhận xét về cách đặt tên biến:

Trong các bài giải từ đầu topic đến giờ, tôi nhận xét 1 số điểm và tôi nghĩ nên sửa đổi như sau:

1. Tên biến nên đặt sao cho đọc tên có thể mường tượng biến đang hoặc sẽ gán giá trị gì. Thí dụ:

- Biến mảng có thể đặt Arr, sArr, sArray, ... nhưng nếu 2 biến mảng trở lên thì tốt hơn nên đặt SourceArr, ResultArr để phân biệt. chí ít cũng là sArr và rArr. Nếu đặt tiếng Việt thì có thể đặt MangNguon, MangDich, hoặc MgNguon, MgDich. Nếu đặt tên 2 biến là sArr sArray thì không phân biệt được Array nào dùng làm việc gì (bài #20)
- Nếu không phải biến mảng thì không đặt tên biến là Arr hoặc sArr
- Biến loại Range có thể viết tắt là Rng, nếu không phải biến loại Range thì không nên đặt tên biến là Rng
- Nếu For Each từng ô thì nên đặt biến là Cls, Cll, ..., nếu For Each từng vùng thì mới đặt tên biến là Rng (bài #23)
- Đặt tên biến chạy (trong vòng lặp For Next) có thể đặt i, j, k cho đơn giản, tuy nhiên đừng kẹo quá mà đặt tên biến lấy giá trị từ InputBox, MsgBox là i, j, k (Bài $142). Hãy đặt "tượng hình" chẳng hạn SP = InputBox(), Thongbao hoặc TB = MsgBox(). Tuy nhiên không nên đặt tên biến là l (L viết thường), vì trong cửa sổ VBA nó rất giống số 1 (một).
- Không đặt tên biến cho cái bàn mà tượng hình thành cái tủ, thí dụ đặt tên biến là Kho cho loại sản phẩm (bài #128, #158)
- Hãy đặt tên cụ thể là EndRw, NextRw, RwsCount chứ đừng đặt Rw chung chung, dễ lẫn lộn.

2. Đặt tên biến bao gồm chữ hoa và chữ thường:

Việc này nhằm mục đích kiểm tra chính tả về tên biến: khi chúng ta viết code ào ào, không cần nhấn Shift, thì tên biến (đã khai báo) tự động viết hoa lên. Nếu tên biến không tự động viết hoa nghĩa là ta gõ sai tên biến.

Theo tôi, đặt tên biến iI, jJ GpE, là hơi kỳ cục. Nhưng ta có thể đặt tên biến với chữ hoa đầu tên, hoặc chữ hoa đầu từ cho tên biến gồm 2 từ. Thí dụ: EndRow, NextRow, hoặc EndR, NextR, Rw, Col, SourceArr, ResultArr, RwsCount, SoDong, ...

3. Kiểu biến:

Với biến kiểu số cần tính toán thì chỉ đặt kiểu Long khi biết chắc toàn bộ các dữ liệu cần tính toán, cũng như kết quả là số nguyên. Nhất là khi dùng phép chia. Kể cả tính Sum 1 vùng không xác định thì cũng nên đặt Double.
 
Lần chỉnh sửa cuối:
Upvote 0
Một vài nhận xét về cách đặt tên biến:

Trong các bài giải từ đầu topic đến giờ, tôi nhận xét 1 số điểm và tôi nghĩ nên sửa đổi như sau:

1. Tên biến nên đặt sao cho đọc tên có thể mường tượng biến đang hoặc sẽ gán giá trị gì. Thí dụ:

.........................
2. Đặt tên biến bao gồm chữ hoa và chữ thường:

Việc này nhằm mục đích kiểm tra chính tả về tên biến: khi chúng ta viết code ào ào, không cần nhấn Shift, thì tên biến (đã khai báo) tự động viết hoa lên. Nếu tên biến không tự động viết hoa nghĩa là ta gõ sai tên biến.

Theo tôi, đặt tên biến iI, jJ là hơi kỳ cục. Nhưng ta có thể đặt tên biến với chữ hoa đầu tên, hoặc chữ hoa đầu từ cho tên biến gồm 2 từ. Thí dụ: EndRow, NextRow, hoặc EndR, NextR, Rw, Col, SourceArr, ResultArr, RwsCount, SoDong, ...
Riêng về việc đặt tên biến, em học được 1 kinh nghiệm của các lập trình viên thế này:
- Tên biến lúc nào cũng có 2 phần: Phần tiền tố là viết tắt của kiểu biến, hậu tố thường là phần mô tả mục đích sử dụng (không có cũng không sao)
- Phần tiền tố luôn viết thường, phần hậu tố viết HOA 1 ký tự đầu tiên
- Với hằng số, người ta thường viết HOA toàn bộ
Ví dụ:
Biến Long: sẽ có chữ l đứng đầu:
lR: Biến Long, nói về vị trí của Row
lC: Biến Long, nói về vị trí của Column
Biến String: sẽ có chữ s hoặc str hoặc sz đứng đầu
sPath: Biến String, mô tả đường dẫn
sFile: Biến String, mô tả tên file​
vân... vân...
- Với biến Object, người ta thường đặt tiền tố gồm 3 ký tự mô tả loại object
Ví dụ:
Range: tiền tố được đặt là rng
CheckBox: tiền tố được đặt là chk
ComboBox: tiền tố được đặt là cbo
CommandButton: tiền tố được đặt là cmd
vân... vân....
Riêng với việc đặt tên cho đối số của hàm hoặc sub, người ta thường không áp dụng cách này mà phải đặt sao càng dễ mường tượng ra đối số ấy làm công việc gì càng tốt
Ví dụ:
Mã:
Function JoinText(ByVal [COLOR=#ff0000]Delimiter[/COLOR] As String, ByVal [COLOR=#ff0000]IgnoreBlanks[/COLOR] As Boolean, ParamArray [COLOR=#ff0000]Arrays[/COLOR]()) As String
Nhìn vào 3 đối số màu đỏ sẽ đoán được ngay chúng làm công việc gì
---------------
Dưới đây là bảng mô tả cách đặt tên biến của 1 số object:
Object|Prefix|Example

Checkbox|chk|chkReadOnly

Combo box|cbo|cboEnglish

Command button|cmd|cmdCancel

Common dialog ctrl|dlg|dlgFileOpen

Control|ctl|ctrCurrent

Form|frm|frmFileOpen

Frame|fra|fraLanguage

Image|img|imgIcon

Label|lbl|lblHelpMessage

List box|lst|lstPolicyCodes

Menu|mnu|mnuFileOpen

Object|obj|objUserTable

Option button|opt|optFrench

Shape|shp|shpCircle

Spin control|spn|spnPages

Text box|txt|txtGetText

----------------------------------------
Các lập trình viên phải thống nhất với nhau về cách đặt tên biến như thế để khi làm việc nhóm với nhau họ mới có thể kiểm tra code qua lại 1 cách dễ dàng (mạnh ai nấy đặt tên theo ý mình thì sẽ rất khó cho công việc kiểm tra)
Thử tưởng tượng mai này GPE nỗi tiếng đến mức có nhiều người nước ngoài ghé thăm, họ đọc code và xem cách đặt tên biến của chúng ta chắc cũng nhức đầu
Nên ưu tiên cách đặt tên biến là tiếng Anh để dù là ai, nước nào cũng có thể hiểu được
 
Upvote 0
Riêng về việc đặt tên biến, em học được 1 kinh nghiệm của các lập trình viên thế này:
- Tên biến lúc nào cũng có 2 phần: Phần tiền tố là viết tắt của kiểu biến, hậu tố thường là phần mô tả mục đích sử dụng (không có cũng không sao)
- Phần tiền tố luôn viết thường, phần hậu tố viết HOA 1 ký tự đầu tiên
- Với hằng số, người ta thường viết HOA toàn bộ
Tôi đồng ý với ndu, và việc này (kể cả cái bảng này) đã được đưa lên GPE từ lâu. Riêng tôi thì nếu tên biến chỉ có mô tả không thôi, mà mô tả rõ, cũng đã đủ để biết biến loại nào. Về biến object thì tôi vẫn theo tiêu chuẩn tạo tiền tố để phân biệt các dạng object như textbox, combobox, ..., có điều tôi chưa muốn giới thiệu trong topic này.

Tất nhiên làm đúng chuẩn quốc tế như ndu viết vẫn hơn.

Nên ưu tiên cách đặt tên biến là tiếng Anh

Tôi vẫn thường ưu tiên đặt tên biến tiếng Anh. Tên tiếng Việt không dấu lại còn viết tắt thì có trường hợp đọc không hiểu nổi, thí dụ như biến đặt tên Mang hoặc Vung không nói làm gì, đặt bằng cách viết tắt Mg, Mng, Vg, ... thì chịu thua.
 
Lần chỉnh sửa cuối:
Upvote 0
@xì tin:
Tôi chỉ nói về câu SQL của bạn thôi. Những chỗ code còn lại không kể.
1. Câu hỏi chỉ đòi hỏi 1 sản phẩm. Cho nên câu truy vấn không cần phải GROUP BY, chỉ cần WHERE sanPham = Kho là được rồi. (Đã không có group thì không thể dùng having)
2. Cho biết lý do tại sao bạn lọc bằng từ khoá LIKE Kho?
LIKE dùng để so theo dạng 'wildcard'. Ở đây mã kho chỉ có 1 ký tự cho nên đâu có cần wildcard!

@ptm:
Tại sao khoá học của bạn không khuyến khích viết code có chú thích (comments) nhỉ.
Hồi tôi còn đi học, viết một hàm/thủ tục mà không có dòng giải thích hàm làm cái gì (nhiệm vụ hàm) thì Thầy/Cô sổ toẹt. Có lẽ tôi già quá rồi.
 
Upvote 0
@ptm:
Tại sao khoá học của bạn không khuyến khích viết code có chú thích (comments) nhỉ.
Hồi tôi còn đi học, viết một hàm/thủ tục mà không có dòng giải thích hàm làm cái gì (nhiệm vụ hàm) thì Thầy/Cô sổ toẹt. Có lẽ tôi già quá rồi.
Trong khóa học tôi cũng có hướng dẫn comment. Tuy nhiên với những bài tập ngắn năm ba dòng code với chỉ 1 mục đích nhỏ thì tùy theo người làm, họ thấy không cần chú thích cũng hiểu thì họ không chú thích.

Hơn nữa, đó cũng chỉ là bài test đánh giá thu hoạch là chính, không nhằm mục đích lấy điểm đậu hay rớt, nên không trừ điểm vụ comment mà sẽ chỉ nhắc nhở.
 
Upvote 0
1) Em chỉ định đố những câu đố ngắn (căn bản) nhưng thật sự không định hướng được thế nào là căn bản.
2) Đố dễ quá thì nhàm chán, đố khó quá thì cho là không căn bản, là nâng cao hoặc quá cao.
3) Nhiều cao thủ góp ý quá, kể cả Nghĩa cũng lùm xùm quá, tạo ra sự "ô hợp", mỗi người mỗi kiểu, mỗi kiến thức, mỗi kinh nghiệm.
4) Em đã có ý định đổi tên topic, nhưng hiện giờ em cũng không xác định được tên nó là gì nữa rồi, vã lại, em không quản lý Box này nên không đổi tên được.
Kính nhờ các Thầy, Sư phụ xem mà đổi giúp để cho các thành viên mới học VBA được nhờ ạ.
Anh Nghĩa có thể INDEX các câu đố, bài giải ở bài #1 được không?
Nếu được thì anh cập nhật các bài theo từng chuyên đề vào bài #1 để mọi người theo dõi và học hỏi, cái nào chưa nắm được thì dễ tìm.
1. Các chuyên đề cơ bản có thể là Vòng lặp, Input, Msgbox, các phương thức, ... (nhờ các Thầy khái niệm phần cơ bản dùm, ở đây em chỉ lấy ví dụ). Trong đó là các bài, câu đố liên quan, ...
2. Dù là dễ, nhưng người chưa nắm cơ bản thì lại rất cần. Câu đố khó (vượt mức cơ bản) thì ghi chú tham khảo và đề nghị không tranh luận trong topic.
Việc dời bài của các Thầy, em nghĩ là khó, nhưng nếu anh nói trước thì các Thầy cũng thông cảm thôi.
 
Upvote 0
Quay trở lại trình độ căn bản. Bài tập sau đây cần 1 chút xíu tư duy (2 câu độc lập):

a. Dùng vòng lặp For - Next để thể hiện 56 màu của Bảng màu Excel 2003 lên cột A bắt đầu từ A1. Đồng thời trên cột B ghi chỉ số màu tương ứng
b. Cũng giống câu a, nhưng dùng step 2 để chỉ thể hiện các màu có chỉ số màu chẵn, liên tục từ C1 đến C28, chỉ số màu tương ứng trên cột D

For Next thì ai cũng biết
Step 2 ai cũng biết
Vấn đề là step 2 nhưng ghi lên sheet liên tục không cách dòng.

Làm được bài này, các bạn sẽ ứng dụng rất nhiều trong xử lý dữ liệu, cả trên sheet lẫn trong mảng.
 
Upvote 0
Quay trở lại trình độ căn bản. Bài tập sau đây cần 1 chút xíu tư duy (2 câu độc lập):
a. Dùng vòng lặp For - Next để thể hiện 56 màu của Bảng màu Excel 2003 lên cột A bắt đầu từ A1. Đồng thời trên cột B ghi chỉ số màu tương ứng
b. Cũng giống câu a, nhưng dùng step 2 để chỉ thể hiện các màu có chỉ số màu chẵn, liên tục từ C1 đến C28, chỉ số màu tương ứng trên cột D
For Next thì ai cũng biết
Step 2 ai cũng biết
Vấn đề là step 2 nhưng ghi lên sheet liên tục không cách dòng.
Làm được bài này, các bạn sẽ ứng dụng rất nhiều trong xử lý dữ liệu, cả trên sheet lẫn trong mảng.
Em xin thử trước, (nếu có tag HIDE thì hay quá, nhiều bạn sẽ đưa ra nhiều đáp án hơn.)
Câu a:
Mã:
Private Sub CommandButton1_Click()
Dim I As Long
Columns("A:B").Clear
    For I = 1 To 56
        Cells(I, 1).Interior.ColorIndex = I
        Cells(I, 2) = I
    Next I
End Sub
Câu b:
Mã:
Private Sub CommandButton2_Click()
Dim I As Long, J As Long
Columns("A:B").Clear
    For I = 2 To 56 Step 2
        If I Mod 2 = 0 Then
            J = J + 1
            Cells(J, 1).Interior.ColorIndex = I
            Cells(J, 2) = I
        End If
    Next I
End Sub
 

File đính kèm

Upvote 0
Em xin thử trước, (nếu có tag HIDE thì hay quá, nhiều bạn sẽ đưa ra nhiều đáp án hơn.)
Câu a:
...
Câu b:
Mã:
Private Sub CommandButton2_Click()
Dim I As Long, J As Long
Columns("A:B").Clear
    For I = 2 To 56 Step 2
        If I Mod 2 = 0 Then
            J = J + 1
            Cells(J, 1).Interior.ColorIndex = I
            Cells(J, 2) = I
        End If
    Next I
End Sub

mod 2 : như ptm đã nêu, không cần phải thử

Mẹo toán: nếu bạn để ý sẽ thấy J luôn luôn = I/2. Suy ra biến J không cần.
Ngược lại, nếu đề không bắt buộc dùng step 2 thì ta có thể cho I chạy từ 1 đến 28 và dùng giá trị I*2
 
Upvote 0
mod 2 : như ptm đã nêu, không cần phải thử

Mẹo toán: nếu bạn để ý sẽ thấy J luôn luôn = I/2. Suy ra biến J không cần.
Ngược lại, nếu đề không bắt buộc dùng step 2 thì ta có thể cho I chạy từ 1 đến 28 và dùng giá trị I*2

Đề ra step 2 nhằm mục đích phải dùng biến phụ j tăng có điều kiện. Từ đó có thể áp dụng vào việc khác sau này.

Thí dụ như lọc vùng dữ liệu, dòng nào thỏa điều kiện thì chép sang sheet khác kế tiếp nhau, hoặc nếu dùng mảng, thì gán vào mảng ở dòng j. (Điều kiện thỏa trong bài tập nhỏ này là chẵn hoặc mod 2 = 0).

Một áp dụng mở rộng khác là tính toán cái biến j đó (không chỉ là cộng 1), thí dụ như tính tổng store1, store2, ... với điều kiện mặt hàng a, trong bài Ending-Test.

Vấn đề của học viên lập trình không phải ở học thuộc cú pháp, cấu trúc, ... mà còn ở tư duy tìm phương pháp giải. Những bài tập con con này chỉ nhằm rèn luyện tư duy. Gặp 1 vấn đề cần giải quyết, nhớ lại các bài tập nhỏ đã làm này, lấy ra 1 cái để áp dụng.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom