Giúp em học VBA bằng bài tập xếp loại học sinh

Liên hệ QC

nguyenmanhnam

Thành viên tiêu biểu
Tham gia
24/7/10
Bài viết
434
Được thích
266
Đề bài của em tức dữ liệu đầu vào ở cột A, kết quả sẽ ra tương ứng ở cột B. Điều kiện xếp loại như sau ah:
- Nếu điểm nhập nhỏ hơn 0 hoặc lớn hơn 10. Kết quả ra đáp số là không hợp lệ.
- Nếu dữ liệu nhập vào cột A >=8. Kết quả là HSG
- Nếu dữ liệu cột A>=7. Kết quả là HSTT
- Nếu dữ liệu >=5. Kết quả là TB
- Nếu dữ liệu >=0. Kết quả Yếu.
Hôm qua em mới nghiên cứu bài đầu tiên của thày ptm0412 và thày Ndu. Em rất cần bài đơn giản như bài này để nghiên cứu hoàn thiện If then và Fox Next. Kính mong các thày giúp đỡ.
 

File đính kèm

Lần chỉnh sửa cuối:
Đây là 1 tham khảo vui

PHP:
Option Explicit
Function gpeXepLoai(Diem As Double) As String
  Const KHL As String = "Khong Hop Le"
 
 gpeXepLoai = _
        Switch(Diem < 0, KHL, Diem < 5, "Yéu", Diem < 7, "HS TB", Diem < 8, "HS TT", Diem <= 10, "HSG", Diem > 10, KHL)

End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
PHP:
Option Explicit
Function gpeXepLoai(Diem As Double) As String
  Const KHL As String = "Khong Hop Le"
 
 gpeXepLoai = _
        Switch(Diem < 0, KHL, Diem < 5, "Yéu", Diem < 7, "HS TB", Diem < 8, "HS TT", Diem <= 10, "HSG", Diem > 10, KHL)

End Function

Em đang tập chủ đề liên quan đến If ..then và Next....For. Bác có thể giúp em giải theo cách này được không ah? Em xin đa tạ
 
Upvote 0
Em đang tập chủ đề liên quan đến If ..then và Next....For. Bác có thể giúp em giải theo cách này được không ah? Em xin đa tạ
Vậy thì thử cái này xem sao (nhưng nếu là mình thì mình vẫn khoái cái anh chàng Switch kia hơn nhiều):
PHP:
Function XL(Diem As Double) As String
    If Diem < 0 Or Diem > 10 Then
        XL = "Khong hop le"
    ElseIf Diem < 5 Then
        XL = "Yeu"
    ElseIf Diem < 7 Then
        XL = "HS TB"
    ElseIf Diem < 8 Then
        XL = "HS TT"
    Else
        XL = "HSG"
    End If
End Function
 
Upvote 0
Nhờ giải bằng cách chuyển từ Funtion bằng Sub

không dấu gì các bác, em đang tìm cách nghiên cứu cái For...Next của sư phụ Ptm0412, các bác giải bằng Funtion ngon thế này chắc nó hết đường xuất hiện. Em nghĩ nếu giải theo thủ tục Sub có lẽ nó sẽ có For...Next, do em chưa thạo lắm về vụ này xin được tiếp tục nhờ giúp cho
 
Upvote 0
Vì đề bài của bạn cho chỉ giải được bằng các cách dùng IF, SWITCH, CASE nhưng không sử dụng vòng lặp For Next được thì khi chuyển qua Sub cũng thế thôi
Mình thấy bài này có thể giải bằng For Next được, sẵn trớn bạn giải giúp bạn í luôn một thể
http://www.giaiphapexcel.com/forum/...-giải-một-chuỗi-công-thức-tính-sang-cột-B2-th
Đừng quan tâm tới code bên trên của bạn ấy, theo đề bài dưới mà làm
Gợi ý:
Bạn tạo một Hằng hoặc Biến gồm các số từ 0 => 9 & các ký hiệu .+ - * / ^ ()[]
Cho vòng lặp chạy từ ký tự đầu đến cuối, ký tự nào tìm thấy trong Hằng hoặc Biến trên thì ta lấy ( hay hơn nữa là bạn cho biến chạy từ dấu ":" _hai chấm_ tới ký tự cuối)
Dùng Evaluate để tính giá trị vừa tìm thấy
Hihi, một công đôi ba việc
Chúc thành công
Thân
 
Upvote 0
Vì đề bài của bạn cho chỉ giải được bằng các cách dùng IF, SWITCH, CASE nhưng không sử dụng vòng lặp For Next được thì khi chuyển qua Sub cũng thế thôi
Mình thấy bài này có thể giải bằng For Next được, sẵn trớn bạn giải giúp bạn í luôn một thể
http://www.giaiphapexcel.com/forum/showthread.php?52164-Cách-tạo-hàm-mới-(-Từ-một-cột-(A2)-diễn-giải-một-chuỗi-công-thức-tính-sang-cột-B2-th
Đừng quan tâm tới code bên trên của bạn ấy, theo đề bài dưới mà làm
Gợi ý:
Bạn tạo một Hằng hoặc Biến gồm các số từ 0 => 9 & các ký hiệu .+ - * / ^ ()[]
Cho vòng lặp chạy từ ký tự đầu đến cuối, ký tự nào tìm thấy trong Hằng hoặc Biến trên thì ta lấy ( hay hơn nữa là bạn cho biến chạy từ dấu ":" _hai chấm_ tới ký tự cuối)
Dùng Evaluate để tính giá trị vừa tìm thấy
Hihi, một công đôi ba việc
Chúc thành công
Thân
Vâng, vì em chưa thực hành nhiều nên chưa hình dung ra (vì em nghĩ rằng nếu làm việc với cả cột A thì nó phải Next từ ô này đến ô kia...), em xin cảm ơn thày nhiều.
 
Upvote 0
Vì đề bài của bạn cho chỉ giải được bằng các cách dùng IF, SWITCH, CASE nhưng không sử dụng vòng lặp For Next được thì khi chuyển qua Sub cũng thế thôi
Mình thấy bài này có thể giải bằng For Next được, sẵn trớn bạn giải giúp bạn í luôn một thể
http://www.giaiphapexcel.com/forum/showthread.php?52164-Cách-tạo-hàm-mới-(-Từ-một-cột-(A2)-diễn-giải-một-chuỗi-công-thức-tính-sang-cột-B2-th
Đừng quan tâm tới code bên trên của bạn ấy, theo đề bài dưới mà làm
Gợi ý:
Bạn tạo một Hằng hoặc Biến gồm các số từ 0 => 9 & các ký hiệu .+ - * / ^ ()[]
Cho vòng lặp chạy từ ký tự đầu đến cuối, ký tự nào tìm thấy trong Hằng hoặc Biến trên thì ta lấy ( hay hơn nữa là bạn cho biến chạy từ dấu ":" _hai chấm_ tới ký tự cuối)
Dùng Evaluate để tính giá trị vừa tìm thấy
Hihi, một công đôi ba việc
Chúc thành công
Thân
Vâng, vì em chưa thực hành nhiều nên chưa hình dung ra (vì em nghĩ rằng nếu làm việc với cả cột A thì khi nó phải Next từ ô này đến ô kia...), em xin cảm ơn thày nhiều.
 
Upvote 0
Vâng, vì em chưa thực hành nhiều nên chưa hình dung ra (vì em nghĩ rằng nếu làm việc với cả cột A thì nó phải Next từ ô này đến ô kia...), em xin cảm ơn thày nhiều.
Hihi, mình hiểu ý bạn rồi, đại khái nó sẽ như thế này,thằng For Next chỉ tham gia việc chọn giá trị từng Cell và chọn Cell chứa kết quả, việc tính toán xếp loại là của thằng If
Mã:
Public Sub XepLoai()
    Dim VungDiem As Range, I As Integer
    Set VungDiem = Range([a2], [a1000].End(xlUp))
        For I = 1 To VungDiem.Rows.Count
            If VungDiem(I) < 0 Or VungDiem(I) > 10 Then VungDiem(I).Offset(, 1) = "Nh" & ChrW(7853) & "p " & ChrW(273) & "i" & ChrW(7875) & "m t" & ChrW(7847) & "m b" & ChrW(7853) & "y"
            If VungDiem(I) >= 8 Then
                VungDiem(I).Offset(, 1) = "HSG"
            ElseIf VungDiem(I) >= 7 Then
                VungDiem(I).Offset(, 1) = "HSTT"
            ElseIf VungDiem(I) >= 5 Then
                VungDiem(I).Offset(, 1) = "HSTB"
            Else
                VungDiem(I).Offset(, 1) = "HSY"
            End If
        Next I
End Sub
Thân
 
Upvote 0
không dấu gì các bác, em đang tìm cách nghiên cứu cái For...Next của sư phụ Ptm0412, các bác giải bằng Funtion ngon thế này chắc nó hết đường xuất hiện. Em nghĩ nếu giải theo thủ tục Sub có lẽ nó sẽ có For...Next, do em chưa thạo lắm về vụ này xin được tiếp tục nhờ giúp cho

Mình cũng đang nghiên cứu về For ...next. Không biết làm thế này có đúng ý bạn:
PHP:
Function XL(Diem As Double) As String
    Dim i As Long, iR As Long
    iR = Range("A1000").End(3).Row
    For i = 2 To iR
        If Diem < 0 Or Diem > 10 Then
            XL = "Khong hop le"
        ElseIf Diem < 5 Then
            XL = "Yeu"
        ElseIf Diem < 7 Then
            XL = "HSTB"
        ElseIf Diem < 8 Then
            XL = "HSTT"
        Else
            XL = "HSG"
        End If
    Next
End Function
 
Upvote 0
Hihi, mình hiểu ý bạn rồi, đại khái nó sẽ như thế này,thằng For Next chỉ tham gia việc chọn giá trị từng Cell và chọn Cell chứa kết quả, việc tính toán xếp loại là của thằng If
Mã:
Public Sub XepLoai()
    Dim VungDiem As Range, I As Integer
    Set VungDiem = Range([a2], [a1000].End(xlUp))
        For I = 1 To VungDiem.Rows.Count
            If VungDiem(I) < 0 Or VungDiem(I) > 10 Then VungDiem(I).Offset(, 1) = "Nh" & ChrW(7853) & "p " & ChrW(273) & "i" & ChrW(7875) & "m t" & ChrW(7847) & "m b" & ChrW(7853) & "y"
            If VungDiem(I) >= 8 Then
                VungDiem(I).Offset(, 1) = "HSG"
            ElseIf VungDiem(I) >= 7 Then
                VungDiem(I).Offset(, 1) = "HSTT"
            ElseIf VungDiem(I) >= 5 Then
                VungDiem(I).Offset(, 1) = "HSTB"
            Else
                VungDiem(I).Offset(, 1) = "HSY"
            End If
        Next I
End Sub
Thân
Dạ đúng ý em rồi thày ah, vì em trình độ vẫn còn ABC nên rất cần có những bài đơn giản thế này để bản thân có thể tự làm được để từ đó có thể nghĩ cách phát triển nên bài cao hơn 1 chút.
Em sẽ cố gắng ngâm cứu nghĩ ra những bài khác tương tự "để làm vốn", đồng thời giúp em có cảm hứng đi tiếp, chứ tiếp cận bài khó (đối với em thôi) dễ làm mình nản lắm thày ah, em cảm ơn thày rất nhiều.
 
Upvote 0
Muốn có For. . . Next thì có đây & xin mời (Nhưng chỉ có tính học thuật thôi nha!)

Mã:
Option Explicit
[B]Function MuonForNextCoForNext(Diem As Double) As String[/B]
 Const StrC As String = "00050708101199"
 Const KHL As String = "Khong Hop Le!"
 Dim jj As Byte
 
 For jj = 1 To Len(StrC) Step 2
    If Diem < CDbl(Mid(StrC, jj, 2)) Then Exit For
 Next jj
' [COLOR=#0000cd]MsgBox (jj + 1) / 2[/COLOR]'
 MuonForNextCoForNext = Choose((jj + 1) \ 2, KHL, "Yeu", "TB", "TT", "G", KHL,"NGU")
 
[B]End Function[/B]

Bạn thử chuyển hàm này sang macro xem sao?--=0 --=0 --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Cái mà các bạn đang làm theo mình là không hợp lý, các bạn đã gò ép giữa Sub và Function. Đối với Hàm thường là nhận tham số tính toán và trả về kết quả và ta có thể gọi nó bất cứ đâu trong phạm vi lưu hàm. Còn việc thay ta thực hiện các thao tác tính toán, edit bảng tính nên để Macro (Sub) làm thì hợp lý hơn. Như các bạn sẽ không gọi hàm được kết quả ở 1 chỗ nào khác. Nếu là hàm xếp loại như các bạn mình viết thế này, chẳng cần for next:

Mã:
Function loai(D As Integer)
loai = Switch(D < 0, "Khong HL", D < 5, "Yeu", D < 7, _
"Tbinh", D < 8, "Kha", D <= 10, "Gioi", D > 10, "Khong HL")
End Function

Vậy nên, mặc dù là ví dụ cũng nên có sự đúng đắn thoả đáng nhất.
 
Upvote 0
Cái mà các bạn đang làm theo mình là không hợp lý, các bạn đã gò ép giữa Sub và Function. Đối với Hàm thường là nhận tham số tính toán và trả về kết quả và ta có thể gọi nó bất cứ đâu trong phạm vi lưu hàm. Còn việc thay ta thực hiện các thao tác tính toán, edit bảng tính nên để Macro (Sub) làm thì hợp lý hơn. Như các bạn sẽ không gọi hàm được kết quả ở 1 chỗ nào khác. Nếu là hàm xếp loại như các bạn mình viết thế này, chẳng cần for next:

Mã:
Function loai(D As Integer)
loai = Switch(D < 0, "Khong HL", D < 5, "Yeu", D < 7, _
"Tbinh", D < 8, "Kha", D <= 10, "Gioi", D > 10, "Khong HL")
End Function

Vậy nên, mặc dù là ví dụ cũng nên có sự đúng đắn thoả đáng nhất.
Cảm ơn bác, vấn đề của em không quan trọng cách giải phải ngắn nhất, cũng không nhất thiết cách giải phải cơ động. Em chỉ cần nhìn "thực tế" về cách xuất hiện Next..For để em dễ hình dung nhất thôi. Sau này khi đã vận dụng nhuần nhuyễn rồi thì lúc ấy mình mới có cái nhìn thực thế hơn ah (TH nào thì nên vận dụng cái nào).
 
Upvote 0
Cảm ơn bác, vấn đề của em không quan trọng cách giải phải ngắn nhất, cũng không nhất thiết cách giải phải cơ động. Em chỉ cần nhìn "thực tế" về cách xuất hiện Next..For để em dễ hình dung nhất thôi. Sau này khi đã vận dụng nhuần nhuyễn rồi thì lúc ấy mình mới có cái nhìn thực thế hơn ah (TH nào thì nên vận dụng cái nào).


Mình thấy, bạn hỏi mà chả đọc nội dung trả lời ra sao nữa? Dám chắc bạn chả hiểu gì ý mình cả

Mình muốn nói là đừng tuỳ tiện chuyển code của Sub sang Hàm. Có thứ dùng lẫn, có thứ là của riêng. Trong các hàm của các bạn gọi nó và lấy kết quả ra sao đây?
 
Upvote 0
Em sẽ cố gắng ngâm cứu nghĩ ra những bài khác tương tự "để làm vốn", đồng thời giúp em có cảm hứng đi tiếp, chứ tiếp cận bài khó (đối với em thôi) dễ làm mình nản lắm
Tôi nghĩ bạn đang cố gắng tiếp cận với kiến thức về vòng lập. Vậy cần phải làm từ dễ đến khó
Dễ nhất có lẽ là code này:
PHP:
Sub Test()
  Dim i As Long
  For i = 1 To 50
    Range("A" & i).Value = i
    If i Mod 2 Then Range("A" & i).Interior.ColorIndex = 6
  Next
End Sub
Đánh số thứ tự từ 1 đến 50 vào cột A. Với số thứ tự lẻ, sẽ tô cell màu vàng
(Còn bài bạn đưa ở topic này cũng không mấy thích hợp để dùng For.. Next)
 
Upvote 0
Tương tự vậy theo thầy NDU cũng là For.... Net: Tôi cũng đang bò bò theo các thành viên của mình đây.
 
Upvote 0
Tương tự vậy theo thầy NDU cũng là For.... Net: Tôi cũng đang bò bò theo các thành viên của mình đây.
Code của bạn:
PHP:
Sub test()
  Dim tong As Integer
  Dim NAM As Integer
  For NAM = 1 To 100
    Range("C" & NAM).Value = NAM
    tong = tong + NAM
  Next NAM
End Sub
trong code có biến tong chẳng biết để làm gì (vì bạn chỉ cộng dồn để... chơi mà chẳng gán vào đâu cả)
 
Upvote 0
Code của bạn:
PHP:
Sub test()
  Dim tong As Integer
  Dim NAM As Integer
  For NAM = 1 To 100
    Range("C" & NAM).Value = NAM
    tong = tong + NAM
  Next NAM
End Sub
trong code có biến tong chẳng biết để làm gì (vì bạn chỉ cộng dồn để... chơi mà chẳng gán vào đâu cả)
Vậy thì bỏ làm chá hình chơi mà ông thầy. Heehe
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom