Xin hỏi về tính tổng của các mã kí hiệu

  • Thread starter Thread starter Tran Mui
  • Ngày gửi Ngày gửi
Liên hệ QC

Tran Mui

Thành viên thường trực
Tham gia
29/12/07
Bài viết
237
Được thích
56
Trong mẫu kèm theo tại cột F, từF6 đến F17 ghi các loại ưu tiên, sau mỗi ưu tiên có dấu phảy, rồi đến dấu cách, rồi đến ưu tiên tiếp theo. Ghi các ưu tiên theo thứ tự ở bảng dưới ( tiêu chuẩn ); nếu ưu tiên trước không có thì ghi ưu tiên tiếp theo. chỉ ghi trên một cột( như cột F này chẳng hạn)
Còn cột G là tổng điểm được nhận từ cột F ( theo tiêu chuẩn điểm ở bảng dưới ), tổng điểm được cộng không vượt quá 6 điểm.
Cám ơn bạn trước nhé
( có file mẫu kèm theo )
 

File đính kèm

Lần chỉnh sửa cuối:
Trong mẫu kèm theo tại cột F, từF6 đến F17 ghi các loại ưu tiên, sau mỗi ưu tiên có dấu phảy, rồi đến dấu cách, rồi đến ưu tiên tiếp theo. Ghi các ưu tiên theo thứ tự ở bảng dưới ( tiêu chuẩn ); nếu ưu tiên trước không có thì ghi ưu tiên tiếp theo. chỉ ghi trên một cột( như cột F này chẳng hạn)
Còn cột G là tổng điểm được nhận từ cột F ( theo tiêu chuẩn điểm ở bảng dưới ), tổng điểm được cộng không vượt quá 6 điểm.
Cám ơn bạn trước nhé
( có file mẫu kèm theo )
Ẹc... Ẹc... Bài này có độ khó khoảng 7/10 (lâu lâu mới gặp)
Bạn xem file nhé ---> Trong file tập trung ở 3 hàm SUMPRODUCT, FIND và hàm N
 

File đính kèm

Mình xin cảm ơn bạn đã chỉ giúp. Rất, Rất thỏa mãn rồi; nhưng mình còn hiểu chưa sâu, muốn hỏi trong công thức bạn chỉ giúp các chỗ : N là gì ?
VT là gì ?, cách tạo ?
"1: " giải nghĩa giúp để mình hiểu thêm
còn các chỗ ... row(INDIRECT(......... giải nghia thêm cho mình với
Cám ơn nhiều, nhiều
 
Hàm tự tạo uh? Em nghĩ được chứ ---> Chủ yếu vẫn là làm sao cho khi tìm kiếm nó không lầm chử N với NB ---> Phần còn lại chắc là chuyện nhỏ ---> Sư phụ làm đi (nghề của sư phụ mà... Ẹc... Ẹc...)
 
Xin cảm ơn nhiều ; trong phần trước
xls.gif
Mau_01.xls còn một chỗ chưa ổn , đó là tổng cột G không vượt quá 6.0
Xin Bạn điều chỉnh giúp
 
Lần chỉnh sửa cuối:
Chủ yếu vẫn là làm sao cho khi tìm kiếm nó không lầm chử N với NB ---> Phần còn lại chắc là chuyện nhỏ

Chỗ này e cũng "hạt bí" quá, mượn sáng kiến của bác em làm gọn hơn tý, tiện thể làm theo đúng ý tác giả.

trong phần trước
xls.gif
Mau_01.xls còn một chỗ chưa ổn , đó là tổng cột G không vượt quá 6.0
Xin Bạn điều chỉnh giúp
 

File đính kèm

Cú pháp:=TinhDiem(F6)

Hàm tự tạo uh? Em nghĩ được chứ ---> Chủ yếu vẫn là làm sao cho khi tìm kiếm nó không lầm chử N với NB ---> Phần còn lại chắc là chuyện nhỏ ---> Sư phụ làm đi (nghề của sư phụ mà... Ẹc... Ẹc...)


PHP:
Option Explicit
Function TinhDiem(UuTien As String) As Double
 On Error GoTo Loi_TD
 Dim StrC As String, sUT As String
 Const Nb As String = ", ":                 Dim VTr As Variant
 
 StrC = Trim(UuTien) & ", GPE_COM"
 Do
    VTr = InStr(StrC, Nb):
    sUT = Left(StrC, VTr - 1)
    Select Case Trim(sUT)
    Case "NB"
2        TinhDiem = TinhDiem + 0.5
    Case "NK", "VH3", "VT3", "D"
        TinhDiem = TinhDiem + 1
    Case "NG", "VH2", "VT2"
        TinhDiem = TinhDiem + 1.5
    Case "A", "VH1", "VT1", "B"
        TinhDiem = TinhDiem + 2
    Case "L", "N"
        TinhDiem = TinhDiem + 3
    End Select
    StrC = Mid(StrC, VTr + 2)
    If VTr < 1 Then Exit Do
 Loop
 If TinhDiem > 6 Then TinhDiem = 6
Err_TD:     Exit Function
Loi_TD:
    If Err > 5 Then MsgBox Erl, , "GPE"
    Resume Err_TD
End Function


Kíếp! Mình mò mãi mới tìm ra lỗi; Mà không phải do mình viết hàm, mà lỗi do bạn í nhập không chuẩn tại ô 'F6'. Giữa dấu phết & ký tự 'L' có hai khoảng trông! Loai hoay 2 ngày trời mới tìm ra! kha, kha, . . .:-= --=0

Một kinh nghiệm thực tiển! Phải dùng hàm Trim() sau khi cắt chuỗi.
 
Xin chân thành cảm ơn các đồng nghiệp
Mình tiếp tục công việc nếu có khó khăn gì lại làm phiền các bạn nhé
 
Chỗ này e cũng "hạt bí" quá, mượn sáng kiến của bác em làm gọn hơn tý, tiện thể làm theo đúng ý tác giả.
DOSNET dùng công thức:
=IF(KQ>6,6,KQ)
Chắc là quên hàm MIN thì phải:
=MIN(KQ,6)
Xin cảm ơn nhiều ; trong phần trước
xls.gif
Mau_01.xls còn một chỗ chưa ổn , đó là tổng cột G không vượt quá 6.0
Xin Bạn điều chỉnh giúp
Với file củ, bạn thêm hàm MIN vào là được
-------------------------
Với sư phụ SA_DQ:
Em đang nghĩ UDF của em phải có cú pháp giống hàm SUMIF ấy:
SumDK(VungDK,DK,VungTong)
(chỉ khác SUMIF ở chổ nhiều điều kiện nằm chung 1 chuổi)
Vậy có thể dùng Split phân điều kiện tính tổng ra thành 1 mãng không? Sau đó quét qua các phần tử của mãng vừa tạo, dùng phương thức Find để tìm từng phần tử này trong vùng điều kiện... ???
PHP:
Function SumDK(VungDK As Range, DK As Range, VungTong As Range, Optional PK = ",") As Double
  Dim Item As Variant
  On Error Resume Next
  For Each Item In Split(DK, PK)
    With VungDK.Find(What:=Trim(Item), LookAt:=xlWhole)
      SumDK = SumDK + VungTong(WorksheetFunction.Match(.Cells, VungDK, 0))
    End With
  Next
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
-Trong trường hợp dữ liệu có nhiều trường hợp, vài trăm chẳng hạn, cách dùng Case của bác SA chắc là mệt đây.
 
-Trong trường hợp dữ liệu có nhiều trường hợp, vài trăm chẳng hạn, cách dùng Case của bác SA chắc là mệt đây.
Đúng thế, vì vậy mà tôi tách điều kiện ra rồi dùng phương thức Find để tìm
Nói thêm với tác giả: Bạn yêu cầu:
Tiêu chuẩn cho điểm, nếu >6.0 thì chỉ lấy 6.0
Nhưng tôi không đưa vào code, vì như thế sẽ không tổng quát cho các trường hợp khác ---> UDF phải còn được ứng dụng vào nhiều việc khác chứ không phải riêng trường hợp của bạn ---> Chính vì lẽ đó, nếu bạn muốn có thêm điều kiện nếu >6.0 thì chỉ lấy 6.0 thì tự thêm hàm MIN vào nhé
Ví dụ:
=Min(SumDK($F$24:$F$37,$F6,$G$24:$G$37),6)
 
:-=
-Trong trường hợp dữ liệu có nhiều trường hợp, vài trăm chẳng hạn, cách dùng Case của bác SA chắc là mệt đây.

Trong mọi trường hợp, chúng ta đều phải tìm cách tối ưu mà thôi; Đất bùn hay cát thì không thể xài cuối chim làm chi; nhưng đất trung du mà xài leng thì chỉ bốc cám mà xơi!

Mình nghĩ có các cách sau,

(1) Cho hết chúng nối đuôi nhau trong 1 Const Sau đó dùng InStr() để tìm;
VD: Const MaTim As String = "NKWVH1LWWNGWVT2NBWAWDWW . . . "


(2) Dùng hàm Switch() trong VBA, hay hàm Choose() . . . .

(3) . . . --=0 :-=
 
Mính làm xong rồi cảm ơn GPE nhiều, nhiều, ...
 
Nhân tiện đây xin nhờ mọi người cách tính tổng của bài này giúp.
 

File đính kèm

Lần chỉnh sửa cuối:
DOSNET dùng công thức:
=IF(KQ>6,6,KQ)
Chắc là quên hàm MIN thì phải:
=MIN(KQ,6)

Với file củ, bạn thêm hàm MIN vào là được
-------------------------
Với sư phụ SA_DQ:
Em đang nghĩ UDF của em phải có cú pháp giống hàm SUMIF ấy:
SumDK(VungDK,DK,VungTong)
(chỉ khác SUMIF ở chổ nhiều điều kiện nằm chung 1 chuổi)
Vậy có thể dùng Split phân điều kiện tính tổng ra thành 1 mãng không? Sau đó quét qua các phần tử của mãng vừa tạo, dùng phương thức Find để tìm từng phần tử này trong vùng điều kiện... ???
PHP:
Function SumDK(VungDK As Range, DK As Range, VungTong As Range, Optional PK = ",") As Double
  Dim Item As Variant
  On Error Resume Next
  For Each Item In Split(DK, PK)
    With VungDK.Find(What:=Trim(Item), LookAt:=xlWhole)
      SumDK = SumDK + VungTong(WorksheetFunction.Match(.Cells, VungDK, 0))
    End With
  Next
End Function

Rất sáng tạo!
Tuy nhiên do mỗi mã chỉ xuất hiện 1 lần trong vùng điều kiện, vì vậy đã dùng Match rồi thì không cần Find nữa.

Có thể sửa lại :
PHP:
Function SumDK(VungDK As Range, DK As Range, VungTong As Range, Optional PK As String = ",") As Double
  On Error Resume Next
  Dim Item As Variant
  For Each Item In Split(DK, PK)
      SumDK = SumDK + VungTong(WorksheetFunction.Match(Trim$(Item), VungDK, 0))
  Next
End Function

--CV--
 
Web KT

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

Back
Top Bottom