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:
Người mới học thì cũng nên biết mạng net là cả một rừng tin tức. Lọc ra được cái hợp với mình cũng là một kỹ năng cần thiết cho người học hỏi.

Giữa NET mà bạn nói với 1 topic trên GPE mà tôi đang đề cập đến là 1 trời 1 vực.

Ở topic này, từng thành viên cộng đồng cũng có thể đọc & tìm ra những cái mình cần, như bạn nói.

Nhưng với cộng đồng này thì không vậy, vơí những lí do sau:

Bài này, cũng như mọi bài khác trên diễn đàn, có tiêu đề & yêu cầu của GPE.COM là tiêu đề luôn phải bám vào nội dung chính của bài.
(Kể cả bài này tôi viết cũng chưa bám vào tiêu đề & có thể được xoá đi bất cứ lúc nào) & những bài xa với tiêu đề của bài nên xoá đi.


Những bài trên chưa có bài nào là tranh luận cả "tranh luận có nén đá nén gạch --->vỡ đầu bể trán"
những bài ấy chỉ là bàn luận và nhận xét " rút ra tinh tuý chất lượng " bài viết mà thôi

theo mình 2 từ căn bản không chỉ ở những cái a b c gì gì đó, mà nó gồm cả những cái công cụ thường dùng trong công việc thì nó là căn bản "đó chỉ là quan điểm của cá nhân mà thôi "

Tranh luận theo mình hiểu không phải là cãi nhau. Ở đây đã có nhiều bài tranh luận về học thuật. Đó là tranh luận nên có, nhưng không nên ở topic này.

Đúng là căn bản của toán học cao cấp khác xa với căn bản của toán học sơ cấp.
Nhưng tôi hiểu căn bản VBA thì không thể nhiều & đúng như bạn nói: Tuỳ mỗi người!
 
Lần chỉnh sửa cuối:
Upvote 0
Khi các bạn mới tập tành viết code, để chạy code của mình thì tại môi trường VBA bạn đặt con trỏ vào ngay trong code đó và nhấn F5 hoặc nhấn nút Run Sub/UserForm trên thanh công cụ.

Thế thì chẳng lẽ mỗi lần chạy code mỗi lần phải vào VBA hay sao? Phải tạo phím tắt cho nó thôi.

Câu hỏi đặt ra là bạn sẽ tạo nó như thế nào? Mời các "tềnh iu" mới tập tành code trả lời!
[hide]Tạo 1 nút, có thể là Button hoặc CammandButton và đặt code trong đó, có thể là Shapes, Pictures rồi Assign Marco ... đến Sub.[/hide]
Anh Nghĩa hỏi Admin kỹ thuật xem có thể tạo Tag HIDE để đặt câu trả lời vào trong đó hay không? Em thấy một số diễn đàn có sử dụng Tag này (chỉ Smod/mod mới thấy được). Như thế mới có nhiều đáp áp.
 
Upvote 0
Càng ngày topic càng xa với mục đích:
Mấy trang gần đây lại có thêm các bài tranh luận của các bậc thầy nữa kia đấy!
Phát sợ & ngơ ngẩn luôn!

Các bài tranh luận của tôi liên quan đến các vấn đề:

- Khi nào Do loop và khi nào For Next
- Trong For next biến i phải chịu 2 tác động: tăng 1 (hoặc tăng step), sau đó so sánh với giá trị cuối
- Viết câu lệnh thừa trong và ngoài vòng lặp
- Điều kiện thoát For Next: nếu điều kiện không thỏa thì chạy đủ số vòng lặp quy định.
- Điều kiện thoát Do loop: nếu điều kiện thoát không thỏa thì lặp vô tận.

Bạn đọc kỹ sẽ thấy chẳng có gì cao siêu vượt quá mức căn bản thấp nhất. Lớp căn bản GPE vừa kết thúc đã có các nội dung này.
 
Upvote 0
Khi các bạn mới tập tành viết code, để chạy code của mình thì tại môi trường VBA bạn đặt con trỏ vào ngay trong code đó và nhấn F5 hoặc nhấn nút Run Sub/UserForm trên thanh công cụ.

Thế thì chẳng lẽ mỗi lần chạy code mỗi lần phải vào VBA hay sao? Phải tạo phím tắt cho nó thôi.

Câu hỏi đặt ra là bạn sẽ tạo nó như thế nào? Mời các "tềnh iu" mới tập tành code trả lời!
Cái này mình biết nè: Nhấn ALT+F8, chọn macro cần tạo phím nóng, chọn options, phần shortcut key gõ vào kí tự mình muốn tạo phím nóng. Ví dụ mình gõ w vào ô đó rồi nhấn ok. Sau này muốn chạy macro đó thì mình nhấn tổ hợp phím ctrl+w
 
Lần chỉnh sửa cuối:
Upvote 0
Càng ngày topic càng xa với mục đích:


Mấy trang gần đây lại có thêm các bài tranh luận của các bậc thầy nữa kia đấy!

Phát sợ & ngơ ngẩn luôn!

Cái "nữa kia đấy" nó có chút mỉa mai bạn nhỉ.

Tranh luận là tốt chứ nhỉ.
Bạn có hiểu code Nghĩa đưa ra không? Nếu bạn hiểu thì không lý gì bạn lại không hiểu code có được sau khi tranh luận. Vì cả code của Nghĩa và code chỉnh sửa sau tranh luận đều chỉ dùng những cấu trúc cơ bản của ngôn ngữ VBA, cụ thể là For ... Next và Do ... Loop. Vậy cái "Phát sợ & ngơ ngẩn luôn!" là thế nào?

Tôi cho bạn 2 code, một code có khiếm khuyết, thậm chí là sai và 1 code chuẩn thì bạn chọn code nào? Nếu cả 2 code bạn không hiểu thì không nói làm gì nhưng nếu bạn hiểu code 1 thì không lý gì bạn lại không hiểu code 2. Ngoài ra nếu code chuẩn bạn không hiểu, hay nói tổng quát nếu kiến thức chuẩn mà hiện thời bạn chưa hiểu thì bạn luôn có thể "để dành" và trong tương lai nếu cần bạn có chỗ để quay lại đọc và nghiền ngẫm. Bạn chả mất gì cả. Kiến thức chưa hiểu thì cùng lắm bạn có thể "tạm lờ" đi chứ nó không thể làm bạn hiểu sai. Nhưng kiến thức sai sẽ làm bạn hiểu sai và trong tương lai bạn sẽ đi theo con "đường mòn" đó.

Tôi có một phương châm: không giúp được gì cho người ta có nghĩa là người ta không học được thêm gì mới. Chỉ thế thôi. Nhưng cho người ta kiến thức sai là làm hại người ta. Cũng như bác sỹ ấy. Chữa được bệnh là tốt nhưng không thể chữa để người ta thêm bệnh được.

Mà bạn đọc các bài tranh luận bạn không học thêm được cái gì à? Nhờ có tranh luận mới "lộ" thêm cách thức hoạt động của FOR. Những người mới học không có được lợi gì từ sự giải thích cách thức hoạt động của FOR? Nếu thế thì bó tay rồi. Cũng là một bài giảng vd. của thầy ptm0412 nhưng rất có thể có người hiểu nhưng cũng có người không hiểu, đơn giản là vì không cố gắng hiểu. Đơn giản vì ngay từ đầu đã thấy "Phát sợ & ngơ ngẩn luôn" nên không cố, không có ý định tìm hiểu làm gì
 
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.
 

File đính kèm

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 "giơ tay phát biểu"
Do dữ liệu giả định ít và kiến thức còn hạn chế nên bài làm của em mong các anh chị chỉ thêm
* Máy em định dạng số kiểu US nên dùng dấu "," ngăn cách hàng thập phân
Mã:
Sub Ending_Test()

Dim i As Long, store1 As Long, store2 As Long, store3 As Long, store4 As Long, j

Do
  j = InputBox("Ban chon loai SP nao?" & vbNewLine & "(a, b, c, d)", "chon loai")
    If j = "a" Or j = "b" Or j = "c" Or j = "d" Then
      Exit Do
    Else
      MsgBox "NHAP SAI! VUI LONG NHAP LAI!", vbCritical, "Thong Bao"
    End If
Loop

store1 = 0: store2 = 0: store3 = 0: store4 = 0 'Viết luôn thế này cho rõ

For i = 3 To 15
  If Cells(i, 1) = j Then
    With Cells(i, 1)
      store1 = store1 + .Offset(, 1)
      store2 = store2 + .Offset(, 2)
      store3 = store3 + .Offset(, 3)
      store4 = store4 + .Offset(, 4)
    End With
  End If
Next i

MsgBox "Tong doanh so mat hang " & j & vbCrLf & _
       "- Store 01 : " & Format(store1, "###,###") & vbNewLine & _
       "- Store 02 : " & Format(store2, "###,###") & Chr(10) & _
       "- Store 03 : " & Format(store3, "###,###") & vbCrLf & _
       "- Store 04 : " & Format(store4, "###,###") _
       , , "Ket qua"

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
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 làm thử, nhờ các Thầy xem giúp:
Mã:
Private Sub CommandButton1_Click()
Dim I, A, B, C, D
Dim Kho, Rng
    Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon kho", , vbOKCancel)
    Set Rng = Sheet4.Range("A3:A16")
        For I = 1 To Rng.Rows.Count
            If Rng(I) = Kho Then
                A = A + Rng(I).Offset(, 1)
                B = B + Rng(I).Offset(, 2)
                C = C + Rng(I).Offset(, 3)
                D = D + Rng(I).Offset(, 4)
            End If
        Next I
        A = A
        B = B
        C = C
        D = D
    MsgBox "Tong doanh so mat hang " & Kho & ":" _
        & Chr(13) & "- Store 01: " & A _
        & Chr(13) & "- Store 02: " & B _
        & Chr(13) & "- Store 03: " & C _
        & Chr(13) & "- Store 04: " & D
End Sub
Em chưa định dạng được số trong MsgBox.
Sản phẩm b Store 04 là 16,000 mà Thầy cho trong hình ảnh là 8,000.
 

File đính kèm

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 cũng đang tập tọe học VBA, các thầy góp ý bài của em nhé!

[Sub baitest()
Dim store01 As Double, store02 As Double, store03 As Double, store04 As Double
Dim chon As String
Dim i As Long
chon = InputBox("Ban chon san pham nao?" & vbNewLine & "(a,b,c,d)", "chon loai")
With Sheet4
For i = 3 To .Range("A10000").End(xlUp).Row
If .Range("A" & i) = chon Then
store01 = .Range("B" & i) + store01
store02 = .Range("C" & i) + store02
store03 = .Range("D" & i) + store03
store04 = .Range("E" & i) + store04
End If
Next
MsgBox "Tong doanh so mat hang " & chon & ":" & vbNewLine & _
"- Store 01: " & Format(store01, "#,###") & vbNewLine & "- Store 02: " & Format(store02, "#,###") & _
vbNewLine & "- Store 03: " & Format(store03, "#,###") & vbNewLine & _
"- Store 04: " & Format(store04, "#,###"), vbDefaultButton1, "Ket qua"
End With
End Sub
 

File đính kèm

Upvote 0
Em làm thử, nhờ các Thầy xem giúp:
Mã:
Private Sub CommandButton1_Click()
Dim I, A, B, C, D
Dim Kho, Rng
    Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon kho", , vbOKCancel)
    Set Rng = Sheet4.Range("A3:A16")
        For I = 1 To Rng.Rows.Count
            If Rng(I) = Kho Then
                A = A + Rng(I).Offset(, 1)
                B = B + Rng(I).Offset(, 2)
                C = C + Rng(I).Offset(, 3)
                D = D + Rng(I).Offset(, 4)
            End If
        Next I
        A = A
        B = B
        C = C
        D = D
    MsgBox "Tong doanh so mat hang " & Kho & ":" _
        & Chr(13) & "- Store 01: " & A _
        & Chr(13) & "- Store 02: " & B _
        & Chr(13) & "- Store 03: " & C _
        & Chr(13) & "- Store 04: " & D
End Sub
Em chưa định dạng được số trong MsgBox.
Sản phẩm b Store 04 là 16,000 mà Thầy cho trong hình ảnh là 8,000.
Code của Leo hình như dư mấy cái thằng này
A = A
B = B
C = C
D = D
Thân
 
Upvote 0
Code của Leo hình như dư mấy cái thằng này
A = A
B = B
C = C
D = D
Thân
Không hiểu sao lúc đầu chạy thử lại thiếu mất kết quả vòng lặp cuối cùng, nên em cho thêm mấy thằng này, giờ bỏ ra lại thấy đủ ?!
Sửa lại code:
Mã:
Private Sub CommandButton1_Click()
Dim I As Long, A As Long, B As Long, C As Long, D As Long
Dim Kho As String, Rng As Range
    Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel)
        If Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Then
            Set Rng = Sheet4.Range("A3:A16")
                For I = 1 To Rng.Rows.Count
                    If Rng(I) = Kho Then
                        A = A + Rng(I).Offset(, 1)
                        B = B + Rng(I).Offset(, 2)
                        C = C + Rng(I).Offset(, 3)
                        D = D + Rng(I).Offset(, 4)
                    End If
                Next I
        Else
            MsgBox "Ban chua chon san pham"
            Exit Sub
        End If
    MsgBox "Tong doanh so mat hang " & Kho & ":" _
        & Chr(13) & "- Store 01: " & Format(A, "#,###") _
        & Chr(13) & "- Store 02: " & Format(B, "#,###") _
        & Chr(13) & "- Store 03: " & Format(C, "#,###") _
        & Chr(13) & "- Store 04: " & Format(D, "#,###") _
        , , "Ket qua"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm thử, nhờ các Thầy xem giúp:
Mã:
Private Sub CommandButton1_Click()
Dim I, A, B, C, D
Dim Kho, Rng
[/QUOTE]
Theo mình nên có thói quen khai báo biến tường minh ngay từ đầu để có phương pháp khai thác Vba hiệu quả, tránh lãng phí...
 
Lần chỉnh sửa cuối:
Upvote 0
Không hiểu sao lúc đầu chạy thử lại thiếu mất kết quả vòng lặp cuối cùng, nên em cho thêm mấy thằng này, giờ bỏ ra lại thấy đủ ?!
Sửa lại code:
Mã:
Private Sub CommandButton1_Click()
Dim I As Long, A As Long, B As Long, C As Long, D As Long
Dim Kho As String, Rng As Range
    Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel)
        If Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Then
            Set Rng = Sheet4.Range("A3:A16")
                For I = 1 To Rng.Rows.Count
                    If Rng(I) = Kho Then
                        A = A + Rng(I).Offset(, 1)
                        B = B + Rng(I).Offset(, 2)
                        C = C + Rng(I).Offset(, 3)
                        D = D + Rng(I).Offset(, 4)
                    End If
                Next I
        Else
            MsgBox "Ban chua chon san pham"
            Exit Sub
        End If
    MsgBox "Tong doanh so mat hang " & Kho & ":" _
        & Chr(13) & "- Store 01: " & Format(A, "#,###") _
        & Chr(13) & "- Store 02: " & Format(B, "#,###") _
        & Chr(13) & "- Store 03: " & Format(C, "#,###") _
        & Chr(13) & "- Store 04: " & Format(D, "#,###") _
        , , "Ket qua"
End Sub

Code của bạn có 1 vấn đề: khi hiện inputbox() nếu ng dùng gõ ko đúng sản phẩm hoặc bấm cancel thì code vẫn hiện lên msgbox "tong doanh so mat hang .... "? Ko ổn... nên đưa msgbox đấy vào trong if
 
Lần chỉnh sửa cuối:
Upvote 0
Code của bạn có 1 vấn đề: nếu khi hiện inputbox() nếu ng dùng gõ ko đúng sản phẩm hoặc bấm cancel thì code vẫn hiện lên msgbox "tong doanh so mat hang .... "? Ko ổn... nên đưa msgbox đấy vào trong if
Đã Exit Sub rồi mà, làm gì có hiện lên MsgBox "Tổng doanh số ..."?
 
Upvote 0
Bài này nếu tốt thì mình nên đặt input ... Ngay trong do.. Loop thì hay hơn. Để chắc chắn người nhập nhập đúng đk rồi mớic thực hiện các lệnh khác
 
Upvote 0
Code của bạn có 1 vấn đề: khi hiện inputbox() nếu ng dùng gõ ko đúng sản phẩm hoặc bấm cancel thì code vẫn hiện lên msgbox "tong doanh so mat hang .... "? Ko ổn... nên đưa msgbox đấy vào trong if

Theo bạn thì bạn phải viết như thế nào mới đúng, hãy tham gia giải đáp bài tập đi bạn.
 
Upvote 0
Nếu các bạn đưa 1 message thông báo chọn sai loại sản phẩm, nên test các trường hợp:

1. Trong Inputbox chọn loại:

- Nhấn OK
- Nhấn Cancel

Mỗi trường hợp nhấn trên phải test 2 trường hợp:
- Gõ đúng tên Sp
- Gõ sai tên SP hoặc bỏ trống

2. Trong Msgbox thông báo sai:
- Nhấn Yes/OK
- Nhấn No/Cancel

Nên dùng vbOKCancel hoặc vbYesNo, không dùng vbOKOnly, vì bất kỳ lúc nào người dùng cũng có thể muốn ngưng. Không nên hành hạ người dùng làm đến khi đúng mới thoát được nợ.
 
Upvote 0
* Máy em định dạng số kiểu US nên dùng dấu "," ngăn cách hàng thập phân

Máy định dạng kiểu nào trong hệ thống thì trong VBA cứ định dạng "#,##0" cũng sẽ ra đúng định dạng của hệ thống.

Máy ở nhà tôi (trong hình chụp) định dạng kiểu Pháp, nhưng trong VBA tôi vẫn viết "#,##0", và kết quả như hình chụp.
 
Upvote 0
Bài này nếu tốt thì mình nên đặt input ... Ngay trong do.. Loop thì hay hơn. Để chắc chắn người nhập nhập đúng đk rồi mớic thực hiện các lệnh khác
Thử viết code theo cách của bạn Phi xem sao! Nghe cũng khá lạ đấy!
 
Upvote 0
Web KT

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

Back
Top Bottom