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:
Đã Exit Sub rồi mà, làm gì có hiện lên MsgBox "Tổng doanh số ..."?

Theo tôi không nên dùng Exit sub ngay lập tức kiểu đó. Con người có lúc gõ nhầm, cứ Exit ngay thì người ta lại phải nhấn nút "chạy" code từ đầu? Nên cho người ta cơ hội sửa lại. Vì thế tôi thấy bài #127 dùng Do ... Loop là được. Nhưng code còn "thiếu". Với code hiện thời người dùng không "thôi chơi" bằng cách nhấn Cancel được vì vòng lặp cứ hiển thị InputBox liên tục. Không phải vô cớ mà Inputbox có nút Cancel. Nếu Inputbox có nút Cancel thì cũng có nghĩa là cho phép người dùng "thôi chơi". Vậy ta nhập vào Inputbox giá trị mặc định nào đó, vd. "a". Khi Inputbox trở về thì ta kiểm tra giá trị. Nếu = "" tức người dùng nhấn Cancel - "thôi chơi" thì ta dọn "đồ chơi". Nếu <> "" thì ta kiểnm tra có là "a", ..., "d" hay không ...
 
Upvote 0
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.
Em đã tham gia ở bài #127
và theo gợi ý của bác PTM0412 e xin sửa 1 tí
Mã:
Sub Ending_Test()

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

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
      [COLOR=#0000cd]If j = "" Then Exit Sub              'same: If j = vbNullString Then ...[/COLOR]
      k = MsgBox("NHAP SAI! VUI LONG NHAP LAI! Chon Cancel neu muon thoat", vbOKCancel, "Thong Bao")
      [COLOR=#0000cd]If k = vbCancel Then Exit Sub[/COLOR]
    End If
Loop

store1 = 0: store2 = 0: store3 = 0: store4 = 0 [COLOR=#0000cd]'Viết thế này luôn cho rõ[/COLOR]
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, "#,###") & [COLOR=#ff0000]Chr(10)[/COLOR] & _
       "- Store 03 : " & Format(store3, "#,###") & [COLOR=#ff0000]Chr(13)[/COLOR] & _
       "- Store 04 : " & Format(store4, "#,###") _
       , , "Ket qua"

End Sub
Cho em hỏi luôn là Chr(10) & Chr(13) đều là ngắt xuống dòng, là một hay có gì khác nhau? Xin vui lòng giải thích
 
Lần chỉnh sửa cuối:
Upvote 0
store1 = 0: store2 = 0: store3 = 0: store4 = 0 'Viết thế này luôn cho rõ

Thay vì cho nó rõ thì nó lại là thừa nha bạn, bởi mặc định của các biến số bao giờ cũng là 0 hết nhé!


Cho em hỏi luôn là Chr(10) & Chr(13) đều là ngắt xuống dòng, là một hay có gì khác nhau? Xin vui lòng giải thích

Các bạn hãy xem bảng này nhé! Theo tôi, tốt nhất khi xuống hàng thì ta dùng vbLf cho dễ nhớ, lại ngắn gọn! Xem hình.
 

File đính kèm

  • MisConst.jpg
    MisConst.jpg
    142.2 KB · Đọc: 83
Lần chỉnh sửa cuối:
Upvote 0

Thay vì cho nó rõ thì nó lại là thừa nha bạn, bởi mặc định của các biến số bao giờ cũng là 0 hết nhé!
Cần phải phát biểu chính xác và rõ ràng như sau:

- Biến khai báo kiểu Number (Long, Integer, Double, ...) sẽ có giá trị ban đầu là 0
- Biến khai báo kiểu String sẽ có giá trị ban đầu là chuỗi rỗng ("", vbNullString)
- Biến khai báo kiểu Object (Range, Sheet, ...) sẽ có giá trị ban đầu là Nothing
- Biến mảng không khai báo kiểu, có giá trị là Empty
 
Upvote 0
Cần phải phát biểu chính xác và rõ ràng như sau:


- Biến mảng không khai báo kiểu, có giá trị là Empty

Xin Sư phụ vui lòng xác nhận lại "Biến mảng" (Array) hay biến Variant?

Bởi: Dim Arr Dim Arr() là hoàn toàn khác nhau!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin Sư phụ vui lòng xác nhận lại "Biến mảng" (Array) hay biến Variant?

Bởi: Dim Arr Dim Arr() là hoàn toàn khác nhau!

Thông thường câu tôi viết trong chuyên đề nghiêm túc thường không dư không thiếu.

Tôi viết là Biến mảng không khai báo kiểu

Nghĩa là Dim Arr() hoặc Dim/ReDim Arr(1 to 10, 1 to 3)

không As iếc



Nói thêm:
Các phát biểu của tôi cũng có thể sai (đương nhiên). Nếu Nghĩa hoặc bất kỳ ai thấy sai thì vạch ngay ra chỗ sai, đừng ngại, và cũng đừng yêu cầu tôi xác nhận lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Thử viết code theo cách của bạn Phi xem sao! Nghe cũng khá lạ đấy!
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
Do
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel)
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d")
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

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
cái này sửa lại code của leonguyen 1 tí,
nếu mình không gõ đúng các ký tự a,b,c,d thì nó bắt mình nhập cho tới khi nào đúng thì ok. mình không phải kiểm tra vì giá trị nhập phải luôn luôn đúng
 
Upvote 0
Mã:
Option Explicit
[B]Sub BaiTapTH()[/B]
 Dim Cls As Range, Rng As Range, tRng As Range
 Dim LoaiSP As String, Addr As String
 
 Dim Arr(1 To 4) As Double:         Dim Jj As Long
 
 LoaiSP = "Hay Nhap Loai SP ma Ban Can Tinh"
 LoaiSP = InputBox(LoaiSP, "GPE Xin Chao Cac Ban", "a")
 If InStr("abcd", LoaiSP) Then
    Set Rng = Range([A2], [A2].End(xlDown))
    Set tRng = Rng.Find(LoaiSP, , xlFormulas, xlWhole)
    If Not tRng Is Nothing Then
        Addr = tRng.Address
        Do
            With tRng
                For Jj = 1 To 4
                    Arr(Jj) = Arr(Jj) + .Offset(, Jj).Value
                Next Jj
            End With
            Set tRng = Rng.FindNext(tRng)
        Loop While Not tRng Is Nothing And tRng.Address <> Addr
    End If
    MsgBox "Tong Doanh So Mat Hang " & LoaiSP & ":" _
        & Chr(10) & "- Store 01:" & Str((Arr(1) \ 10 ^ 3)) & ".000" _
        & Chr(10) & Arr(2) & Chr(10) & Arr(3) & Chr(10) & Arr(4)
 Else
    MsgBox "Chuc Ban May Man!"
 End If
[B]End Sub[/B]
 
Upvote 0
nếu mình không gõ đúng các ký tự a,b,c,d thì nó bắt mình nhập cho tới khi nào đúng thì ok. mình không phải kiểm tra vì giá trị nhập phải luôn luôn đúng
Vậy thì góp ý của bác Ptm0412 (#138) và Siwtom (#141) coi như là lãng phí rồi. người dùng ko muốn chơi với Inputbox nữa thì cũng "đâu cái điền". Hic hic ...
 
Upvote 0
Thông thường câu tôi viết trong chuyên đề nghiêm túc thường không dư không thiếu.

Tôi viết là Biến mảng không khai báo kiểu

Nghĩa là Dim Arr() hoặc Dim/ReDim Arr(1 to 10, 1 to 3)

không As iếc



Nói thêm:
Các phát biểu của tôi cũng có thể sai (đương nhiên). Nếu Nghĩa hoặc bất kỳ ai thấy sai thì vạch ngay ra chỗ sai, đừng ngại, và cũng đừng yêu cầu tôi xác nhận lại.

Nếu Sư phụ nói Arr() là biến mảng, và cũng nói nếu không khai báo kiểu thì có giá trị Empty là không chính xác!

Xin kiểm chứng cho Code này:

Mã:
Sub test()
    Dim sArr
    Dim Arr()
    MsgBox IsEmpty(sArr)
    MsgBox IsEmpty(Arr)
End Sub

Như vậy, biến sArr không khai báo, mặc nhiên nó là một biến Variant, thì nó mới chính là có giá trị Empty!
 
Upvote 0
Với bài của Sư phụ ra đề, rất thiết thực và rất vừa tầm đối với các thành viên mới (mới có nghĩa là mới học VBA).

Qua các thành viên gửi bài lên tham gia, tôi nhận thấy mỗi người có một thuật toán, một cách đặt biến, một cách trình bày cũng có ít nhiều khác nhau.

Tuy vậy, có điểm chung là tương đối đúng với yêu cầu của đề bài đưa ra. Qua đó, là một người ít nhiều gì cũng tự lăn lộn để học code như các bạn, tôi có một số kinh nghiệm để nói về bài này như sau:

1) Cách khai báo biến các bạn nên tạo ngắn gọn và gợi nhớ, ví như bài của leonguyenz, đã nhập giá trị SP là a, b, c, d, lại đi khai báo biến A, B, C, D như thế dễ khiến cho người đọc code lẫn lộn Store với SP. Vì thế ta có thể khai Store1, Store4... như một số bạn đã làm.

2) Chúng ta chăm chút việc bẫy lỗi a, b, c, d bằng nhiều phương pháp, nhưng chúng ta chưa để ý đến việc có thể người ta nhập là A, B, C, D. Lẽ ra khi bẫy lỗi chúng ta hoặc dùng LCase, hoặc dùng UCase cho từ 2 phía, chẳng hạn: If UCase(Rng(i)) = UCase(Kho) Then thì sẽ không bị mắc sai lầm.

Tôi nghĩ còn nhiều nhận xét khác, nhưng với đây là bài của Sư phụ đưa ra, vậy xin "múa rìu qua mắt thợ" được 2 nhận xét trên, xin nhường quyền nhận xét lại cho Sư phụ và các cao thủ khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Mượn tạm bài của bạn phanminhphuong để chế biến 1 cách để đạt được yêu cầu của Ptm0412
dùng WorksheetFuntion trong bài cơ bản này mong mọi người đừng cười, cũng là 1 cách đạt mục tiêu thôi
Mã:
Sub Ending_Test1()

Dim i As Long, j, k
Dim store1 As Long, store2 As Long, store3 As Long, store4 As Long
Dim myRange As Range

Do
  j = InputBox("Ban chon loai SP nao?" & vbNewLine & "(a, b, c, d)", "chon loai")
    If UCase(j) = Ucase("a") Or UCase(j) = UCase("b") Or UCase(j) = UCase("c") Or UCase(j) = UCase("d") Then
      Exit Do
    Else
      If j = "" Then [COLOR=#0000cd]Exit Sub[/COLOR]
        k = MsgBox("NHAP SAI! VUI LONG NHAP LAI!", vbOKCancel, vbCritical, "Thong Bao")
        If k = vbCancel Then [COLOR=#0000cd]Exit Sub[/COLOR]
    End If
Loop

Set myRange = Range("A3:A16")
store1 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("B3:B16"))
store2 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("C3:C16"))
store3 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("D3:D16"))
store4 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("E3:E16"))

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
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Option Explicit
[B]Sub BaiTapTH()[/B]
 Dim Cls As Range, Rng As Range, tRng As Range
 Dim LoaiSP As String, Addr As String
 
 Dim Arr(1 To 4) As Double:         Dim Jj As Long
 
 LoaiSP = "Hay Nhap Loai SP ma Ban Can Tinh"
 LoaiSP = InputBox(LoaiSP, "GPE Xin Chao Cac Ban", "a")
 [B][COLOR=#ff0000]If InStr("abcd", LoaiSP) Then[/COLOR][/B]
    Set Rng = Range([A2], [A2].End(xlDown))
    Set tRng = Rng.Find(LoaiSP, , xlFormulas, xlWhole)
    If Not tRng Is Nothing Then
        Addr = tRng.Address
        Do
            With tRng
                For Jj = 1 To 4
                    Arr(Jj) = Arr(Jj) + .Offset(, Jj).Value
                Next Jj
            End With
            Set tRng = Rng.FindNext(tRng)
        Loop While Not tRng Is Nothing And tRng.Address <> Addr
    End If
    MsgBox "Tong Doanh So Mat Hang " & LoaiSP & ":" _
        & Chr(10) & "- Store 01:" & Str((Arr(1) \ 10 ^ 3)) & ".000" _
        & Chr(10) & Arr(2) & Chr(10) & Arr(3) & Chr(10) & Arr(4)
 Else
    MsgBox "Chuc Ban May Man!"
 End If
[B]End Sub[/B]

Người dùng mà nhấn Cancel thì code vẫn tính toán. Đúng là code "cứng đầu".
Ngoài ra có thể nhập ab, abc, abcd, bc, bcd, cd thì code vẫn tính. Code dễ dãi quá
 
Upvote 0
Do
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel)
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d")


Sau khi bấm nút lệnh để hiển thị InputBox, người dùng nghĩ lại, "thôi không nhập, thoát đi", thế là bấm Cancel, chuyện gì xảy ra với code của bạn vậy? Bắt buộc người ta phải nhập và tính toán hay sao?

Cái mà tôi tô màu đỏ, mặc dù tôi biết bạn mượn code, nhưng cũng nên kiểm tra lại xem có hợp lý không hen!
 
Upvote 0
Mượn tạm bài của bạn phanminhphuong để chế biến 1 cách để đạt được yêu cầu của Ptm0412
dùng WorksheetFuntion trong bài cơ bản này mong mọi người đừng cười, cũng là 1 cách đạt mục tiêu thôi
Mã:
    If UCase(j) = Ucase("a") Or UCase(j) = UCase("b") Or UCase(j) = UCase("c") Or UCase(j) = UCase("d")

Thay vì như thế, sao không viết như thế này để nó bớt tính toán nhỉ?

If UCase(j) = "A" Or UCase(j) = "B" Or UCase(j) = "C" Or UCase(j) = "D"
 
Upvote 0
Sau khi bấm nút lệnh để hiển thị InputBox, người dùng nghĩ lại, "thôi không nhập, thoát đi", thế là bấm Cancel, chuyện gì xảy ra với code của bạn vậy? Bắt buộc người ta phải nhập và tính toán hay sao?

Cái mà tôi tô màu đỏ, mặc dù tôi biết bạn mượn code, nhưng cũng nên kiểm tra lại xem có hợp lý không hen!
\
vì cái bài này khi hiện ra thông báo có gợi ý phải nhập 1 trong 4 giá trị. thì theo như code là buộc phải nhập 1 trong 4 giá trị ( chưa bẫy lỗi chữ hoa chữ thường)

nếu người dùng không muốn tính toán mà muốn thoát thì mình bẫy lỗi thêm
Do
Kho = InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbYesNoCancel)
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = vbCanel)
Set Rng = Sheet4.Range("A3:A16")
If (Kho <> vbCanel) Then
......
end if
 
Upvote 0
Mượn tạm bài của bạn phanminhphuong để chế biến 1 cách để đạt được yêu cầu của Ptm0412
dùng WorksheetFuntion trong bài cơ bản này mong mọi người đừng cười, cũng là 1 cách đạt mục tiêu thôi
Mã:
Sub Ending_Test1()

Dim i As Long, j, k
Dim store1 As Long, store2 As Long, store3 As Long, store4 As Long
Dim myRange As Range

Do
  j = InputBox("Ban chon loai SP nao?" & vbNewLine & "(a, b, c, d)", "chon loai")
    If UCase(j) = Ucase("a") Or UCase(j) = UCase("b") Or UCase(j) = UCase("c") Or UCase(j) = UCase("d") Then
      Exit Do
    Else
      If j = "" Then [COLOR=#0000cd]Exit Sub[/COLOR]
        k = MsgBox("NHAP SAI! VUI LONG NHAP LAI!", vbOKCancel, vbCritical, "Thong Bao")
        If k = vbCancel Then [COLOR=#0000cd]Exit Sub[/COLOR]
    End If
Loop

Set myRange = Range("A3:A16")
store1 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("B3:B16"))
store2 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("C3:C16"))
store3 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("D3:D16"))
store4 = [COLOR=#0000cd]Application.WorksheetFunction[/COLOR].SumIf(myRange, j, Range("E3:E16"))

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
KHÔNG CÓ GÌ MÀ PHẢI SỢ NGƯỜI TA CƯỜI. CỨ VIẾT THEO MÌNH HIỂU. TÔI CŨNG ĐANG HỌC BẠN ĐẤY THÔI.
HÌNH NHƯ CODE CỦA BẠN BIẾN i TÔI CHẢ THẤY BẠN SỬ DỤNG CHỖ NÀO
 
Upvote 0
Phải vậy không ta bạn hiền
PHP:
Private Sub CommandButton1_Click()
Dim I As Long, store1 As Long, store2 As Long, store3 As Long, store4 As Long
Dim Kho As String, Rng As Range
Do
Kho = LCase(InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel))
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = "")
Set Rng = Sheet4.Range("A3:A16")
If (Kho = "") Then
Exit Sub
Else
For I = 1 To Rng.Rows.Count
If Rng(I) = Kho Then
store1 = store1 + Rng(I).Offset(, 1)
store2 = store2 + Rng(I).Offset(, 2)
store3 = store3 + Rng(I).Offset(, 3)
store4 = store4 + Rng(I).Offset(, 4)
End If
Next I
End If
MsgBox "Tong doanh so mat hang " & Kho & ":" _
& Chr(13) & "- Store 01: " & Format(store1, "#,###") _
& Chr(13) & "- Store 02: " & Format(store2, "#,###") _
& Chr(13) & "- Store 03: " & Format(store3, "#,###") _
& Chr(13) & "- Store 04: " & Format(store4, "#,###") _
, , "Ket qua"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
phải vậy không ta bạn hiền
PHP:
Do
Kho = LCase(InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbYesNoCancel))
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = vbCanel)

Sorry bạn hiền và các "tềnh iêu", tôi lại nhầm với MsgBox, lẽ ra phải như thế này mới đúng:

Mã:
Do
    [COLOR=#006400]'InputBox([/COLOR][COLOR=#ff0000]prompt[/COLOR][COLOR=#800080][, title][/COLOR][COLOR=#006400] [, default] [, xpos] [, ypos] [, helpfile, context])[/COLOR]
    Kho = InputBox([COLOR=#ff0000]"Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)"[/COLOR], [COLOR=#800080]"Chon loai"[/COLOR])
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" [B][COLOR=#0000ff]Or Kho = ""[/COLOR][/B])
If Kho = "" Then Exit Sub

Tôi thì không khoái cho lắm loại bẫy lỗi dùng vòng lặp này, nếu là tôi thì tôi sẽ không dùng vòng lặp vẫn có thể thông báo thêm 1 tin nhắn.
 
Lần chỉnh sửa cuối:
Upvote 0
phải vậy không ta bạn hiền
PHP:
Private Sub CommandButton1_Click()
Dim I As Long, store1 As Long, store2 As Long, store3 As Long, store4 As Long
Dim Kho As String, Rng As Range
Do
Kho = LCase(InputBox("Ban chon loai san pham nao?" & Chr(13) & "(a,b,c,d)", "Chon loai", , vbOKCancel))
Loop Until (Kho = "a" Or Kho = "b" Or Kho = "c" Or Kho = "d" Or Kho = " ")
Set Rng = Sheet4.Range("A3:A16")
If (Kho =" ") Then
Exit Sub
Else
For I = 1 To Rng.Rows.Count
If Rng(I) = Kho Then
store1 = store1 + Rng(I).Offset(, 1)
store2 = store2 + Rng(I).Offset(, 2)
store3 = store3 + Rng(I).Offset(, 3)
store4 = store4 + Rng(I).Offset(, 4)
End If
Next I
End If
MsgBox "Tong doanh so mat hang " & Kho & ":" _
& Chr(13) & "- Store 01: " & Format(store1, "#,###") _
& Chr(13) & "- Store 02: " & Format(store2, "#,###") _
& Chr(13) & "- Store 03: " & Format(store3, "#,###") _
& Chr(13) & "- Store 04: " & Format(store4, "#,###") _
, , "Ket qua"
End Sub
hiện tại có 4 cột thì dim 4 cái store. vậy có 10 cột chắc lại phải viết khác rồi đúng không thầy. lúc đó lại store &n phải không ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom