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
Mình nghĩ cũng nên đưa ra các giải thuật hay để các học viên tham khảo giống như bài tập bình thường và bài nâng cao vậy. Có như vậy mới khuyến khích vận dụng sáng tạo những cái VBA cung cấp để phục vụ yêu cầu của mình. Ngay như bài này cũng vậy, Ngọc và các bạn cũng tham khảo hàm này của mình xem sao? Vậy là ít nhất các bạn cũng có 2 cách viết

Mã:
Function TinhThuong1(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
  With WorksheetFunction
    If (lNgayCong >= 20) And (sGiaDinh = "Co") Then
      TinhThuong1 = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     TinhThuong1 = "That dang tiec!"
    End If
  End With
End Function
 
Mình nghĩ cũng nên đưa ra các giải thuật hay để các học viên tham khảo giống như bài tập bình thường và bài nâng cao vậy. Có như vậy mới khuyến khích vận dụng sáng tạo những cái VBA cung cấp để phục vụ yêu cầu của mình. Ngay như bài này cũng vậy, Ngọc và các bạn cũng tham khảo hàm này của mình xem sao? Vậy là ít nhất các bạn cũng có 2 cách viết

Mã:
Function TinhThuong1(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
  With WorksheetFunction
    If (lNgayCong >= 20) And (sGiaDinh = "Co") Then
      TinhThuong1 = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     TinhThuong1 = "That dang tiec!"
    End If
  End With
End Function
Đã vậy thì làm thêm 1 cách, chả biết có nhanh hơn nhưng nghiên cứu thêm về code cho vui.
PHP:
Function TinhThuongDic(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
Dim iKQ As String, Arr01(), Arr02(), i As Long
Arr01 = Array("GD", "PGD", "TP", "NV")
Arr02 = Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", "Bo hoa tuoi")
If lNgayCong >= 20 And sGiaDinh = "Co" Then
  For i = 0 To UBound(Arr01)
    With CreateObject("Scripting.Dictionary")
      .Add Arr01(i), i
      If .Exists(sChucVu) Then
        iKQ = Arr02(.Item(sChucVu))
        Exit For
      End If
    End With
  Next i
Else
  iKQ = "That dang tiec!"
End If
TinhThuongDic = iKQ
Erase Arr01, Arr02
End Function
Nhưng mà dài quá.
 
Mình nghĩ cũng nên đưa ra các giải thuật hay để các học viên tham khảo giống như bài tập bình thường và bài nâng cao vậy. Có như vậy mới khuyến khích vận dụng sáng tạo những cái VBA cung cấp để phục vụ yêu cầu của mình. Ngay như bài này cũng vậy, Ngọc và các bạn cũng tham khảo hàm này của mình xem sao? Vậy là ít nhất các bạn cũng có 2 cách viết

Mã:
Function TinhThuong1(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
  With WorksheetFunction
    If (lNgayCong >= 20) And (sGiaDinh = "Co") Then
      TinhThuong1 = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     TinhThuong1 = "That dang tiec!"
    End If
  End With
End Function

Cảm ơn anh đã chia sẻ. Chắc chắn một điều những học viên mới học đến buổi thứ hai về VBA này mới biết thế nào là Macro, Thủ tục, Hàm, Kiểu giá trị, khai báo biến, Cấu trúc If thì đọc bài của anh không thể hiểu đâu. Anh hãy chia sẻ những giải thuật hay trong phạm vi kiến thức của họ. Ví dụ hiểu sâu sắc về tham số trong hàm, thủ tục? Hiểu sâu sắc về cách xây dựng biểu thức logic,.....Đó là cơ sở để sáng tạo đó. Trong bài của anh có đụng tới việc khai thác đối tượng của Excel là WorksheetFunction và kiến thức về mảng Array. Đến bài học này chắc bài viết này của anh sẽ có ích nhiều cho các học viên. Lúc đó anh cho các ví dụ và phân tích sâu sắc về ứng dụng chúng nhé.
 
Lần chỉnh sửa cuối:
Xin phép chủ topic, xin phép các Thầy, các anh cho em chen ngang chút xíu:

Thật sự mà nói em không biết gì về VBA cả nên khi thấy có topic này cũng hy vọng là mình có thể nắm được những định nghĩa ban đầu cái mà chị HYên gọi là i tờ, nên em theo dõi cũng thường xuyên topic này, em rất thích những bài viết kiểu như bài về IF và có sự phân tích của Thầy Tuân trong topic này. Hỏng biết có thành viên nào đó của lớp học có thể sau mỗi buổi học chịu khó ghi chép và post lại về lý thuyết bài giảng, những ví dụ và cả phần bài tập hôm đó để thành viên khác như em ở xa không có điều kiện tham gia củng có thể học tại đây được không ah.

Chân thành cảm ơn và chúc các anh chị thành công.
 
Trước tiên, em xin cám ơn thầy Tuân đã góp ý dùm em. Thứ 2, em xin cám ơn tất cả các AC ở GPE đã chia sẻ cho em và các thành viên trong lớp học "Lập trình VBA trong Excel" những ví dụ và những lời khuyên thật hữu ích! Tuy lớp học bắt bắt đầu, nhưng các thầy và các AC đã rất nhiệt tình giúp đỡ chúng em. Trong quá trình học, em cũng như các thành viên trong lớp rất mong các thầy và các AC trên GPE chia sẻ cho chúng em thêm về kiến thức VBA nhé!
Một lần nữa, em xin chân thành cám ơn các thầy và các AC trong GPE!
 
Xin phép chủ topic, xin phép các Thầy, các anh cho em chen ngang chút xíu:

Thật sự mà nói em không biết gì về VBA cả nên khi thấy có topic này cũng hy vọng là mình có thể nắm được những định nghĩa ban đầu cái mà chị HYên gọi là i tờ, nên em theo dõi cũng thường xuyên topic này, em rất thích những bài viết kiểu như bài về IF và có sự phân tích của Thầy Tuân trong topic này. Hỏng biết có thành viên nào đó của lớp học có thể sau mỗi buổi học chịu khó ghi chép và post lại về lý thuyết bài giảng, những ví dụ và cả phần bài tập hôm đó để thành viên khác như em ở xa không có điều kiện tham gia củng có thể học tại đây được không ah.

Chân thành cảm ơn và chúc các anh chị thành công.
Em cũng có ý kiến như anh tungnguyen_kt! Việc tạo ra những topic này đúng là rất có ích cho những người mới bắt đầu học. Bản thân Em thì tự mày mò tự học trên sách và trên diễn đàn, thấy cái nào hay là cóp nhặt về nghiên cứu rồi tập hợp lại thành. Trước đây cũng có chuyên đề về vòng lặp For....next của anh Mỹ (PTM) mở
http://www.giaiphapexcel.com/forum/showthread.php?6354-Giới-thiệu-Cơ-bản-về-vòng-lặp-For-.-.-.-next
Cũng như Bài tập về vòng lặp anh Tuấn (NDU) mở
http://www.giaiphapexcel.com/forum/showthread.php?39326-Bài-tập-về-vòng-lặp
Các Anh lại tận tình hướng dẫn, giúp đỡ. các bạn nào mứoi bắt đầu học hay đang học nên thường xuyên theo dõi, tham gia giải các Bài tập mà các Bạn, các anh đưa ra -> nếu không rõ cái gì post lên nhờ giúp đỡ dần dần sẽ quen.
 
Lớp mình nếu ai chưa hiểu lắm về Byval và Byref thì đọc thêm ở đây nhé! Đây là bài của thầy P.T.Hướng viết trên GPE.
 
Function TinhThuong(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
If (sChucVu = "GD") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
TinhThuong = "Xe may Attila"
ElseIf (sChucVu = "PGD") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
TinhThuong = "Xe may Jupiter"
ElseIf (sChucVu = "TP") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
TinhThuong = "Xe may Wave anpha"
ElseIf (sChucVu = "NV") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
TinhThuong = "Bo hoa tuoi"
Else
TinhThuong = "That dang tiec!"
End If
End Function

Thầy ơi! E hỏi tý: sChucVu as String có lãng phí không ạ vì nếu chức vụ nằm ngoài "GD, PGD, NV,TP" là đã thực hiện cái này:

Else
TinhThuong = "That dang tiec!"

Điều này có nghĩa, biến sChucVu chỉ cần đặt bé tẹo hoặc interger là ổn (không biết em hiểu vậy có đúng không)

Mọi người cùng cho ý kiến nhé.
 
Lần chỉnh sửa cuối:
"E hỏi tý: sChucVu as String có lãng phí không ạ"

Khai báo như vậy thường người ta gọi là khai báo tường minh & như trên là thấy Tuân khen rồi còn gì;

Còn khai báo khơi khơi í ư?

Tôi sẵn cho bạn 1 vì dụ đây:

Nhà có nhiều loại dao, nào lá cán gỗ, bằng nhựa hoàn toàn, cán bằng nhựa & cán bằng inox;

Khi Sếp chuẩn bị thái thịt & ra lệnh "Đưa tôi con dao"

(*) Lúc vui thì đưa dao cán gỗ thái được thịt;
(*) Lúc buốn thì đưa con dao nhựa ra chơi! Làm gì nhau nào;

Tất nhiên so sánh là khập khiển, nhưng cũng có người nói, khai tường minh sẽ nhanh có đáp án hơn.

& ờ đây là Thầy Tuân không chỉ truyền đạt trí thức không đâu, mà còn truyền thụ cả tri thức nữa đó bạn.



Chân thành chúc Lớp ta thành công mỹ mãn!
 
Khai báo như vậy thường người ta gọi là khai báo tường minh & như trên là thấy Tuân khen rồi còn gì;

Còn khai báo khơi khơi í ư?

Tôi sẵn cho bạn 1 vì dụ đây:

Nhà có nhiều loại dao, nào lá cán gỗ, bằng nhựa hoàn toàn, cán bằng nhựa & cán bằng inox;

Khi Sếp chuẩn bị thái thịt & ra lệnh "Đưa tôi con dao"

(*) Lúc vui thì đưa dao cán gỗ thái được thịt;
(*) Lúc buốn thì đưa con dao nhựa ra chơi! Làm gì nhau nào;

Tất nhiên so sánh là khập khiển, nhưng cũng có người nói, khai tường minh sẽ nhanh có đáp án hơn.

& ờ đây là Thầy Tuân không chỉ truyền đạt trí thức không đâu, mà còn truyền thụ cả tri thức nữa đó bạn.



Chân thành chúc Lớp ta thành công mỹ mãn!

Cám ơn bác. Thế mới hay bấy lâu cách hiểu của em là có vấn đề.
Em cứ nghỉ rằng khai báo trong khoảng hẹp hơn thì rõ hơn và tiết kiệm "tài nguyên hơn" vì thấy Interger nó nhận (-32,768 to 32,767)
Còn String nó nhận (1 to approximately 65,400)
Vì vậy Em lại hiểu khai báo Interger là thu hẹp khoảng lại là "Con dao dùng được" Còn String nó sẽ nhận "con dao bất kỳ"

Em muốn tiến bộ nên không dấu dốt nhờ thầy giáo và các Bác giảng giải thêm để em có thể sáng hơn được chút.

P/s: Đoạn này là em mới sửa thêm.
đáng ra Em phải hiểu Interger nó là kiểu số và String nó là kiểu chuỗi thì có vẻ ổn hơn các bác nhỉ
 
Lần chỉnh sửa cuối:
Mình nghĩ cũng nên đưa ra các giải thuật hay để các học viên tham khảo giống như bài tập bình thường và bài nâng cao vậy. Có như vậy mới khuyến khích vận dụng sáng tạo những cái VBA cung cấp để phục vụ yêu cầu của mình. Ngay như bài này cũng vậy, Ngọc và các bạn cũng tham khảo hàm này của mình xem sao? Vậy là ít nhất các bạn cũng có 2 cách viết

Mã:
Function TinhThuong1(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
  With WorksheetFunction
    If (lNgayCong >= 20) And (sGiaDinh = "Co") Then
      TinhThuong1 = .Index(Array("Xe may Attila", "Xe may Jupiter", "Xe may Wave anpha", _
       "Bo hoa tuoi"), .Match(sChucVu, Array("GD", "PGD", "TP", "NV")))
       Else
     TinhThuong1 = "That dang tiec!"
    End If
  End With
End Function
Thiết nghĩ ai biết công thức Excel thì kiến thức này chẳng phải là quá cao siêu (cũng như ta gõ trên cell thôi)
Có điều em nghĩ nếu dùng MATCH thì anh phải bẫy lỗi thôi ----> Mọi trường hợp khiến cho hàm MATCH bị lỗi đều phải trả về kết quả "Thật đáng tiếc"
 
Congminh
Mình có góp ý nhỏ với Ngọc nhé!
Tất cả các trường hợp có thưởng đều có điều kiện chung là: Ngaycong >=20 và Giadinh = "Co" -> Vậy sao Bạn không gộp nó thành điều kiện chung rồi dùng IF cho trường hợp còn lại là chức vụ thôi.
Đại loại như vầy:
Code:
Function Thuong(ByVal CVu As String, NgCong As Long, GDinh As String) As String
If NgCong >= 20 And GDinh = "Co" Then
If CVu = "GD" Then Thuong = "Xe may Attila"
If CVu = "PGD" Then Thuong = "Xe may Jupiter"
If CVu = "TP" Then Thuong = "Xe may Wave anpha"
If CVu = "NV" Then Thuong = "Bo hoa tuoi"
Else
Thuong = "That dang tiec!"
End If
End Function



Ý tưởng này rất hay. cám ơn bác minh công nhé
 
Lần chỉnh sửa cuối:
[
HTML:
[QUOTE][QUOTE][B]Nguyên văn bởi NH_DK  
Đây là ví dụ bài tập mà buổi học tối qua thầy giáo cho. Mình đã làm và giờ mình post lên để mọi người tham khảo nha!
Code:
Function TinhThuong(ByVal sChucVu As String, lNgayCong As Long, sGiaDinh As String) As String
    If (sChucVu = "GD") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
        TinhThuong = "Xe may Attila"
    ElseIf (sChucVu = "PGD") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
        TinhThuong = "Xe may Jupiter"
    ElseIf (sChucVu = "TP") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
        TinhThuong = "Xe may Wave anpha"
    ElseIf (sChucVu = "NV") And (lNgayCong >= 20) And (sGiaDinh = "Co") Then
        TinhThuong = "Bo hoa tuoi"
    Else
        TinhThuong = "That dang tiec!"
    End If
End Function

Mới học viết được như vậy là khá đấy Ngọc à. Qua hàm Ngọc viết, tôi có nhận xét thế này.

+ Về cách đặt tên tham số đúng quy ước ==>Tốt.
+ Về định dạng code đúng theo quy ước ==> Tốt.
+ Trình bày cấu trúc If đúng ==> Tốt.
+ Khai báo kiểu giá trị, tham số sGiaDinh As String nên là bGiaDinh As Boolean vì tham số này chỉ nhận 1 trong hai giá trị True, False mà thôi.
+ Khai báo tham số thiếu Byval ==> Không chuẩn. "Làm gì đều cần có lý do" :).

Qua bài phân tích hàm If của tôi ở trên, Ngọc và các bạn khác hãy chỉnh lại cho tối ưu hơn?[QUOTE][TABLE][B][/B][/TABLE][/QUOTE]][/QUOTE]



thầy ơi, theo em thì nếu muốn dùng kiểu boolean thì trước khi mình chạy lệnh IF mình phải có lệnh gán "có = TRUE", "không=FALSE". nếu ko thì lúc mình viết biểu thức logic thì nó sẽ không hiểu "có" hoặc "không" là gì.
 
Lần chỉnh sửa cuối:
CODE:
Mã:
Option Explicit


Function TienThuong(ByVal sChucVu As String, ByVal iSoNgayCong As Integer, ByVal iSoCon As Integer) As Double
    
    If (iSoNgayCong < 285) Then
        TienThuong = iSoCon * 50000
    
        ElseIf (285 <= iSoNgayCong < 290) Then
            If (sChucVu = "TP") Then
                TienThuong = (iSoNgayCong / 25) * 2000000 + iSoCon * 50000
                ElseIf (sChucVu = "NV") Then
                    TienThuong = (iSoNgayCong / 25) * 1500000 + iSoCon * 50000
            End If
        ElseIf (290 <= iSoNgayCong <= 300) Then
            If (sChucVu = "TP") Then
                TienThuong = (iSoNgayCong / 25) * 2200000 + iSoCon * 50000
                ElseIf (sChucVu = "NV") Then
                    TienThuong = (iSoNgayCong / 25) * 1700000 + iSoCon * 50000
            End If
    End If
      
        
End Function

đây là bài em làm để tính tiền thưởng cuối năm. mong cả nhà chỉ giáo thêm giúp em.
P/S:
 
Lần chỉnh sửa cuối:
đây là bài em làm để tính tiền thưởng cuối năm. mong cả nhà . . .

Bạn xài quá nhiều số không, thật là lãng fí & dễ sai sót;
Nếu Thầy chưa truyền đạt thì xin mạn fép thông báo

Ta nên khai báo 1 hằng số Tr cho trường hợp làm việc với tiền đồng của chúng ta; Khai báo đó là:
Mã:
 Const Tr As Long = 10^6
Sau đó trong chương trình thay vì dòng

Mã:
TienThuong = (iSoNgayCong / 25) * 2000000 + iSoCon * 50000
ta xài

PHP:
TienThuong = (iSoNgayCong / 25) * 2* Tr + iSoCon * 50000
Hãy làm thế với số hàng vạn, nếu trong chương trình xài nhiều số hàng vạn, hay với các số khác . . . .


Chúc vui cuối tuần, khà,khà,. . .
 
Đâ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.
Mã:
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
 

File đính kèm

  • BTVN IF.xls
    32.5 KB · Đọc: 6
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
 
Đâ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.
Mã:
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

Bài của Hoàn mình xin chỉnh lại chút thôi nhé:

PHP:
Function Thuong(ByVal sChucVu As String, ByVal iSocon As Integer) As Double
    Dim lThuongCV As Double
    Dim lThuongCon As Double
    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
    Else
        lThuongCV = 0
    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
Chúc vui vui.......!!!
 
Lần chỉnh sửa cuối:
Bạn xài quá nhiều số không, thật là lãng fí & dễ sai sót;
Nếu Thầy chưa truyền đạt thì xin mạn fép thông báo

Ta nên khai báo 1 hằng số Tr cho trường hợp làm việc với tiền đồng của chúng ta; Khai báo đó là:
Mã:
 Const Tr As Long = 10^6
Sau đó trong chương trình thay vì dòng

Mã:
TienThuong = (iSoNgayCong / 25) * 2000000 + iSoCon * 50000
ta xài

PHP:
TienThuong = (iSoNgayCong / 25) * 2* Tr + iSoCon * 50000
Hãy làm thế với số hàng vạn, nếu trong chương trình xài nhiều số hàng vạn, hay với các số khác . . . .


Chúc vui cuối tuần, khà,khà,. . .

Khai báo Const thầy Tuân dạy rùi. Chỉ là bọn E chưa biết vận dụng thôi.
Khi làm bài, em cứ phải đếm số 0 để nhập (Vì chưa viết vận dụng)
Thế là lại thêm 1 điều hay.
Thanks bác Hyen17. Em post bài bên dưới bác ngó qua giúp em nhé
 
Lần chỉnh sửa cuối:
Nộp bài buổi học thứ 2 - VBA

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.
 

File đính kèm

  • CauHoi-Bai2-1.xls
    45 KB · Đọc: 11
Web KT
Back
Top Bottom