Bài tập cho người dùng VBA

  • Thread starter SA_DQ
  • Ngày gửi
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
Giả dụ chúng ta có 1 bảng dữ liệu & được trích ra phần nhỏ như hình kèm theo:
1759757286934.png


Nhiệm vụ được đề ra là số tiên ở cột cuối (6) sẽ được phân ra theo 1 trị cố định là 500 triệu cho mỗi dòng riêng biết
& dòng cuối là số dư dưới trị cố định theo qui ước trên (như hình dưới đây)

1759757506741.png
Để thực hiện việc này ta xài macro sau:

PHP:
Sub TaiPhanBo()
 Const FB As LongLong = 500000000
 Dim Rws As Long, DCK As LongLong, SoDu As LongLong, W As Long, SoDg As Integer, Col As Integer
 Dim Dg As Integer                          'DCK:= Du Cuôi Kì  '
 Dim Cls As Range
 
 Sheets("131TK").Select
 Rws = Sheets("131TK").UsedRange.Rows.Count
 SoFB = Cells(Rws + 9, "H").End(xlUp).Value / FB + Rws
 ReDim Arr(1 To SoFB, 1 To 4)
 For Each Cls In Range([A5], [A5].End(xlDown))
    W = W + 1:                          '    If W > 7 Then Exit For '
    DCK = Cells(Cls.Row, "H").Value:        SoDg = Int(DCK / FB)
    SoDu = DCK - SoDg * FB
    If SoDg < 1 Then
        Arr(W, 1) = Cls.Value:              Arr(W, 2) = Cls.Offset(, 1).Value
        Dg = Cls.Row:                       Arr(W, 3) = Cells(Dg, "F").Value
        Arr(W, 4) = DCK
    Else
        Arr(W, 1) = Cls.Value:              Arr(W, 2) = Cls.Offset(, 1).Value
        Dg = Cls.Row:                       Arr(W, 3) = Cells(Dg, "F").Value
        For hg = 1 To SoDg
            Arr(W, 4) = FB:                 W = W + 1
        Next hg
        If SoDu > 0 Then
            Arr(W, 4) = SoDu
        Else
            W = W - 1
        End If
    End If
 Next Cls
 [K5].Resize(W, 4).Value = Arr()
End Sub
 
Khóa học Quản trị dòng tiền
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
XÁC ĐỊNH NHANH SỐ CHÍNH PHƯƠNG (tác giả: Copilot)​
PHP:
Function LaSoChinhPhuong_TheoChiaHet(n As Long) As Boolean
    If n < 0 Then
        LaSoChinhPhuong_TheoChiaHet = False
        Exit Function
    End If    
    Dim du4 As Long, du5 As Long, du10 As Long
    du4 = n Mod 4
    du5 = n Mod 5
    du10 = n Mod 10
    If du4 = 2 Or du4 = 3 Then
        LaSoChinhPhuong_TheoChiaHet = False
        Exit Function
    End If    
    If du5 = 2 Or du5 = 3 Then
        LaSoChinhPhuong_TheoChiaHet = False
        Exit Function
    End If    
    If du10 = 2 Or du10 = 3 Or du10 = 7 Or du10 = 8 Then
        LaSoChinhPhuong_TheoChiaHet = False
        Exit Function
    End If    
    ' Nếu vượt qua các kiểm tra chia hết, ta dùng căn bậc hai để xác nhận
    LaSoChinhPhuong_TheoChiaHet = (Int(Sqr(n)) ^ 2 = n)
End Function
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
Nhờ hàm viết bỡi Copilot (bài bên trên liền kề), ta có thể viết 1 macro để tìm ra số chính phương từ biểu thứ,

(Y - 2) Y (Y + 2) - (Y + 4) - (Y + 6)​

& Chúc các bạn thành công!
 
Sửa lần cuối:
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
(/iết 1 hàm dịch (số) tháng ra thành chữ:
PHP:
Function DocThang(Num As Integer) As String
 Dim G10 As String
 
 G10 = "m" & ChrW(432) & ChrW(7901) & ChrW(105)
 DocThang = "tháng " & Choose(Num, "giêng", "hai", "ba", _
    ChrW(116) & ChrW(432), ChrW(110) & ChrW(97) & ChrW(109), _
        "sáu", ChrW(98) & ChrW(7843) & ChrW(121), "tám", "chín" _
             , G10, G10 & " " & "m" & ChrW(7897) & "t", G10 & " hai")
End Function
Trong ngành kế toàn ta không lạ gì hàm đọc số thành chữ; ví như =DocSo(Num)
Kết hợp giữa 2 hàm này, ta có thể biến dữ liệu ngày-thàng-năm (giả dụ tại ô B2 thành chuỗi thể hiện ngày-tháng năm như kiểu:
'Hôm này ngày hai mươi mốt tháng mười một năm hai ngàn linh chín
Chẳng hạn tại 1 ô trống trên trang tính ta nhập:
="Hôm nay ngày " & DocSo(Day(B2)) & " " & DocThang(Month(B2)) & " năm " & DocSo(Year(B2)) & "."
 
Sửa lần cuối:

Xem nhiều