Những bài tập VBA đơn giản dành cho những người mới bắt đầu

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,338
Được thích
22,385
Nghề nghiệp
Nuôi ba ba & trùn quế

Bài 01

Macro to merge values from one column into one cell and retain source formatting.
Example:

Source:
A1= "It is going to cost "
A2= "$1000.00" (A2 is formatted to underline value)

Destination: (desired result)
B2= "It is going to cost $1000.00" (A2 value is still underlined)

Đề bài có thể tóm gọn lại như sau:

Trên cột [A:A] ta có những dòng thuyết minh & dưới nó là những con số đã được định dạng bằng nhiều cách khác nhau để fân biệt như chữ in nghiên, chữ số được tô đậm hay Font có màu đỏ,. . . .

Macro có nhiệm vụ: Hễ dòng nào có số thì ô bên fải liền kề cần được mang nội dung cũa ô trên ô có số & bản thân số của ô đang xét; Mặt khác định dạng ô giống với ô mang số liệu

Chúc thành công
--=0
--=0

Bảng liệt kê:

TT | Tên bài | Tại | Diễn giải
01|Bài tập 01|#1|Nối chuỗi & định dạng
02|Bài tập 02 | #11|Thống kê số lần lặp
03|Bài tập 03|#19|Trích lọc danh sách theo năm
04|Bài tập 04|#27|Thêm dòng theo số liệu tháng - năm
05|Bài tập 05|#31|Tổng hợp số liệu hoạt động theo từng kỳ (tháng)
06|Bài tập 06|#73|Ghí chú ngày có chi fí lớn nhất trong từng tháng khảo sát
07|Bài tập 07|#84|Thêm dòng tính tổng, sau khi đã thống kê số liệu
08|Bài tập 08|#103|Kẻ dòng, viền khung & format báo cáo hoàn chỉnh
09| BT Fần B | #206 | (Ở đây có bảng liệt kê riêng)


Rất mong các bạn ủng hộ & hỗ trợ tối đa.

! --=0 --=0 --=0
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bài này em thêm cột phụ, với lại năm chưa khắc phục được em đưa lên để các thầy chỉ thêm ạ.
Em định sử dụng hàm Sumproduct luôn mà ko làm được.

Bạn thử theo hướng DSUM() xem sao
 
Upvote 0
Góp vui và chia vui với mọi người tí, nhờ học được cách hay của XN82 nên cũng chế ra được 1 kiểu khác
PHP:
Sub Ngay_Thang()
Dim I As Long, SoThang As Long
   With ActiveSheet
      .[A5:B1000].ClearContents
      SoThang = DateDiff("m", .[C1], .[C2]) + 1
      For I = 1 To SoThang
         .Cells(I + 4, 1).Value = I
         .Cells(I + 4, 2) = "Tháng " & Format(DateAdd("m", I - 1, .[C1]), "mm-yyyy")
      Next I
   End With
End Sub
 
Upvote 0
Chờ mãi không thấy ai lên bảng, nhà em lên vậy. đáp án không hay lắm, mọi người góp ý .
Kiểm tra lại, quyên không ráp bài 2 của XuanNguyen82 nên chỉ được 1 năm . nói chung làm sao lọc được cả tháng và năm thì ... Mình tắc tỵ rồi; cái hũ bã đậu của mình chỉ được cái nhiều tóc, chán thật
 

File đính kèm

  • Bai 5 GPE xuanKB.rar
    87 KB · Đọc: 49
Lần chỉnh sửa cuối:
Upvote 0
Bạn với SAODOINGOI_XD cùng đi 1 hướng, đó là xài =SUMIF()

Chờ mãi không thấy ai lên bảng, nhà em lên vậy. đáp án không hay lắm, mọi người góp ý.

/(/hưng cũng như SAODOINGOI_XD, bạn vẫn chưa xử lí được việc khảo sát số liệu trên 1 năm;

Hơn nữa, như đề bài, các bạn còn fải thấy rằng, số liệu khảo sát có khi chỉ là 1 vài ba tuần mà thôi!

Lúc đó SUMIF() của các bạn fá sản.


Để khỏi bị tan gia bại sản, mình nghỉ ra cách như sau:

Cần viết hàm người dùng biến đổi số liệu kiểu ngày nào đó trong thế kỷ này (như 03/08/2012) biểu thỉ chỉ bằng mả có độ dài là 3, như XYZ,

Mà trong đó X biểu thị cho năm, như A biểu thị cho năm 2000, B-> 2001,. . . .

Y biểu thị cho tháng; Thêm nữa ta lấy trọn 36 ký tự & ký số để biểu thị cho 36 tháng của 3 năm liền kề nhau. Chi vậy?Trả lời: Để với 26 chữ cái, ta biểu diễn được 26 *3 số năm của thế kỷ này.

Qua đoạn văn vừa rồi, chắc mã kí tự Z biểu diễn 31 ngày trong 1 tháng kia không mấy khó khăn với các bạn, fải không?

Mình cho rằng cách này sẽ giúp ta dùng hàm SUMIF() 1 cách thuận tiên.

. . .
 
Lần chỉnh sửa cuối:
Upvote 0
/(/hưng cũng như SAODOINGOI_XD, bạn vẫn chưa xử lí được việc khảo sát số liệu trên 1 năm;

Hơn nữa, như đề bài, các bạn còn fải thấy rằng, số liệu khảo sát có khi chỉ là 1 vài ba tuần mà thôi!

Lúc đó SUMIF() của các bạn fá sản.


Để khỏi bị tan gia bại sản, mình nghỉ ra cách như sau:

Cần viết hàm người dùng biến đổi số liệu kiểu ngày nào đó trong thế kỷ này (như 03/08/2012) biểu thỉ chỉ bằng mả có độ dài là 3, như XYZ,

Mà trong đó X biểu thị cho năm, như A biểu thị cho năm 2000, B-> 2001,. . . .

Y biểu thị cho tháng; Thêm nữa ta lấy trọn 36 ký tự & ký số để biểu thị cho 36 tháng của 3 năm liền kề nhau. Chi vậy?Trả lời: Để với 26 chữ cái, ta biểu diễn được 26 *3 số năm của thế kỷ này.

Qua đoạn văn vừa rồi, chắc mã kí tự Z biểu diễn 31 ngày trong 1 tháng kia không mấy khó khăn với các bạn, fải không?

Mình cho rằng cách này sẽ giúp ta dùng hàm SUMIF() 1 cách thuận tiên.

. . .
Cám ơn gợi ý của thầy. Nhà em sẽ cố gắng chạy theo các bạn.
 
Upvote 0
Góp vui 2 cách
Cách 1:
PHP:
Sub test1()
Dim i As Long, j As Long, dk1, dk2
Sheet2.[D8:D100].ClearContents
For i = 8 To Sheet2.[C65536].End(3).Row
   dk1 = Replace(Right(Sheet2.Cells(i, 3), 7), "/", "-")
   For j = 4 To Sheet1.[a65536].End(3).Row
      dk2 = CStr(Format(Sheet1.Cells(j, 1), "mm-yyyy"))
      If dk1 = dk2 Then
         Sheet2.Cells(i, 4) = Sheet2.Cells(i, 4) + Sheet1.Cells(j, 5)
      End If
   Next
Next
End Sub
Cách 2:
PHP:
Sub test2()
Dim dl(), i As Long, kq(), j As Long, dk1 As String, dk2 As String
Sheet2.[D8:D100].ClearContents
kq = Sheet2.Range(Sheet2.[B8], Sheet2.[b65536].End(3)).Resize(, 3).Value
dl = Sheet1.Range(Sheet1.[A4], Sheet1.[a65536].End(3)).Resize(, 5).Value
For i = 1 To UBound(kq)
   dk1 = Replace(Right(kq(i, 2), 7), "/", "-")
   For j = 1 To UBound(dl)
      dk2 = CStr(Format(dl(j, 1), "mm-yyyy"))
      If dk1 = dk2 Then
         kq(i, 3) = kq(i, 3) + dl(j, 5)
      End If
   Next
Next
Sheet2.[B8].Resize(i - 1, 3) = kq
End Sub
 
Upvote 0
(Tình hình là vết mổ của em nó .."căng" thôi ạ....hihi. Em cũng "nhồi" kiến thức từ từ, dần dần....Nên các thầy ra đề cho học sinh "mẫu giáo" như em có thể giải được í ạ. Những bài khó là em...chạy...hic hic).

Trong trường hợp giả sử khảo sát số liệu từ quý II năm 2011 đến hết quý I năm 2012 (số liệu giả định):

Mã:
Public Sub Xuan2()
Dim Dau As Long, Cuoi As Long, I As Long, SoThang As Long
With Sheet1
.[A5:B1000].ClearContents
Dau = DateSerial(Year(.[C1]), Month(.[C1]), 1)
Cuoi = DateSerial(Year(.[C2]), Month(.[C2]), 1)
SoThang = DateDiff("m", Dau, Cuoi) + 1
For I = 1 To SoThang
    .Cells(I + 4, 1).Value = I
    .Cells(I + 4, 2).Value = "Thang " & Format(DateSerial(Year(Dau), Month(Dau) + I - 1, 1), "mm/yyyy")
Next I
End With
End Sub
Cám ơn bạn, mình mụ mẫm thế nào khi mở file của bạn cứ tìm module, bạn đã đổi mầu D5 mà mình không để ý . Đồ cũ chạy ỳ ạch thế đấy, rõ chán!
 
Lần chỉnh sửa cuối:
Upvote 0
Các thầy và các anh chị có bài nào dễ hơn từ A,B,C để cho em tham gia với ạ.
 
Upvote 0
Cơ quan nọ cần tổng hợp số liệu chi fí của các tháng để ghi vô bảng mẫu tại bài 4 (#41)

CSDL có trong file đính kèm
}}}}}
--=0
}}}}}
(Bài này có thể có nhiều cách làm từ dễ đến khó; Mong các bạn tiếp tục hưởng ứng)
Chị ơi, nếu những tháng không có phát sinh chi phí thì nên loại nó ra luôn không?
 
Upvote 0
Loại ra cũng tốt, nhưng để sau đi

Nếu những tháng không có phát sinh chi phí thì nên loại nó ra luôn không?

Giờ thì cho nó hiện số 0, hay dòng: "Không fát sinh" là OK rồi!

Các thầy và các anh chị có bài nào dễ hơn từ A,B,C để cho em tham gia với ạ.

Vậy qua công việc hàng ngày bạn có:


(*) Gặp trở ngại gì cần đến VBA giúp không?

(*) Lâu nay xài công thức, giờ muốn tìm đến VBA không?

(*) . . .

Bạn cứ đưa lên đây lnhư là 01 bài tập vậy!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Vậy qua công việc hàng ngày bạn có:

(*) Gặp trở ngại gì cần đến VBA giúp không?

(*) Lâu nay xài công thức, giờ muốn tìm đến VBA không?

(*) . . .

Bạn cứ đưa lên đây lnhư là 01 bài tập vậy!

Em chỉ mới làm quen với VBA, từ những cấu trúc đơn giản, ngắn, dễ hiểu mà em tin chắc rất nhiều bạn muốn học như vậy.
Cho bài tập từ những cấu trúc Sub. End sub đơn giản.

Sub ()
Dim....
For Each...
If...
End If
Next
End Sub
-Những đề dạng ngắn ngắn như vậy cho lớp đàn em chúng em dễ hiểu, mới mò mẫm VBA thôi ạ. Mấy đề thứ 4,5 là phải học "tiểu học" VBA mới giải được ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
If HYen17.Sex= "Male" Then
HYen17.Age= 17
Elseif HYen17.Sex= "Female" Then
HYen17.Age= 71
Else
HYen17.Age= (17 + 71) \ 2
End If

PS: CN Spam tí, MOD xoá hộ bài khi hết ngày
Xóa làm gì?
Đây là một dạng bài tập đơn giản mà bạn "Như Đã Dấu Yêu" muốn xem đấy.
Nên thêm cho chắc ăn:
If HYen17.Sex= "Male" Then
HYen17.Age= 17
Elseif HYen17.Sex= "Female" Then
HYen17.Age= 71
Else
HYen17.Age= (17 + 71) \ 2
End If
[IV65536].value="Old man Ẹc Ẹc..."
 
Upvote 0
Em chỉ mới làm quen với VBA, từ những cấu trúc đơn giản, ngắn, dễ hiểu mà em tin chắc rất nhiều bạn muốn học như vậy.
Cho bài tập từ những cấu trúc vòng lặp đơn giản.

-Những đề dạng ngắn ngắn như vậy cho lớp đàn em chúng em dễ hiểu, mới mò mẫm VBA thôi ạ. Mấy đề thứ 4,5 là phải học "tiểu học" VBA mới giải được ạ.

Thực ra bài tập 4 ta cũng có thể dùng vòng lặp theo từng ngày; Hễ khác tháng thì ta thêm 1 dòng!

/(hông tin bạn nhờ Ba tê hay cha 2uangHai đưa lên cho mà coi!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em bập bõm ado như sau

Mã:
Sub TongCong()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.FullName & _
                        ";Extended Properties=""Excel 8.0;HDR=No;"";"
    .Open
End With
    lsSQL = "SELECT 'Tháng ' & Format(F1,'mm-yyyy') & ':', Sum(F5) " & _
             "FROM [ChiFi$A3:E1397] " & _
             "WHERE F1 Between #" & Format(DateSerial(Year(Sheet2.[d4]), Month(Sheet2.[d4]), Day(Sheet2.[d4])), "mm/dd/yyyy") & _
                                             "# AND #" & Format(DateSerial(Year(Sheet2.[d5]), Month(Sheet2.[d5]), Day(Sheet2.[d5])), "mm/dd/yyyy") & "# " & _
             "GROUP BY Format(F1,'mm-yyyy'), Year(F1) " & _
             "ORDER BY Year(F1);"
    lrs.Open lsSQL, cnn, 3, 1
With Sheet2
   .[B8:E100].ClearContents
   .[C8].CopyFromRecordset lrs
End With
With Sheet2.Range("B8:B" & Sheet2.Range("C65000").End(xlUp).Row)
   .FormulaR1C1 = "=ROW()-7"
   .Value = .Value
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing


End Sub
 
Upvote 0
Cơ quan nọ cần tổng hợp số liệu chi fí của các tháng để ghi vô bảng mẫu tại bài 4 (#41)

CSDL có trong file đính kèm
}}}}}
--=0
}}}}}
(Bài này có thể có nhiều cách làm từ dễ đến khó; Mong các bạn tiếp tục hưởng ứng)

Em làm theo cách hiểu của em như sau (trình độ mầm non VBA).
Bài tập 5

Mã:
Public Sub Xuan3()
Application.ScreenUpdating = False
Dim Rng As Range, Cll As Range, Dau As Long, Cuoi As Long, I As Long, Tem As Long, SoThang As Long, Thang As Long
With Sheets("ChiFi")
    Set Rng = .Range(.[A4], .[A65000].End(xlUp))
End With
With Sheets("sheet1")
.[A8:C1000].ClearContents
Dau = DateSerial(Year(.[C4]), Month(.[C4]), 1)
Cuoi = DateSerial(Year(.[C5]), Month(.[C5]), 1)
SoThang = DateDiff("m", Dau, Cuoi) + 1
For I = 1 To SoThang
    Thang = DateSerial(Year(Dau), Month(Dau) + I - 1, 1)
    .Cells(I + 7, 1).Value = I
    .Cells(I + 7, 2).Value = "Thang " & Format(Thang, "mm/yyyy")
    For Each Cll In Rng
            Tem = DateSerial(Year(Cll), Month(Cll), 1)
        If Tem = Thang Then
            .Cells(I + 7, 3).Value = .Cells(I + 7, 3).Value + Cll.Offset(, 4).Value
        ElseIf Tem > Thang Then
            Exit For
        End If
    Next
Next I
End With
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • BaiTap5final.zip
    64.3 KB · Đọc: 27
Lần chỉnh sửa cuối:
Upvote 0
Em bập bõm ado như sau

Mã:
Sub TongCong()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.FullName & _
                        ";Extended Properties=""Excel 8.0;HDR=No;"";"
    .Open
End With
    lsSQL = "SELECT 'Tháng ' & Format(F1,'mm-yyyy') & ':', Sum(F5) " & _
             "FROM [ChiFi$A3:E1397] " & _
             "WHERE F1 Between #" & Format(DateSerial(Year(Sheet2.[d4]), Month(Sheet2.[d4]), Day(Sheet2.[d4])), "mm/dd/yyyy") & _
                                             "# AND #" & Format(DateSerial(Year(Sheet2.[d5]), Month(Sheet2.[d5]), Day(Sheet2.[d5])), "mm/dd/yyyy") & "# " & _
             "GROUP BY Format(F1,'mm-yyyy'), Year(F1) " & _
             "ORDER BY Year(F1);"
    lrs.Open lsSQL, cnn, 3, 1
With Sheet2
   .[B8:E100].ClearContents
   .[C8].CopyFromRecordset lrs
End With
With Sheet2.Range("B8:B" & Sheet2.Range("C65000").End(xlUp).Row)
   .FormulaR1C1 = "=ROW()-7"
   .Value = .Value
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing


End Sub
Ái da!
"Anh Chàng Ngốc" này mà "ngốc" cái nỗi gì "Chời".
ADO "sáng lòe" luôn.
"Vua nước Sở một hôm lòng thanh thản,
Cởi long bào giả dạng một thường dân..."
Bộ tính xem cua đực cua cái làm gì sao "Chời".
http://www.youtube.com/watch?v=N6R7qENQfdY

Em làm theo cách hiểu của em như sau (trình độ mầm non VBA).
Bài tập 5

Mã:
Public Sub Xuan3()
Application.ScreenUpdating = False
Dim Rng As Range, Cll As Range, Dau As Long, Cuoi As Long, I As Long, Tem As Long, SoThang As Long, Thang As Long
With Sheets("ChiFi")
    Set Rng = .Range(.[A4], .[A65000].End(xlUp))
End With
With Sheets("sheet1")
.[A8:C1000].ClearContents
Dau = DateSerial(Year(.[C4]), Month(.[C4]), 1)
Cuoi = DateSerial(Year(.[C5]), Month(.[C5]), 1)
SoThang = DateDiff("m", Dau, Cuoi) + 1
For I = 1 To SoThang
    Thang = DateSerial(Year(Dau), Month(Dau) + I - 1, 1)
    .Cells(I + 7, 1).Value = I
    .Cells(I + 7, 2).Value = "Thang " & Format(Thang, "mm/yyyy")
    For Each Cll In Rng
            Tem = DateSerial(Year(Cll), Month(Cll), 1)
        If Tem = Thang Then
            .Cells(I + 7, 3).Value = .Cells(I + 7, 3).Value + Cll.Offset(, 4).Value
        ElseIf Tem > Thang Then
            Exit For
        End If
    Next
Next I
End With
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
Hổng dám mầm non đâu.
"Huốt" mẫu giáo "gồi".
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cái này bây giờ mới thấy
Mã:
    Thang = [COLOR=#ff0000]DateSerial[/COLOR](Year(Dau), Month(Dau) + I - 1, 1)
 
Upvote 0
Web KT
Back
Top Bottom