Nhờ viết code hàm mới của oficce2016 để sài phiên bản thấp hơn

Liên hệ QC

vova2209

Thành viên tích cực
Tham gia
5/4/17
Bài viết
835
Được thích
112
Giới tính
Nam
Nghề nghiệp
Đường bộ
Em thấy phiên bản 2016 có mấy hàm rất hay, nhờ các bạn viết code cho hàm
1.IFS
2. SWITCH

3. HÀM MINIFS VÀ MAXIFS
4.

CONCAT
 
Cái này người ta nói "Chở củi về rừng"
^^! thực ra là không phải ai cũng cài office 2016, có những người còn đang dùng office2003, nếu mình đi chỗ khác mở file của mình lên thì hàm không thể chạy được nên mình muốn tích hợp thêm code vào.
 
Upvote 0
Em thấy phiên bản 2016 có mấy hàm rất hay, nhờ các bạn viết code cho hàm
1.IFS
2. SWITCH

3. HÀM MINIFS VÀ MAXIFS
4.
CONCAT
- những hàm ifs có thể sử dụng sumproduct để áp dụng đc ở cả các phiên bản.
- concat có phải ý bạn là CONCATENATE nếu thế có thể sử dụng hàm &
 
Upvote 0
Cái hàm SWITCH() nó vận hành thế nào trong excel vậy bạn;

Còn trong VBA là vầy:
Dim GPE As Double, Num As Integer

Num= [B13].Value
GPE= SWITCH(Num =1, 1, Num=2, 5.3, Num = 3, 7 , . . . )
 
Upvote 0
Tôi chỉ thích bàn cách viết và sửa code chứ không thích viết code.

Nếu bạn chịu khó tự viết mấy hàm này thì tôi sẽ chỉ cách sửa.
Nếu bạn khong biết bắt đầu từ đâu thì cứ nói thẳng, tôi sẽ gợi ý.
 
Upvote 0
Em thấy phiên bản 2016 có mấy hàm rất hay, nhờ các bạn viết code cho hàm
1.IFS
2. SWITCH

3. HÀM MINIFS VÀ MAXIFS
4.
CONCAT
Tôi đang dùng Excel 2016, đã kiểm tra aà chẳng thấy có hàm nào giống với danh sách trên
Tuy nhiên, nếu muốn viết cũng không sao. Đầu tiên ta bắt đầu với CONCAT đi nha. Vậy bạn vui lòng cho biết:
- CONCAT của bạn có chức năng gì?
- CONCAT của bạn cho kết quả thế nào?
vân... vân... rồi ta tiếp
 
Upvote 0
Tôi đang dùng Excel 2016, đã kiểm tra aà chẳng thấy có hàm nào giống với danh sách trên
Tuy nhiên, nếu muốn viết cũng không sao. Đầu tiên ta bắt đầu với CONCAT đi nha. Vậy bạn vui lòng cho biết:
- CONCAT của bạn có chức năng gì?
- CONCAT của bạn cho kết quả thế nào?
vân... vân... rồi ta tiếp
Dạ em hay dùng hàm if, thầy viết dùm cho em hàm này thôi ạ:
Hàm if bình thường thường phải lồng rất nhiều if, rất dễ bị nhầm VD: =IF(B2>50, 40, IF(B2>40, 35, IF(B2>30, 30, IF(B2>20, 20, IF(B2>10, 15, IF(B2>5, 5, 0)))))
Hàm ifs: =IFS(B2>50, 40, B2>40, 35, B2>30, 30, B2>20, 20, B2>10, 15, B2>5, 5, TRUE, 0)

Cú pháp hàm IFS

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2]…)

Hàm có 2 phần bắt buộc và 2 phần không bắt buộc.

  • logical_test1 là phần bắt buộc. Đây là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true1 là phần bắt buộc thứ 2, là kết quả nếu điều kiện ở logical_test 1 là TRUE. Nếu cần thiết có thể để trống.
  • logical_test 2…logical_test127 là không bắt buộc, là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true2…value_if_true127 là phần không bắt buộc, là kết quả nếu điều kiện ở logical_testN là TRUE. Mỗi value_if_trueN tương ứng với điều kiện ở logical_testN, có thể bỏ trống.
Hàm IFS cho phép bạn đánh giá tới 127 điều kiện khác nhau. Nếu 1 điều kiện logical_test không có kết quả value_if_true, hàm sẽ thông báo “You’ve entered too few arguments for this function” (Bạn nhập quá ít mệnh đề cho hàm này). Nếu điều kiện logical_test được đánh giá và có kết quả khác ngoài TRUE hoặc FALSE, hàm IFS sẽ trả lỗi #VALUE!. Nếu không có điều kiện nào có kết quả TRUE, hiển thị lỗi #N/A.
 
Upvote 0
Dạ em hay dùng hàm if, thầy viết dùm cho em hàm này thôi ạ:
Hàm if bình thường thường phải lồng rất nhiều if, rất dễ bị nhầm VD: =IF(B2>50, 40, IF(B2>40, 35, IF(B2>30, 30, IF(B2>20, 20, IF(B2>10, 15, IF(B2>5, 5, 0)))))
Hàm ifs: =IFS(B2>50, 40, B2>40, 35, B2>30, 30, B2>20, 20, B2>10, 15, B2>5, 5, TRUE, 0)

Cú pháp hàm IFS

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2]…)

Hàm có 2 phần bắt buộc và 2 phần không bắt buộc.

  • logical_test1 là phần bắt buộc. Đây là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true1 là phần bắt buộc thứ 2, là kết quả nếu điều kiện ở logical_test 1 là TRUE. Nếu cần thiết có thể để trống.
  • logical_test 2…logical_test127 là không bắt buộc, là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true2…value_if_true127 là phần không bắt buộc, là kết quả nếu điều kiện ở logical_testN là TRUE. Mỗi value_if_trueN tương ứng với điều kiện ở logical_testN, có thể bỏ trống.
Hàm IFS cho phép bạn đánh giá tới 127 điều kiện khác nhau. Nếu 1 điều kiện logical_test không có kết quả value_if_true, hàm sẽ thông báo “You’ve entered too few arguments for this function” (Bạn nhập quá ít mệnh đề cho hàm này). Nếu điều kiện logical_test được đánh giá và có kết quả khác ngoài TRUE hoặc FALSE, hàm IFS sẽ trả lỗi #VALUE!. Nếu không có điều kiện nào có kết quả TRUE, hiển thị lỗi #N/A.
anh Bill mà nhìn thấy các các điều kiện và kết quả lỗi kiểu nầy chắc khóc ra tiếng Tào
 
Upvote 0
Dạ em hay dùng hàm if, thầy viết dùm cho em hàm này thôi ạ:
Hàm if bình thường thường phải lồng rất nhiều if, rất dễ bị nhầm VD: =IF(B2>50, 40, IF(B2>40, 35, IF(B2>30, 30, IF(B2>20, 20, IF(B2>10, 15, IF(B2>5, 5, 0)))))
Hàm ifs: =IFS(B2>50, 40, B2>40, 35, B2>30, 30, B2>20, 20, B2>10, 15, B2>5, 5, TRUE, 0)

Cú pháp hàm IFS

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2]…)

Hàm có 2 phần bắt buộc và 2 phần không bắt buộc.

  • logical_test1 là phần bắt buộc. Đây là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true1 là phần bắt buộc thứ 2, là kết quả nếu điều kiện ở logical_test 1 là TRUE. Nếu cần thiết có thể để trống.
  • logical_test 2…logical_test127 là không bắt buộc, là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true2…value_if_true127 là phần không bắt buộc, là kết quả nếu điều kiện ở logical_testN là TRUE. Mỗi value_if_trueN tương ứng với điều kiện ở logical_testN, có thể bỏ trống.
Hàm IFS cho phép bạn đánh giá tới 127 điều kiện khác nhau. Nếu 1 điều kiện logical_test không có kết quả value_if_true, hàm sẽ thông báo “You’ve entered too few arguments for this function” (Bạn nhập quá ít mệnh đề cho hàm này). Nếu điều kiện logical_test được đánh giá và có kết quả khác ngoài TRUE hoặc FALSE, hàm IFS sẽ trả lỗi #VALUE!. Nếu không có điều kiện nào có kết quả TRUE, hiển thị lỗi #N/A.
Theo như bạn mô tả ở chỗ màu đỏ thì tôi nghĩ không cần phải viết thêm gì cả. Cứ lập 1 bảng tra rồi dùng VLOOKUP là xong
 
Upvote 0
PHP:
Function gpeSWITCH(Str As String) As Variant

 If InStr("CN;T2;T3;T4;T5;T6;T7;", Str) Then
    gpeSWITCH = Switch(Str = "T2", 1, Str = "T3", 2, Str = "T4", 3, Str = "T5", 4, Str = "T6", 5, Str = "T7", 6, Str = "CN", "0")
 Else
    gpeSWITCH = "Cút Xéo"
 End If
End Function

Mong là bạn xài được, mình mừng!
 
Upvote 0
Dạ em hay dùng hàm if, thầy viết dùm cho em hàm này thôi ạ:
Hàm if bình thường thường phải lồng rất nhiều if, rất dễ bị nhầm VD: =IF(B2>50, 40, IF(B2>40, 35, IF(B2>30, 30, IF(B2>20, 20, IF(B2>10, 15, IF(B2>5, 5, 0)))))
Hàm ifs: =IFS(B2>50, 40, B2>40, 35, B2>30, 30, B2>20, 20, B2>10, 15, B2>5, 5, TRUE, 0)

Cú pháp hàm IFS

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2]…)

Hàm có 2 phần bắt buộc và 2 phần không bắt buộc.

  • logical_test1 là phần bắt buộc. Đây là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true1 là phần bắt buộc thứ 2, là kết quả nếu điều kiện ở logical_test 1 là TRUE. Nếu cần thiết có thể để trống.
  • logical_test 2…logical_test127 là không bắt buộc, là điều kiện để đánh giá TRUE hoặc FALSE.
  • value_if_true2…value_if_true127 là phần không bắt buộc, là kết quả nếu điều kiện ở logical_testN là TRUE. Mỗi value_if_trueN tương ứng với điều kiện ở logical_testN, có thể bỏ trống.
Hàm IFS cho phép bạn đánh giá tới 127 điều kiện khác nhau. Nếu 1 điều kiện logical_test không có kết quả value_if_true, hàm sẽ thông báo “You’ve entered too few arguments for this function” (Bạn nhập quá ít mệnh đề cho hàm này). Nếu điều kiện logical_test được đánh giá và có kết quả khác ngoài TRUE hoặc FALSE, hàm IFS sẽ trả lỗi #VALUE!. Nếu không có điều kiện nào có kết quả TRUE, hiển thị lỗi #N/A.
Bắt chước thử xem sao
PHP:
Function IFS(ByVal logical_test1 As Boolean, ByVal value_if_true1 As Variant, ParamArray More_logical() As Variant) As Variant
Dim TmpVal As Variant, Check As Boolean, IsLogical As Boolean, bTrue As Boolean
If logical_test1 Then
    IFS = value_if_true1
Else
    For Each TmpVal In More_logical
        IsLogical = Not IsLogical
        If Not bTrue Then
            If IsLogical Then
                If TmpVal Then Check = True
            ElseIf Check Then
                bTrue = True
                IFS = TmpVal
            End If
        End If
    Next
    If IsLogical Then
        MsgBox "You've entered too few arguments for this function", vbOKOnly, "Microsoft Office Excel"
    ElseIf Not Check Then
        IFS = CVErr(xlErrNA)
    End If
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
bắt chước bạn HuuThang_BD
cú pháp:=IFS(dk1,Val if dk1 true,[dk2,Val if dk2 true],...,[Val if tất cả dk false])
kết quả trả lổi giống hàm IF của Excel
Mã:
Function IFS(ByVal Logical_1 As Boolean, ByVal Value_If_True_1 As Variant, ParamArray More_logical() As Variant) As Variant
Dim Tmp As Variant, IsLogical As Boolean, i As Byte
If Logical_1 Then
  IFS = Value_If_True_1
Else
  For i = LBound(More_logical) To UBound(More_logical)
    IsLogical = Not IsLogical
    If IsLogical Then
      If i = UBound(More_logical) Then IFS = More_logical(i): Exit Function
      If More_logical(i) Then IFS = More_logical(i + 1): Exit Function
    End If
  Next i
  IFS = False
End If
End Function
 
Upvote 0
bắt chước bạn HuuThang_BD
cú pháp:=IFS(dk1,Val if dk1 true,[dk2,Val if dk2 true],...,[Val if tất cả dk false])
kết quả trả lổi giống hàm IF của Excel
Mã:
Function IFS(ByVal Logical_1 As Boolean, ByVal Value_If_True_1 As Variant, ParamArray More_logical() As Variant) As Variant
Dim Tmp As Variant, IsLogical As Boolean, i As Byte
If Logical_1 Then
  IFS = Value_If_True_1
Else
  For i = LBound(More_logical) To UBound(More_logical)
    IsLogical = Not IsLogical
    If IsLogical Then
      If i = UBound(More_logical) Then IFS = More_logical(i): Exit Function
      If More_logical(i) Then IFS = More_logical(i + 1): Exit Function
    End If
  Next i
  IFS = False
End If
End Function

Đề nghị đại khái:

1. dùng luôn paramarray conds(), khỏi phải phân biêt điều kiện đầu tiên

2. trước khi bắt đầu tính, test số phần tử pt = ubound(conds) - lbound(conds)
if (pt < 2) or (pt and 1) then ' số phần tử là số lẻ
error
exit function

3. Cách test logical của bạn quá dễ dãi, néu ngừoi nhập đặt sai vị trí thì nó cũng có khả năng chấp nhận
For i = LBound(More_logical) To UBound(More_logical) step 2
Tránh bớt một số lỗi nếu ngừoi nhập không đúng

Chú: thực ra, theo tiếng Anh thì more ngầm chứa số nhiều: more_logicals mới đúng văn phạm

Chú 2: Val if tất cả các điều kiện false:
khi dùng hàm này, người dùng sẽ tự đặt phần này
IFS( test1, res1, test2, cond2, ...., True, resChoConLai)
 
Upvote 0
Đề nghị đại khái:

1. dùng luôn paramarray conds(), khỏi phải phân biêt điều kiện đầu tiên

2. trước khi bắt đầu tính, test số phần tử pt = ubound(conds) - lbound(conds)
if (pt < 2) or (pt and 1) then ' số phần tử là số lẻ
error
exit function

3. Cách test logical của bạn quá dễ dãi, néu ngừoi nhập đặt sai vị trí thì nó cũng có khả năng chấp nhận
For i = LBound(More_logical) To UBound(More_logical) step 2
Tránh bớt một số lỗi nếu ngừoi nhập không đúng

Chú: thực ra, theo tiếng Anh thì more ngầm chứa số nhiều: more_logicals mới đúng văn phạm

Chú 2: Val if tất cả các điều kiện false:
khi dùng hàm này, người dùng sẽ tự đặt phần này
IFS( test1, res1, test2, cond2, ...., True, resChoConLai)
nhiều cái mình không hiểu chỉ làm liều bắt chước các bạn, cám ơn bạn đã nhiều lần hướng dẫn, mình sẽ nghiên cứu và hoàn thiện lại
chúc bạn một ngày vui
 
Upvote 0
Nói cho cùng t
Tôi đang dùng Excel 2016, đã kiểm tra aà chẳng thấy có hàm nào giống với danh sách trên

Nhóm hàm này chỉ có trong phiên bản Office 365, KHÔNG PHẢI MẶC NHIÊN TRONG 2016 như chủ thớt nói.

Dạ em hay dùng hàm if, thầy viết dùm cho em hàm này thôi ạ:
Hàm if bình thường thường phải lồng rất nhiều if, rất dễ bị nhầm VD: =IF(B2>50, 40, IF(B2>40, 35,
IF(B2>30, 30, IF(B2>20, 20, IF(B2>10, 15, IF(B2>5, 5, 0)))))

Hàm ifs: =IFS(B2>50, 40, B2>40, 35, B2>30, 30, B2>20, 20, B2>10, 15, B2>5, 5, TRUE, 0)

Cú pháp hàm IFS

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2]…)

Như tôi đã giải thích ở trên, nhóm hàm này khong phải là phiên bản 2016 bình thường. Chúng thuộc mớ hàng đặc biệt mà MS đưa ra như một con mồi dụ ngừoi ta xài 365.

Nếu cty bạn xài 365 thì tự nhiên mọi máy đều phải đồng bộ, việc dùng phiên bản cũ nghe không hợp lý lắm.

Viết hàm VBA thay thế thì cũng khong sao. Nhưng bạn cũng nên nói rõ nguyên do.

^^! thực ra là không phải ai cũng cài office 2016, có những người còn đang dùng office2003, nếu mình đi chỗ khác mở file của mình lên thì hàm không thể chạy được nên mình muốn tích hợp thêm code vào.

Bạn đi chỗ khác mà mở file có VBA lên, chủ máy khong sợ vi rút à?
 
Upvote 0
Đề nghị đại khái:

1. dùng luôn paramarray conds(), khỏi phải phân biêt điều kiện đầu tiên

2. trước khi bắt đầu tính, test số phần tử pt = ubound(conds) - lbound(conds)
if (pt < 2) or (pt and 1) then ' số phần tử là số lẻ
error
exit function

3. Cách test logical của bạn quá dễ dãi, néu ngừoi nhập đặt sai vị trí thì nó cũng có khả năng chấp nhận
For i = LBound(More_logical) To UBound(More_logical) step 2
Tránh bớt một số lỗi nếu ngừoi nhập không đúng

Chú: thực ra, theo tiếng Anh thì more ngầm chứa số nhiều: more_logicals mới đúng văn phạm

Chú 2: Val if tất cả các điều kiện false:
khi dùng hàm này, người dùng sẽ tự đặt phần này
IFS( test1, res1, test2, cond2, ...., True, resChoConLai)
đã chỉnh lại code
Đề nghị đại khái:

1. dùng luôn paramarray conds(), khỏi phải phân biêt điều kiện đầu tiên

2. trước khi bắt đầu tính, test số phần tử pt = ubound(conds) - lbound(conds)
if (pt < 2) or (pt and 1) then ' số phần tử là số lẻ
error
exit function

3. Cách test logical của bạn quá dễ dãi, néu ngừoi nhập đặt sai vị trí thì nó cũng có khả năng chấp nhận
For i = LBound(More_logical) To UBound(More_logical) step 2
Tránh bớt một số lỗi nếu ngừoi nhập không đúng

Chú: thực ra, theo tiếng Anh thì more ngầm chứa số nhiều: more_logicals mới đúng văn phạm

Chú 2: Val if tất cả các điều kiện false:
khi dùng hàm này, người dùng sẽ tự đặt phần này
IFS( test1, res1, test2, cond2, ...., True, resChoConLai)
đã chỉnh lại code
Mã:
Function IFS(ParamArray cond_Vals() As Variant) As Variant
  Dim i As Byte, Msg As String, Title As String
  If UBound(cond_Vals) = LBound(cond_Vals) Then
    MsgBox "Phai nhap it nhat 2 tham so" & Chr(10) & Chr(10) & "=IFS( LogicalTest1, ValueIfTrue1, " & "[LogicalTest2, ValueIfTrue2]" & Chr(10) & "   , . . .  , [ValueIfFalse])", vbOKOnly, "Cong thuc bi loi!"
    IFS = CVErr(xlErrRef)
    Exit Function
  End If
  For i = LBound(cond_Vals) To UBound(cond_Vals) Step 2
    If i = UBound(cond_Vals) Then IFS = cond_Vals(i): Exit Function
    If cond_Vals(i) Then IFS = cond_Vals(i + 1): Exit Function
  Next i
  IFS = False
End Function
 
Upvote 0
đã chỉnh lại code

đã chỉnh lại code
Mã:
Function IFS(ParamArray cond_Vals() As Variant) As Variant
  Dim i As Byte, Msg As String, Title As String
  If UBound(cond_Vals) = LBound(cond_Vals) Then
    MsgBox "Phai nhap it nhat 2 tham so" & Chr(10) & Chr(10) & "=IFS( LogicalTest1, ValueIfTrue1, " & "[LogicalTest2, ValueIfTrue2]" & Chr(10) & "   , . . .  , [ValueIfFalse])", vbOKOnly, "Cong thuc bi loi!"
    IFS = CVErr(xlErrRef)
    Exit Function
  End If
  For i = LBound(cond_Vals) To UBound(cond_Vals) Step 2
    If i = UBound(cond_Vals) Then IFS = cond_Vals(i): Exit Function
    If cond_Vals(i) Then IFS = cond_Vals(i + 1): Exit Function
  Next i
  IFS = False
End Function
Cảm ơn các bác nhiều. Để em test
 
Upvote 0
Nói cho cùng t


Nhóm hàm này chỉ có trong phiên bản Office 365, KHÔNG PHẢI MẶC NHIÊN TRONG 2016 như chủ thớt nói.



Như tôi đã giải thích ở trên, nhóm hàm này khong phải là phiên bản 2016 bình thường. Chúng thuộc mớ hàng đặc biệt mà MS đưa ra như một con mồi dụ ngừoi ta xài 365.

Nếu cty bạn xài 365 thì tự nhiên mọi máy đều phải đồng bộ, việc dùng phiên bản cũ nghe không hợp lý lắm.

Viết hàm VBA thay thế thì cũng khong sao. Nhưng bạn cũng nên nói rõ nguyên do.



Bạn đi chỗ khác mà mở file có VBA lên, chủ máy khong sợ vi rút à?
Thưa thầy! nguyên nhân là khi đi sang máy khác cần phải chỉnh sửa, hoặc gửi cho người khác xem thì hàm vẫn có thể dùng được ạ, vì em thấy hàm mới hữu hiệu hơn nhiều ạ.. em cảm ơn thầy ạ!
 
Upvote 0
Web KT

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

Back
Top Bottom