Chú ý: Các thành viên học lớp "Lập trình VBA trong Excel" có thể trao đổi bài ở đây

Liên hệ QC
PHP:
Option Explicit
Const tr As Long = 10 ^ 6
Function thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)

1 If (sChucvu = "gd") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
    thuong83 = 0
 ElseIf (sChucvu = "gd") And (iNgaycong > 30) And (bGioitinh = "nu") Then
11        thuong83 = 10 * tr * 2
 ElseIf (sChucvu = "gd") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
   thuong83 = 8 * tr * 2
 ElseIf (sChucvu = "gd") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
   thuong83 = 5 * tr * 2
 ElseIf (sChucvu = "gd") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
   thuong83 = 3 * tr * 2
 End If

2 If (sChucvu = "tp") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
    thuong83 = 0
 ElseIf (sChucvu = "tp") And (iNgaycong > 30) And (bGioitinh = "nu") Then
21   thuong83 = 10 * tr * 1.5
 ElseIf (sChucvu = "tp") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
   thuong83 = 8 * tr * 1.5
 ElseIf (sChucvu = "tp") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
   thuong83 = 5 * tr * 1.5
 ElseIf (sChucvu = "tp") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
   thuong83 = 3 * tr * 1.5
 End If

3 If (sChucvu = "nv") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
   thuong83 = 0
 ElseIf (sChucvu = "nv") And (iNgaycong > 30) And (bGioitinh = "nu") Then
31   thuong83 = 10 * tr
 ElseIf (sChucvu = "nv") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
   thuong83 = 8 * tr
 ElseIf (sChucvu = "nv") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
   thuong83 = 5 * tr
 ElseIf (sChucvu = "nv") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
   thuong83 = 3 * tr
 End If
End Function
Mình xin gợi 1 số í như sau:

(*) Tên hàm nên có chữ in & chữ thường, ví dụ Thuong83; (Để tránh lỗi chính tả không đáng có khi gõ nhập tên hàm trong chương trình & đây là thói quen không tồi chút nào)

Khi viết xong hàm, ta thở fào vài fút, sau 1 thời gian nào đó bạn nhìn lại & nghiền ngẫm 1 số vấn đề như sau

(*) Với số ngày công <5 thì dù có là bà trời đi nữa cũng có TT (tiền thưởng) = 0;
Như vậy ta có thể dùng 1 dòng lệnh thay cho ba dòng lệnh về ngày công < 5 trong hàm trên; ( tự thử đi nghe)

(*) Kế đến là TT chỉ fát cho đàn bà con gái, nên sGioiTinh="Nam", thì TT=0 (Ta dùng ngay 1 câu lệnh để hất đấn mày râu ra rìa;

(**) Thành tố trong khi tính hàm còn lại là thưởng theo chức vụ & theo ngày công;
Để tiếp, ta nên khai báo thêm biến để giữ HST (hệ số thưởng) theo chức vụ & HST theo ngày công;
Ví dụ
Dim HSChVu As Double, HSNgCg As Double

Sau đó ta tách ra cho từng trường hợp
If sChucVu ="GD" Then HSCVu =10
If sChucVu ="TF" Then HSCVu =8
. . . . .

Tương tự như vậy với ngày công;
. . . . . .

Sau cùng là dòng lệnh

Thuong83 = HSChVu * HSNgCg * Tr

Các bạn thử bớt chút thời gian thực thi theo gợi í của mình xem; Sẽ thấy thoáng mát trong chương trình ngay đó mà!

Chúc lớp nhiều thành công!
 
Lần chỉnh sửa cuối:
Ngồi rảnh nên "ngứa tay" và đã làm ví dụ đơn gian này để mọi người mới tham khảo thêm.........!!

PHP:
Option Explicit
Public Const App = "Hien thong bao"
Sub TinhTong()
    Dim MyRng As Range
    Dim answer As Double
    Set MyRng = Worksheets("Sheet1").Range("A1:A5")
    answer = Application.WorksheetFunction.Sum(MyRng)
    MsgBox "Ket qua la: " & answer, vbInformation, App
End Sub

Ngọc nhớ nguyên tắc đặt tên nhé!

Dim MyRng As Range

Nhìn vào MyRng người ta không biết nó nói lên thông tin gì? Vậy nên sửa là

Dim rngDoanhThu As Range

Với biến là kiểu Object/Class thì tiếp đầu ngữ là 3 ký tự viết tắt của kiểu giá trị hay tên Object/Class. Đây là bài học đầu tiên của lớp VBA mà.

Nhân đây cũng góp ý với các bạn là, đừng lo nghĩ về chuyện code ngắn hay dài mà quan trọng nó có tiết kiệm số phép tính cho máy hay không, nó có dễ đọc hiểu hay không.

Chúng ta lưu ý là, người viết truyện mà họ đọc lại thì đương nhiên họ sẽ hiểu ví chữ nghĩa rõ ràng. Nhưng người viết code thì phụ thuộc vào cách họ đặt tên biến, hàm , thủ tục , đối tượng, và trình bày rõ ràng, văn bản code có cấu trúc (cấp văn bản) thì sau này hay người khác mới có hy vọng biết mình làm gì.
 
...
Sau đó ta tách ra cho từng trường hợp
If sChucVu ="GD" Then HSCVu =10
If sChucVu ="TF" Then HSCVu =8
. . . . .

Không nên viết thế bạn ạ. Một khi sChucVu ="GD" thì không bao giờ xảy ra sChucVu ="TF" nữa, nên với cách viết trên của bạn máy tính phải làm những công việc mà không cần làm.

Với các bạn đang học lớp VBA Hà Nội. Chúng ta bắt đầu học thì hãy cố học bước căn bản đầu tiên, lưu ý những vấn đề chúng tôi đã nói hay đã viết ra ở đây hay ở lớp học. Các bạn gắng tập trung và kiên định đừng nóng vội về viết code hay mục tiêu của các bạn mà thành ẩu sau này khó đạt được cái đích của lớp học này.
 
Đây là bài của em làm nhưng hình như hơi rườm rà, mong mọi người cho ý kiến ah.
PHP:
Option Explicit

Function Thuong(ByVal sChucVu As String, ByVal iSocon As Integer) As Long
    Dim lThuongCV As Long
    Dim lThuongCon As Long
    If (sChucVu = "GD") Then
    lThuongCV = 2000000
        ElseIf (sChucVu = "PGD") Then
        lThuongCV = 1500000
            ElseIf (sChucVu = "TP") Then
            lThuongCV = 1000000
                ElseIf (sChucVu = "PP") Then
                lThuongCV = 500000
                     ElseIf (sChucVu = "NV") Then
                    lThuongCV = 300000
    End If
    If iSocon = 0 Then
    lThuongCon = 0
        ElseIf iSocon = 1 Then
        lThuongCon = 500000
             ElseIf iSocon = 2 Then
            lThuongCon = 1000000
    End If
    Thuong = lThuongCV + lThuongCon
End Function

Về nội dung hàm bạn viết là tốt. Không biết có phải do định dạng của diễn đang không mà code của bạn định dạng code là sai. Các khối lệnh cùng cấp văn bản thì để một level, khối con thì thụt vào một tab.

Để trình bày code trong diễn đang, nhìn dưới đáy màn hình bên phải, nhấn nút "Đổi Sang Khung Lớn", các bạn chọn những dòng code và bấm vào nút "CODE".
 
"Không nên viết thế bạn ạ. Một khi sChucVu ="GD" thì không bao giờ xảy ra sChucVu ="T

Có khi nó trở thành cái bẫy để tìm ra học viên có những suy nghĩ độc lập & sáng tạo cũng nên.


Chúc lớp học đạt nhiều thành quả!
 
E nộp bài. Mong thầy giáo, các bác và các bạn cho ý kiến. Các bác nếu ở trên cao thì nhìn tà tà xuống bên dưới chút nhé. kẻo bọn E tẩu hoả nhập ma, khi đọc code của các bác mất.
Không biết đề bài như thế nào, nhưng nhìn qua cách trình bày thuật toán của Bạn VuMinh, Em cũng có bài giải theo bài của Bạn VuMinh như sau. Mong các Thầy và các Anh xem góp ý nhé!
Mã:
Option Explicit
Const Tr As Long = 10 ^ 6
Function Thuong(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal sGioitinh As String) As Long
    If (iNgaycong < 10) Or (sGioitinh = "nam") Then
        Thuong = 0
    ElseIf (iNgaycong > 30) Then
        If (sChucvu = "gd") Then
            Thuong = 10 * Tr * 2
        ElseIf (sChucvu = "tp") Then
            Thuong = 10 * Tr * 1.5
        Else
            Thuong = 10 * Tr
        End If
    ElseIf (iNgaycong > 20) Then
        If (sChucvu = "gd") Then
            Thuong = 8 * Tr * 2
        ElseIf (sChucvu = "tp") Then
            Thuong = 8 * Tr * 1.5
        Else
            Thuong = 8 * Tr
        End If
    ElseIf (iNgaycong >= 15) Then
        If (sChucvu = "gd") Then
            Thuong = 5 * Tr * 2
        ElseIf (sChucvu = "tp") Then
            Thuong = 5 * Tr * 1.5
        Else
            Thuong = 5 * Tr
        End If
    Else
        If (sChucvu = "gd") Then
            Thuong = 3 * Tr * 2
        ElseIf (sChucvu = "tp") Then
            Thuong = 3 * Tr * 1.5
        Else
            Thuong = 3 * Tr
        End If
    End If
End Function
 

File đính kèm

  • CauHoi-Bai2-1.xls
    44.5 KB · Đọc: 7
Không nên viết thế bạn ạ. Một khi sChucVu ="GD" thì không bao giờ xảy ra sChucVu ="TF" nữa, nên với cách viết trên của bạn máy tính phải làm những công việc mà không cần làm.

Với các bạn đang học lớp VBA Hà Nội. Chúng ta bắt đầu học thì hãy cố học bước căn bản đầu tiên, lưu ý những vấn đề chúng tôi đã nói hay đã viết ra ở đây hay ở lớp học. Các bạn gắng tập trung và kiên định đừng nóng vội về viết code hay mục tiêu của các bạn mà thành ẩu sau này khó đạt được cái đích của lớp học này.

Code bài 2 cũ như thế này:
Mã:
Option Explicit
Const tr As Long = 10 ^ 6
Function thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)

If (sChucvu = "gd") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
    thuong83 = 0
    ElseIf (sChucvu = "gd") And (iNgaycong > 30) And (bGioitinh = "nu") Then
        thuong83 = 10 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
        thuong83 = 8 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
        thuong83 = 5 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
        thuong83 = 3 * tr * 2
End If

If (sChucvu = "tp") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
    thuong83 = 0
    ElseIf (sChucvu = "tp") And (iNgaycong > 30) And (bGioitinh = "nu") Then
        thuong83 = 10 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
        thuong83 = 8 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
        thuong83 = 5 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
        thuong83 = 3 * tr * 1.5
                        
End If
If (sChucvu = "nv") And (iNgaycong < 5) And (bGioitinh = "nu") Or (bGioitinh = "nam") Then
    thuong83 = 0
    ElseIf (sChucvu = "nv") And (iNgaycong > 30) And (bGioitinh = "nu") Then
        thuong83 = 10 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong > 20) And (iNgaycong <= 30) And (bGioitinh = "nu") Then
        thuong83 = 8 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 15) And (iNgaycong <= 20) And (bGioitinh = "nu") Then
        thuong83 = 5 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 10) And (iNgaycong < 15) And (bGioitinh = "nu") Then
        thuong83 = 3 * tr
                        
End If
End Function



Thầy ơi! Em cho gọn hơn thế này có được không ah.

Mã:
Option Explicit
Const tr As Long = 10 ^ 6
Function Thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)

If (iNgaycong < 5) Or (bGioitinh = "nam") Then
    thuong83 = 0
    ElseIf (sChucvu = "gd") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr * 2
    
    ElseIf (sChucvu = "tp") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr * 1.5
                        
    ElseIf (sChucvu = "nv") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr
                        
End If
End Function
 
Lần chỉnh sửa cuối:
Không biết đề bài như thế nào, nhưng nhìn qua cách trình bày thuật toán của Bạn VuMinh, Em cũng có bài giải theo bài của Bạn VuMinh như sau. Mong các Thầy và các Anh xem góp ý nhé!

Tạm thời thầy giáo đang ra đề bài rạng mở. Nên các bạn ai nghĩ ra cái gì làm cái đó.
Bạn NH_DK thích hiện vật hơn (Xe máy) thì ra đề theo kiểu hiện vật, còn em thích tiền thưỏng hơn ra đề theo kiểu tiền thưỏng. (hơn nữa thưởng 8/3) he he :))
Một số bạn khác thích trẻ con thì lấy tiêu thức thưỏng là số con (chắc khuyến khích tăng dân số) (?)
Buổi tới nếu thầy giáo ra đề gói gọn vào khuôn khổ nhất định, thì mọi nguời sẽ phải cùng tìm ra lời giải tối ưu nhất. Nhưng nếu ai "dùng công cụ mạnh" vượt trội ngoài phạm vi lớp học sẽ phạm quy
 
Lần chỉnh sửa cuối:
PHP:
Option Explicit
Const Tr As Long = 10 ^ 6
Function Thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)
 1     
 If (iNgaycong < 5) And (bGioitinh <> "nu") Or (bGioitinh = "nam") Then
    Thuong83 = 0
    EXit Function
 End If
 Dim dHSChucVu As Double, bHSNgayCong As Byte 
 If iNgaycong > 30) Then
        bHSNgayCong=  10 
 ElseIf  iNgaycong > 20 Then
        bHSNgayCong = 8 
 ElseIf (iNgaycong >= 15) Then
        bHSNgayCong  = 5 
 ElseIf  (iNgaycong >= 6) Then
        bHSNgayCong = 3 
 End If 
  dHSChucVu = 1
 If sChucVu="GD" Then
     dHSChucVu = 2
 ElseIf (sChucvu = "tp") Then
       dHSChucVu = 1.5
 End If
 2
  Thuong83 = dHSChucVu * bHSNgayCong * Tr                        

End Function
Nếu ta chưa học lệnh Exit Function thì hàm trên có thể viết thêm 2 dòng lệnh như sau:

Tại dòng lệnh 1 ta Viết Thuong83 = 1

Và Tại dòng lệnh mang số 2 ta viết If Thuong83=1 Then _
 
Thầy ơi! Em cho gọn hơn thế này có được không ah.

Mã:
Option Explicit
Const tr As Long = 10 ^ 6
Function Thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)

If (iNgaycong < 5) Or (bGioitinh = "nam") Then
    thuong83 = 0
    ElseIf (sChucvu = "gd") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr * 2
    ElseIf (sChucvu = "gd") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr * 2
    
    ElseIf (sChucvu = "tp") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr * 1.5
    ElseIf (sChucvu = "tp") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr * 1.5
                        
    ElseIf (sChucvu = "nv") And (iNgaycong > 30) Then
        Thuong83 = 10 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong > 20) Then
        Thuong83 = 8 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 15) Then
        Thuong83 = 5 * tr
    ElseIf (sChucvu = "nv") And (iNgaycong >= 6) Then
        Thuong83 = 3 * tr
                        
End If
End Function

Tốt lắm, trình độ lên nhanh quá ha!

Mặc dù Minh đã là ngắn lại và khác rõ ràng với cách lợp luận logic khi nói. Nhưng tối ưu hơn trong tính toán nên làm thế này.
Mã:
Option Explicit
Const tr As Long = 10 ^ 6

Function Thuong83(ByVal sChucvu As String, ByVal iNgaycong As Integer, ByVal bGioitinh As String)
    If (iNgaycong < 5) And (bGioitinh <> "nu") Or (bGioitinh = "nam") Then
        Thuong83 = 0
    ElseIf (sChucvu = "gd") Then
        If (iNgaycong > 30) Then
            Thuong83 = 10 * tr * 2
        ElseIf (iNgaycong > 20) Then
            Thuong83 = 8 * tr * 2
        ElseIf (iNgaycong >= 15) Then
            Thuong83 = 5 * tr * 2
        ElseIf (iNgaycong >= 6) Then
            Thuong83 = 3 * tr * 2
        End If
    ElseIf (sChucvu = "tp") Then
        If (iNgaycong > 30) Then
            Thuong83 = 10 * tr * 1.5
        ElseIf (iNgaycong > 20) Then
            Thuong83 = 8 * tr * 1.5
        ElseIf (iNgaycong >= 15) Then
            Thuong83 = 5 * tr * 1.5
        ElseIf (iNgaycong >= 6) Then
            Thuong83 = 3 * tr * 1.5
        End If
    ElseIf (sChucvu = "nv") Then
        If (iNgaycong > 30) Then
            Thuong83 = 10 * tr
        ElseIf (iNgaycong > 20) Then
            Thuong83 = 8 * tr
        ElseIf (iNgaycong >= 15) Then
            Thuong83 = 5 * tr
        ElseIf (iNgaycong >= 6) Then
            Thuong83 = 3 * tr
        End If
    End If
End Function

Trong lập trình, không quan trọng là viết ngắn hay dài mà là tối ưu về tính tính toán hay không!
 
Em làm một ví dụ cho bài tập về nhà ạ, các thầy và các bạn kiểm tra giúp ạ! Mà em không biết kiểm tra xem đúng sai thế nào ạ, các thầy chỉ cho em với, em cám ơn!
Mã:
Function ThuongCuoiNam(ByVal sChucvu As String, ByVal iNgaydimuon As Integer, ByVal sGiaykhen As String)
    Const tr As Long = 5 * 10 ^ 6
If (iNgaydimuon > 10) Then
    ThuongCuoiNam = 0
ElseIf (5 < iNgaydimuon =< 10) And (sGiaykhen = "co") Then
    If (sChucvu = "GD") Then
        ThuongCuoiNam = 2 * 1.5 * 0.5 * tr
    ElseIf (sChucvu = "TP") Then
        ThuongCuoiNam = 1.5 * 1.5 * 0.5 * tr
    ElseIf (sChucvu = "NV") Then
        ThuongCuoiNam = 1 * 1.5 * 0.5 * tr
    End If
ElseIf (5 < iNgaydimuon =< 10) And (sGiaykhen = "khong") Then
    If (sChucvu = "GD") Then
        ThuongCuoiNam = 2 * 1 * 0.5 * tr
    ElseIf (sChucvu = "TP") Then
        ThuongCuoiNam = 1.5 * 1 * 0.5 * tr
    ElseIf (sChucvu = "NV") Then
        ThuongCuoiNam = 1 * 1 * 0.5 * tr
    End If
ElseIf (iNgaydimuon =< 5) And (sGiaykhen = "co") Then
    If (sChucvu = "GD") Then
        ThuongCuoiNam = 2 * 1.5 * 1 * tr
    ElseIf (sChucvu = "TP") Then
        ThuongCuoiNam = 1.5 * 1.5 * 1 * tr
    ElseIf (sChucvu = "NV") Then
        ThuongCuoiNam = 1 * 1.5 * 1 * tr
    End If
ElseIf (iNgaydimuon =< 5) And (sGiaykhen = "khong") Then
    If (sChucvu = "GD") Then
        ThuongCuoiNam = 2 * 1 * 1 * tr
    ElseIf (sChucvu = "TP") Then
        ThuongCuoiNam = 1.5 * 1 * 1 * tr
    ElseIf (sChucvu = "NV") Then
        ThuongCuoiNam = 1 * 1 * 1 * tr
    End If
End If
End Function
 
Lần chỉnh sửa cuối:
Mà em không biết kiểm tra xem đúng sai thế nào ạ,
Muốn vậy bạn cần lập 1 bảng như vầy:
Ma|HoTen|MaCVu|SoNgayMuon|Khen|TThuongCN
GPE00|Ho Ba|GD|9|Co|
GPE03|Ha Sy|TP|2|Khong|
GPE09|To By|NV|9|Co|
GPE37|La Sy|NV|12|Co|
GPE05|Ca Ha|NV|9|Khong|
GPE73|Ma Vy|TP|32|Co|
Tại cột tiền thưởng CN bạn nhập cú fáp hàm & kiểm theo kết quả; Nếu đúng í đồ là được;


(2) Trong hàm bạn có thấy các dòng có chứa tên hàm có quá nhiều fép tính lặp lại không đấy?

Cũng có người sẽ làm vầy bạn à:

Khai báo 1 biến tạm, chắc ăn là kiểu Double, như

Dim Temp As Double;

Sau đó ta có thể viết gọn lại như sau:

PHP:
Function ThuongCuoiNam(ByVal sChucvu As String, ByVal iNgaydimuon As Integer, ByVal sGiaykhen As String)
    Const tr As Long = 5 * 10 ^ 6
 Dim Temp As Double 
If (iNgaydimuon > 10) Then
    ThuongCuoiNam = 0
ElseIf (5 < iNgaydimuon =< 10) And (sGiaykhen = "co") Then

    If (sChucvu = "GD") Then
        Temp = 2                                                        ' * 1.5 * 0.5 * tr'
    ElseIf (sChucvu = "TP") Then
        Temp = 1.5                                                     '      * 1.5 * 0.5 * tr'
    ElseIf (sChucvu = "NV") Then
        Temp = 1                                                        ' * 1.5 * 0.5 * tr'
    End If
    ThuongCuoiNam=Temp * 1.5 * .5 * Tr
ElseIf (5 < iNgaydimuon =< 10) And (sGiaykhen = "khong") Then
    If (sChucvu = "GD") Then
        Temp = 2                                                       ' * 1 * 0.5 * tr'
    ElseIf (sChucvu = "TP") Then
        Temp = 1.5                                                    ' * 1 * 0.5 * tr '
    ElseIf (sChucvu = "NV") Then
        Temp = 1                                                       ' * 1 * 0.5 * tr'
    End If
    
    ThuongCuoiNam=Temp * 1 * .5 * Tr

ElseIf (iNgaydimuon =< 5) And (sGiaykhen = "co") Then
' . . . .  . '
ElseIf (iNgaydimuon =< 5) And (sGiaykhen = "khong") Then
 '. . . . . . . '

End If
End Function
 
Em dùng biến Boolean để đặt nhưng tại sao công thức không cho kết quả đúng vậy? Thầy và AC xem dùm em nha!

PHP:
Option Explicit
Function Thuong(ByVal sChucVu As String, ByVal lNgayCong As Long, ByVal bGiaDinh As Boolean) As String
  With WorksheetFunction
    If (lNgayCong >= 20) And (bGiaDinh = "Co") Then
      Thuong = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     Thuong = "That dang tiec!"
    End If
  End With
End Function
Câu hỏi cụ thể hơn trong file đính kèm.
 

File đính kèm

  • Hoi_Boolean.rar
    6.4 KB · Đọc: 9
Ở đây biến bGiaDinh Là String mối được vì căn cứ dữ liệu đầu vào là String. Muốn có kết quả theo dạng này dữ liệu Cột E phải là có gia đình=True hay 1 và chưa gia đình là False hay 0. Code cũng phải sửa 1 chút

Mã:
Function Thuong(ByVal sChucVu As String, ByVal lNgayCong As Long, ByVal bGiaDinh As Boolean) As String
  With WorksheetFunction
    [B][COLOR=red]If (lNgayCong >= 20) And (bGiaDinh=True) Then[/COLOR][/B]  'Có thể viét gọn If (lNgayCong >= 20) And (bGiaDinh) Then
      Thuong = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     Thuong = "That dang tiec!"
    End If
  End With
End Function


 
Mình cũng có 1 bài đưa lên để các bạn tham khảo
 

File đính kèm

  • bangluong_VIS_1.zip
    79.8 KB · Đọc: 33
[Em dùng biến Boolean để đặt nhưng tại sao công thức không cho kết quả đúng vậy? Thầy và AC xem dùm em nha!

PHP Code:
Option Explicit
Function Thuong(ByVal sChucVu As String, ByVal lNgayCong As Long, ByVal bGiaDinh As Boolean) As String
With WorksheetFunction
If (lNgayCong >= 20) And (bGiaDinh = "Co") Then
Thuong
= .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
"Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
Else
Thuong = "That dang tiec!"
End If
End With
End
Function]


anh ơi. cái này em đã nói với thầy 1 lần trên diễn đàn rùi. tại kiểu gán boolean nó chỉ nhận 2 giá trị là True hoặc False. nên khi anh gán kiểu này anh phải đặt "có" = True, và "không" = False. vì nếu anh để là "có" hoặc "không" thì nó ko hiểu đâu.
 
violetdylan:''
Mình cũng có 1 bài đưa lên để các bạn tham khảo

Như thế này:

ElseIf (iSo_Tiet_Sang < 16) And (iSo_Tiet_Chieu < 12) Then
TroCap = 2000000
Thì mọi trường hợp đều được trợ cấp, chắc ý đồ của tác giả là như vậy.

Và cứ có thêm một dấu "x" là được + 500,000

If (sNu = "x") Then
TroCap = TroCap + 500000
End If
If (sChu_Nhiem = "x") Then
TroCap = TroCap + 500000
End If
If (sGia_Dinh = "x") Then
TroCap = TroCap + 500000
End If

Như vậy mức trợ cấp ở đây được tinh trước theo điều kiện các biến.
iSo_Tiet_Sang
iSo_Tiet_Chieu

Sau khi tính toán mức trợ cấp trên, rồi mới xét mức tăng thêm 500,000 cho mỗi dấu "x"

E "ti toe" vay co dung y bac violetdylan ko (loi Font TV chut)
 
Lần chỉnh sửa cuối:
anh ơi. cái này em đã nói với thầy 1 lần trên diễn đàn rùi. tại kiểu gán boolean nó chỉ nhận 2 giá trị là True hoặc False. nên khi anh gán kiểu này anh phải đặt "có" = True, và "không" = False. vì nếu anh để là "có" hoặc "không" thì nó ko hiểu đâu.

Cám ơn Hương! Bài này anh đã hiểu rồi. Kiểu Boolean nó chỉ nhận giá trị là TRUE hoặc FALSE thôi. Nên trong bài của anh đã thay đổi cột bGiaDinh = 1 và 0 rồi. Và tất nhiên KQ là đúng!!
 
Mình đã làm ví dụ này ("Hơi nâng cao chút" - có ít kiến thức chưa học), nếu ai muốn tham khảo thêm hãy xem nhé!
(Buổi tối rảnh nên làm cho vui thôi. Hi..........!)

PHP:
Option Explicit
Sub TinhTong()
 Dim Ham
 Dim rngVung As Range
 Dim eRw As Long
 Const a = "Cong"
 eRw = [I65500].End(xlUp).Row
 Set rngVung = Range([I5], Cells(eRw, "I"))
 Set Ham = Application.WorksheetFunction
 If Ham.Sum(rngVung) = 2 * Cells(eRw, "I") Then
   MsgBox "Da cong roi!"
 Else
   Cells(eRw + 1, "I").Value = Ham.Sum(rngVung)
   Cells(eRw + 1, "I").NumberFormat = "_(* #,##0_);_(* (#,##0);"""""
   Cells(eRw + 1, "I").Font.Bold = True
   Cells(eRw + 1, "I").Offset(, -4).Value = a
   Cells(eRw + 1, "I").Offset(, -4).Font.Bold = True
 End If
End Sub
Có file đính kèm.
 

File đính kèm

  • VBABt2_1.rar
    6.3 KB · Đọc: 14
Web KT
Back
Top Bottom