Cho biết sai biệ́t giữa Macro & UDF sau đây giúp giùm nha:

Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,565
Được thích
22,872
Nghề nghiệp
U80
Tôi tạo một Sub như sau & nó làm việc hoàn hảo:
Mã:
 [b]Sub FormulasCells()[/b]
 Dim NumCells As Range, ForCells As Range, AuCells As Range, Rng As Range
 Dim Temp As Variant
 
    Set AuCells = ActiveSheet.UsedRange
    Set NumCells = AuCells.SpecialCells(xlCellTypeConstants, xlNumbers)
    Set ForCells = AuCells.SpecialCells(xlCellTypeFormulas, xlNumbers)
    For Each Rng In ForCells
        Temp = Temp + Rng.Value
    Next Rng
    Selection.Value = Temp
    Exit Sub:            [b] End Sub [/b]
( Có nghĩa là tại ô kích hoạt sẽ cho giá trị tổng của các ô có công thức;)
Còn hàm sau thì không vậy:
Mã:
[b]
Function SumOfFCells(AuCells As Range) As Variant[/b]
 On Error GoTo LoiChwTrinh
 Dim NumCells As Range, ForCells As Range, Rng As Range
 Dim Temp As Variant
    Set NumCells = AuCells.SpecialCells(xlCellTypeConstants, xlNumbers)
    Set ForCells = AuCells.SpecialCells(xlCellTypeFormulas, xlNumbers)
    For Each Rng In ForCells
        Temp = Temp + Rng.Value
    Next Rng
    SumOfFCells = Temp
Err_ChwTrinh:           Exit Function
LoiChwTrinh:
    Select Case Err
    Case 13
        MsgBox "13"                                 ':                    Resume Next
    Case Else
        SumOfFCells = Error & Str(Err):                        Resume Err_ChwTrinh
    End Select
[b]End Function [/b]
Sai của hàm ở chỗ nó cộng thêm giá trị tại ~ ô không chứa công thức, mà chỉ là giá trị của vùng chọn!
Ví dụ: Tại một Sheet mới tôi nhập vô A1 giá trị 1
Tại A2 lập CT (công thức) =A1 + 2 ; Tại A3 nhập CT =A2 + A1;
Tại A5 nhập = 3 + 4; Tại B4 nhập hàm =SumOfFCells(A1:A9) - Sẽ có kết quả là 15 ;
Chọn ô B6 & nhấn tổ hợp fím chạy macro thì hiện tại đó kết quả 29 ;
Mình cho rằng 15 = 1 + 3 + 4 + 7
Và 29 = 3 + 4 + 7 + 15 ;
Vậy là hàm tự tạo cộng vô thêm giá trị tại A1 (không phải là ô chứa CT)
 
Lần chỉnh sửa cuối:
Pác SA_DQ ơi:
Em thấy trong cả thủ tục và hàm đều có dòng lệnh:
Mã:
Set ForCells = Autocell1.SpecialCells(xlCellTypeFormulas, xlNumbers)
Nhưng thực sự thì dòng lệnh đó làm việc tốt trong thủ tục thôi, còn trong hàm thì không đúng (!???).
Sao pác không chọn thuộc tính HasFormula có hay hơn không?
Bác thử tham khảo xem nhé!
Mã:
Public Function Sum_Formula(rngData As Range)
Dim sum_i, giatri
For Each giatri In rngData
    If giatri.HasFormula Then sum_i = sum_i + giatri
Next giatri
Sum_Formula = sum_i
End Function
'
'
Public Sub Sum_Formula1()
Dim sum_i, giatri
Dim rngData As Range
Set rngData = Selection
For Each giatri In rngData
    If giatri.HasFormula Then sum_i = sum_i + giatri
Next giatri
rngData.Cells(rngData.Rows.Count + 1, rngData.Columns.Count) = sum_i
End Sub
 
Upvote 0
/(/)ột lần nữa xin cảm ơn /(/&Sơn nhiều!
Pác SA_DQ ơi: Em thấy trong cả thủ tục và hàm đều có dòng lệnh:
Set ForCells = Autocell1.SpecialCells(xlCellTypeFormulas, xlNumbers) Nhưng thực sự thì dòng lệnh đó làm việc tốt trong thủ tục thôi, còn trong hàm thì không đúng (!???). Sao pác không chọn thuộc tính HasFormula có hay hơn không?
Xuất phát điểm là mình đang tìm hiểu các nẻo đường của phương thức SpecialCells
Mình cũng đã thử HasFormula của Sơn rồi & OK!
 
Upvote 0
Web KT

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

Back
Top Bottom