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
Đó là anh chưa tính khoản giảm trừ cho bản thân người nộp thuế 4 triệu. Nếu không có người phụ thuộc thì không được trừ gì hết, nhưng nếu có người phụ thuộc sẽ được giảm 2 khoản:
- 4 tr cho bản thân người nộp thuế
- 1.6 tr cho mỗi người phụ thuộc
Cho nên người phải nộp không có người phụ thuộc phải nộp: 5.000.000*0.05+1.400.000*0.1=390.000
Còn người kia tính khoản giảm trừ thì thu nhập thực chịu thuế là 8.000.000-4.000.000-1*1.600.000=2.400.000
Do đó thực nộp chỉ là 2.400.000*0.05=120.000 thôi.

Mình đang nói trên file của bạn ra mà : E7 nhập 6.400.000 F7 nhập 0 G7 =390000 (sai)
G6 = 120000 Đúng
 
Đây là bài về xếp loại học sinh của em (Cách xếp loại là em tự nghĩ ra, có gì sai anh Nghĩa bỏ qua cho nhé)
Mã:
Option Explicit

Function XepLoai(ByVal iDiemToan As Integer, ByVal iDiemLy As Integer, ByVal iDiemHoa As Integer) As String
Dim lTB As Long
lTB = (iDiemToan + iDiemLy + iDiemHoa) / 3
Select Case lTB
    Case Is >= 8
        If iDiemToan >= 7 And iDiemLy >= 7 And iDiemHoa >= 7 Then
            XepLoai = "Gioi"
        Else
            XepLoai = "Kha"
        End If
    Case Is >= 7
        If iDiemToan >= 5 And iDiemLy >= 5 And iDiemHoa >= 5 Then
            XepLoai = "Kha"
        Else
            XepLoai = "Trung Binh"
        End If
    Case Is >= 5
        If iDiemToan >= 4 And iDiemLy >= 4 And iDiemHoa >= 4 Then
            XepLoai = "Trung Binh"
        Else
            XepLoai = "Yeu"
        End If
    Case Is < 5
            XepLoai = "Yeu"
End Select
End Function
 

File đính kèm

  • Xep loai hoc sinh.rar
    13.8 KB · Đọc: 8
Lần chỉnh sửa cuối:
Chết thật! Em cũng sơ xuất quá, em lại không test mức >85 triệu chứ!!? Giờ em test lại mới thấy không đúng rồi.
Bác Công phát hiện đúng rồi đó.
Code của Anh Sealand sửa lại đoạn này mới đúng:
Mã:
Case Is > 80
Tncn1 = 0.35 * dTnhap -[COLOR=red] 18.15[/COLOR]
Sửa thành
Mã:
 Tncn1 = 0.35 * dTnhap - 9.85
 

File đính kèm

  • Thue TNCN da sua.rar
    14.3 KB · Đọc: 4
Lần chỉnh sửa cuối:
Có AC nào làm bài hàm tìm min có điều kiện chưa? Em làm được hàm max nhưng thay dấu > bằng dấu < để làm hàm min thì toàn bị giá trị là 0
Mã:
Function MyMinIf(ByVal rngVungTest As Range, ByVal GiaTriTest As Variant, ByVal rngVungSoLieu As Range) As Long
    Dim i As Long
    Dim lSoHang As Long
    lSoHang = rngVungTest.Rows.Count
        For i = 1 To lSoHang
            If rngVungTest(i) = GiaTriTest And rngVungSoLieu(i) < MyMinIf Then
                MyMinIf = rngVungSoLieu(i)
            End If
        Next i
End Function
 
Có AC nào làm bài hàm tìm min có điều kiện chưa? Em làm được hàm max nhưng thay dấu > bằng dấu < để làm hàm min thì toàn bị giá trị là 0
Bạn thử với cái ni xem ra răng, chừ?

PHP:
Option Explicit
Function MyMinIf(ByVal rngVungTest As Range, ByVal GiaTriTest As Variant, ByVal rngVungSoLieu As Range) As Long
 Dim i As Long, lSoHang As Long
 
 lSoHang = rngVungTest.Rows.Count
 For i = 1 To lSoHang
   If rngVungTest(i) = GiaTriTest And rngVungSoLieu(i) < MyMinIf Then
      MyMinIf = rngVungSoLieu(i)
   Else
      MsgBox MyMinIf, , rngVungSoLieu(i)
   End If
 Next i
End Function
 
Lần chỉnh sửa cuối:
Có vấn đề gì đấy mình chưa hiểu ra. Cái bài này http://www.giaiphapexcel.com/forum/group.php?do=discuss&discussionid=12&pp=10&page=2
Hàm MyMax thì được, nhưng đổi dấu > và < rồi nhưng hàm MyMIN thì lại không được

Ngoài chuyện đổi dầu, ta còn fải đổi trị nữa:

(*) Bạn có biết vào dòng lệnh đầu tiên MyMAX của bạn có trị là bao nhiêu không vậy?

Còn hàm MyMIN thì dòng lệnh đầu tiên được thêm là:

MyMIN= 2147483647

thì sẽ OK ngay tấp lự! Hãy thử & tìm nguyên nhân nha!


(*) MyMAX của bạn sẽ tầm bậy tầm bạ, nếu cột số liệu toàn âm đó nha!

Các bạn quên rằng kiểu dữ liệu Long có 1 nữa trong nó là số bé hơn không; & đừng quên chúng chứ!
 
Ngoài chuyện đổi dầu, ta còn fải đổi trị nữa:

(*) Bạn có biết vào dòng lệnh đầu tiên MyMAX của bạn có trị là bao nhiêu không vậy?

Còn hàm MyMIN thì dòng lệnh đầu tiên được thêm là:

MyMIN= 2147483647

thì sẽ OK ngay tấp lự! Hãy thử & tìm nguyên nhân nha!


(*) MyMAX của bạn sẽ tầm bậy tầm bạ, nếu cột số liệu toàn âm đó nha!

Các bạn quên rằng kiểu dữ liệu Long có 1 nữa trong nó là số bé hơn không; & đừng quên chúng chứ!

Bác ah! Em theo lời bác làm đúng như vầy là Ok

Option Explicit

Function MyMin(ByVal rngNum As Range) As Double
Dim MyCell As Range
MyMin = 2147483647
For Each MyCell In rngNum
If MyCell.Value < MyMin Then
MyMin = MyCell.Value
End If
Next
End Function
''================================================================
Function MyMax(ByVal rngNum As Range) As Double
Dim MyCell As Range
MyMax = -2147483647
For Each MyCell In rngNum
If MyCell.Value > MyMax Then
MyMax = MyCell.Value
End If
Next
End Function


Em thấy kiểu Long nhận giá trị từ - 2147483647 đến 2147483647 vậy nó có liên quan như thế nào đến MyMax = - 2147483647
mà ở đây hàm khai báo là kiểu Double.

*Tại sao lại thế? Nhờ bác giảng hộ em và các bạn với.
 
Em thấy kiểu Long nhận giá trị từ - 2147483647 đến 2147483647 vậy nó có liên quan như thế nào đến MyMax = - 2147483647
mà ở đây hàm khai báo là kiểu Double.
À rất mừng là bạn đã truy ra chuỗi số dài ngoãng kia nó từ đâu mà ra!

Còn mình lấy số đó là căn cứ vô hàm viết ở #108, ở đấy khai báo kiểu Long;

Thực ra sau này ta nhờ hàm MAX() /MIN() trong excel để ấn định thì chắc ăn hơn;

VD MyMAX = Application.WorkSheetFunction(MIN(rngMyRange)-9))
 
Em cũng xin tham gia 1 vi dụ nhỏ về bài học vòng lặp nha:

PHP:
Private Function TimTen(ByVal rngVung As Range) As String
    Dim rngCell As Range
    Set rngVung = Worksheets("Sheet2").Range("TEN") 'Vung B1:C10 minh dat bang TEN do
    For Each rngCell In rngVung
        If rngCell = "NGOC" Then
            TimTen = rngCell.Value
        End If
    Next
    Set rngVung = Nothing
End Function
 

File đính kèm

  • VBAbt4_For Each_Next.rar
    14.5 KB · Đọc: 11
Ngoài chuyện đổi dầu, ta còn fải đổi trị nữa:

(*) Bạn có biết vào dòng lệnh đầu tiên MyMAX của bạn có trị là bao nhiêu không vậy?

Còn hàm MyMIN thì dòng lệnh đầu tiên được thêm là:

MyMIN= 2147483647

thì sẽ OK ngay tấp lự! Hãy thử & tìm nguyên nhân nha!


(*) MyMAX của bạn sẽ tầm bậy tầm bạ, nếu cột số liệu toàn âm đó nha!

Các bạn quên rằng kiểu dữ liệu Long có 1 nữa trong nó là số bé hơn không; & đừng quên chúng chứ!

Bác cho em hỏi nhé: Tại sao MyMIN= 2147483647? Em cứ nghĩ mãi mà không biết ý nghĩa của nó? Tai sao lại phai bằng 1 số cụ thể đó? Mà khi trong vùng tính có giá trị nó vẫn tính được?
Và, cũng như vậy nếu tím giá trị Mã?
Bác tư vấn dùm em nha!!
Thank you very much!
 
Tại sao MyMIN= 2147483647? Em cứ nghĩ mãi mà không biết ý nghĩa của nó? Tai sao lại phai bằng 1 số cụ thể đó? Mà khi trong vùng tính có giá trị nó vẫn tính được?
Và, cũng như vậy nếu tím giá trị Max?
VuMinh tìm ra rồi đó nha, khi nào hỏi bạn ấy thử xem!

Nhân đây đề nghị các bạn nào trong lớp học rảnh rỗi viết dùm hàm MAXIF(rngVùng As Range,strCriteria As String)

để tìm trong Excel 2003 doanh số cực trị của 1 mã hàng nào đó.

Ma|DoanhThu
GPE01|10^3
GPE09|10^4
GPE01|123 456
GPE05|10^5
GPE09|987 654
GPE05|555 555
. . |. .

Chúc lớp học thành công mỹ mãn!
 
Lần chỉnh sửa cuối:
Em cũng xin tham gia 1 vi dụ nhỏ về bài học vòng lặp nha:

PHP:
Private Function TimTen(ByVal rngVung As Range) As String
    Dim rngCell As Range
    Set rngVung = Worksheets("Sheet2").Range("TEN") 'Vung B1:C10 minh dat bang TEN do
    For Each rngCell In rngVung
        If rngCell = "NGOC" Then
            TimTen = rngCell.Value
        End If
    Next
    Set rngVung = Nothing
End Function
Chà mới học đặt name áp dụng liền ta. Thêm 1 cách nữa không dùng vòng lặp đây
Mã:
Private Function TimTen1(ByVal rngVung As Range) As String
 Dim rngCell As Range
  Set rngVung = Worksheets("Sheet2").Range("TEN") 'Vung B1:C10 minh dat bang TEN do
    If Not rngVung.Find("NGOC", , xlValues, xlWhole) Is Nothing Then
        TimTen1 = "NGOC"
    End If
  Set rngVung = Nothing
End Function
 
VuMinh tìm ra rồi đó nha, khi nào hỏi bạn ấy thử xem!

Nhân đây đề nghị các bạn nào trong lớp học rảnh rỗi viết dùm hàm MAXIF(rngVùng As Range,strCriteria As String)

để tìm trong Excel 2003 doanh số cực trị của 1 mã hàng nào đó.

Ma|DoanhThu
GPE01|10^3
GPE09|10^4
GPE01|123 456
GPE05|10^5
GPE09|987 654
GPE05|555 555
. . |. .

Chúc lớp học thành công mỹ mãn!

Em chỉ hiểu được nếu MyMin= 2147483647 thì ô tìm có giá trị nhỏ nhất trong vùng nó khôn được lớn hơn MyMin (nếu lớn hơn không thoả mãn).
 
Em cũng xin tham gia 1 vi dụ nhỏ về bài học vòng lặp nha:

PHP:
Private Function TimTen(ByVal rngVung As Range) As String
    Dim rngCell As Range
    Set rngVung = Worksheets("Sheet2").Range("TEN") 'Vung B1:C10 minh dat bang TEN do
    For Each rngCell In rngVung
        If rngCell = "NGOC" Then
            TimTen = rngCell.Value
        End If
    Next
    Set rngVung = Nothing
End Function

Chà mới học đặt name áp dụng liền ta. Thêm 1 cách nữa không dùng vòng lặp đây
Mã:
Private Function TimTen1(ByVal rngVung As Range) As String
 Dim rngCell As Range
  Set rngVung = Worksheets("Sheet2").Range("TEN") 'Vung B1:C10 minh dat bang TEN do
    If Not rngVung.Find("NGOC", , xlValues, xlWhole) Is Nothing Then
        TimTen1 = "NGOC"
    End If
  Set rngVung = Nothing
End Function

Viết hàm (Function) là để dùng trên sheet hoặc dùng trong các thủ tục/ hàm khác. Hàm có tham số của hàm, trong bài trên là tham số rngVung, tham số này lấy 1 vùng từ bảng tính (As Range mà).
Thế mà trong hàm lại cố định rngVung là "Ten" (B1:C10), rồi tìm 'Ngoc" trong vùng đó. Thế là dù cho dùng hàm bao nhiêu lần, ở bất kỳ đâu, cũng đều cho 1 kết quả như nhau:
- hoặc là "Ngọc" nếu có "Ngoc" trong B1:C10,
- hoặc là lỗi nếu không có
Ngoài ra, nếu người dùng gõ: =TimTen1(D1:D10), nó cũng đi tìm trong B1:C10! Chứ không tìm trong vùng D1:D10 mà ngừoi dùng muốn.
 
Lần chỉnh sửa cuối:
VuMinh tìm ra rồi đó nha, khi nào hỏi bạn ấy thử xem!

Nhân đây đề nghị các bạn nào trong lớp học rảnh rỗi viết dùm hàm MAXIF(rngVùng As Range,strCriteria As String)

để tìm trong Excel 2003 doanh số cực trị của 1 mã hàng nào đó.
Chúc lớp học thành công mỹ mãn![/B][/I][/COLOR]
Em xin đưa cách lập hàm MaxIf bằng cách tìm tất cả các cells có chứa mã cần tính đưa vào 1 biến tạm sau đó dùng hàm Max. Code của Em như sau, mong Thầy và các Anh xem góp ý cho Em nhé!
Mã:
Private Function MaxIf(rngVung_ma As Range, sCriteria As String)
  Dim tmp(1 To 65500, 1 To 1), Clls As Range, jR As Long
    For Each Clls In rngVung_ma
        If Clls.Value = sCriteria Then
            jR = jR + 1
            tmp(jR, 1) = Clls.Offset(, 1)
        End If
    Next
  MaxIf = WorksheetFunction.Max(tmp)
End Function
 

File đính kèm

  • GPE.xls
    25 KB · Đọc: 7
Web KT
Back
Top Bottom