cần các thầy và anh chị sửa giúp đoạn code

Liên hệ QC

ap0ll02009

Thành viên mới
Tham gia
10/3/12
Bài viết
24
Được thích
0
file này đầu tiên em tính = các lệnh có sẵn trong excell , sau đó em làm cách viết code , nhưng em thấy kết quả không trùng nhau , em nghĩ code của em thiếu cái gì đó
em xin cảm ơn trước
 

File đính kèm

  • BAI-TAP.xls
    60 KB · Đọc: 14
Bạn xài hàm này với các chú í sau

PHP:
Option Explicit
Function ThanhTien(MaHang As String, NghiepVu As String, HinhThuc As String, SoLuong As Double) As Double
 Dim Le As Byte, CotMB As Byte
 Dim sMB As String, Rng As Range
 
 If UCase$(HinhThuc) = "L" Then Le = 1
 sMB = UCase$(Left(Trim(NghiepVu), 1))
 CotMB = IIf(sMB = "M", 2, 4)
 Set Rng = Range("MaHang").Find(MaHang, , xlFormulas, xlWhole)
 If Not Rng Is Nothing Then
    ThanhTien = SoLuong * Rng.Offset(, Le + CotMB).Value
 End If
End Function

Chú í:

(1) Nên xài 'MaHang' thay vì 'TenHang'

(2) Bạn cần gán tên là 'MaHang' cho vùng địa chỉ B16:B19 trước khi xài hàm

(3) Cú fáp tại ô [L5] như sau:
=ThanhTien(C5,E5,F5,G5)

& chúc thành công
 
cảm ơn anh nhưng mà kỳ thực đoạn code anh viết em ko hiểu , em mới học vba nên còn nhiều cái chưa biết . vậy nên nếu được anh giúp viết 1 code mới theo cách của anh 1 cách đơn giản hơn thì tốt quá
 
Trước tiên xin nói đến cách viết của bạn cái đã, được hông?

PHP:
Function tinhtien(tenhang As String, nghiepvu As String, hinhthuc As String, soluong As Single, b As Range) As Single
1    For i = 1 To 3
    For j = 1 To 5
3        xang = b(1, j)
        dau = b(2, j)
5        nhot = b(3, j)
        
Select Case nghiepvu
7         Case nghiepvu = "mua"
                 If hinhthuc = "l" Then
9                       tinhtien = soluong * b(i, 3)
                 Else
11                    tinhtien = soluong * b(i, 2)
                End If
13         Case Else
               If hinhthuc = "l" Then
15                    tinhtien = soluong * b(i, 5)
                Else
17                    tinhtien = soluong * b(i, 4)
                End If
19 End Select
 Next
21 Next
    
End Function

(1) Tên hàm của bạn là "tinhtien"; theo mình nên là "TinhTien"

Tên các tham biến cũng vậy; Không nên là "tenhang", mà nên là "TenHang", . . . .
Điều này chỉ có lợi cho bạn 1 khi đã trở thành thói quen tốt trên bước đường lập trình VBA,. . .

(2) Bạn dùng tham biến "b As Range"
'b" mình nghĩ chả giúp gì cho bạn hơn 'c', 'D', 'E',. . .. .
/(/hưng nếu là mình thì mình sẽ dùng tham biến này như 1 trong các trường hợp dưới đây:
(-) Vung As Range
(-) Rng As Range
(-) Cls As Range
(-) BangTra As Range
(-) . . . .

Như vậy việc bạn dùng "b As Range" không nâng cao tầm vóc bạn bao nhiêu, nhưng bạn chưa tự lập & cũgn cố cho mình thói quen tốt khi lập trình

D1 & D2 (Dòng lệnh 1 & dòng lệnh 2)

(*) Lúc mình mới tập tành viết các câu lệnh VBA, bao giờ các biến nên/bắt buộc khai báo tường minh
Với mình Dim hay ReDim fải là đầy đủ từ đầu mới có thể viết tiếp các dòng lệnh sau

(*) Tên biến chí ít 2 ký tự (trong đó có 1 ký tự viết hoa) hay 1 ký tự thì nên xài viết hoa ("I" thay vì "i" như của bạn). Điều này chỉ có lợi trong việc kiểm chính tả các câu lệnh hơn mà thôi.

(D6) Trước dòng lệnh D6, nếu bạn dùng câu lệnh MsgBox Xang, , Dau
Thì bạn sẽ fát hiện ra giải thuật của bạn là sai!
Việc này bạn sẽ fải từ tìm giải thuật đúng sau 1 vài lần nghiền ngẫm với MsgBox nêu trên.

D6: Bạn không nên xài câu lệnh này vì dễ sai chính tả (& rõ ràng bạn đã sai chính tả 1 cách thô thiển rồi đó:
Cột dữ liệu 'E5:E10 làm gì có chữ "mua"; chỉ có "Mua" & "Mua" mà thôi!)
Bạn đã thấy điều tệ hại khi bản thân không có thói quen tốt chưa?

Còn điều này mình muốn báo trước cho bạn nè:
May là "Mua", & thậm chí là "Bán" đều có thể xài trong VBA; nhưng nếu gặp chữ "Trao đổi" hay "Trả về" thì sao đây bạn? Bạn bết rằng VBA không hỗ trợ tiếng Việt mà?
Để thoát khỏi tình trạng như vậy bạn fải chọn 1 trong 2 cách sau:

(1) Câu lệnh nên là:
Case UCase$(Left(NghiepVu,1))
(2) Bạn tìm hiểu tự ên sau . . . .

D20 & D21 Bạn nên có thói quen tường minh viết các câu lệnh

Không nên viết như vậy, mà nên là

PHP:
  Next J
 Next I

Điều này có 2 điều lợi; Điều lợi đầu mình đã nói nhiều lần trong bài này
Điều lợi thứ hai tiềm ẩn mà bạn chưa gặp ở đâu đó; Đó là việc có thể tận dụng biến J (hay I) sau khi ta nhìn thầy câu lệnh Next J (hay Next I)

/(ể ra hôm nay bạn sẽ thấy mình viết thật khó coi, nhưng cũng là việc mong bạn khá hơn mà thôi!

Thân nha!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

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

Back
Top Bottom