Đề nghị giúp đỡ Function sau

Liên hệ QC

Bogia_hp7

Thành viên mới
Tham gia
4/1/07
Bài viết
21
Được thích
2
Tôi tạo một Function cộng các giá trị trong Range dưới dạng công thức Text. Có vài vấn đề sau đề nghị mọi người giúp đỡ:
1. Làm thế nào để Function chạy được ở cả trên các file khác?
2. Khi muốn cộng ở trên nhiều range ( 2, 3, ... tùy ý ) thì làm thế nào?
3. Làm thế nào để thêm các đối số ( khi sử dụng hàm có thể có hoặc không) ? Ví dụ khi có đối số bằng 1 thì Function sẽ tính theo khối lượng là tấn, không có đối số thì tính bình thường?
Thank all!
 
Lần chỉnh sửa cuối:
Như thế này sẽ không báo lỗi

PHP:
Public Function Tsum(arr As Range, Optional Rng As Range) As String
 On Error Resume Next
 
Dim Cell As Range, Tong As Double
If Not Rng Is Nothing Then arr = Union(arr, Rng)
    
For Each Cell In arr
    Tong = Tong + Cell
    Tsum = Tsum & "+" & Cell
Next Cell
    Tsum = "(" & Tsum & ")/1000"
    Tsum = Tsum & " = " & CStr(Tong)
End Function

Giải thích thêm:
* Biến cần khai báo tường minh; Xài biến nào khai biến đó là một thói quen tốt cần có!
* Một khi tính tổng hai vùng thì tôi dùng phương thức UNION() để ghép chúng lại;
* Trong đó có cách thức khai báo một biến có thể bỏ qua (trong trường hợp bạn chỉ tính tổng trong 1 vùng;
 
Upvote 0
Trước hết cám ơn SA_DQ đã giúp đỡ.
Code bạn viết rất hay, chuyên nghiệp hơn hẳn. Bạn có thể giải thích luôn câu hỏi 1 được không, làm thế nào để mình có thể dùng hàm này ở file khác ? Tôi khai báo Public mà không được.
Thứ hai là công thức của bạn tính không đúng cho 2 vùng, nó chỉ cộng các ô ở vùng đầu tiên, vùng thứ 2 nó bỏ qua.
Kế nữa là trong trường hợp muốn tính cho 3, 4,...,n,.. vùng bất kỳ (không giới hạn) thì sao, của bạn mới tính được cho 1, hoặc 2 vùng.
Thực ra code bạn viết còn một tồn tại, đó là nếu trong vùng tính có ô trống thì sẽ như thế này: (+152,9+++++++33,3+166,5)/1000 = 0,353. Tuy nhiên cái này có thể giải quyết bằng câu lệnh If.
Thank!
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn dùng hàm cho các file khác thì xóa toàn bộ nội dung file, chỉ chừa lại code, rồi lưu thành đuôi .xla.. ví dụ là Cong.xla
Tiếp theo khi bạn mở 1 file khác mà muốn áp dụng Function này thì vào menu Tool\Add-Ins.. bấm Browse đễ duyệt tới file Cong.xla mà hồi nãy bạn đã lưu.. OK
Giờ thì bấm vào chử Fx trên thanh công thức, bấm mũi tên xổ xuống trong khung "Or select a category" bạn sẽ nhìn thấy chử "User Defined" bạn sẽ nhìn thấy Function của mình
Mến
ANH TUẤN
 
Upvote 0
Cảm ơn Tuấn, bạn có thể giúp mình các ý trên không?
 
Upvote 0
Xin lỗi... món Macro tôi ko rành lắm (nếu ko nói là ngu) nên ko thể giúp dc bạn... Tôi chỉ biết tới đó thôi...
 
Upvote 0
Dựa trên hàm của bác SA, em xin chỉnh sửa theo ý kiến của bạn bogia

Mã:
[color=darkblue]Public[/color] [color=darkblue]Function[/color] Tsum(ParamArray rng()) [color=darkblue]As[/color] [color=darkblue]String[/color]
[color=green]'On Error Resume Next[/color]
    [color=darkblue]Dim[/color] rngUN [color=darkblue]As[/color] Range
    [color=darkblue]Dim[/color] cell [color=darkblue]As[/color] Range, Tong [color=darkblue]As[/color] [color=darkblue]Double[/color]
    [color=darkblue]Set[/color] rngUN = rng(0)
    [color=darkblue]If[/color] [color=darkblue]UBound[/color](rng) > 0 [color=darkblue]Then[/color]
        [color=darkblue]For[/color] i = [color=darkblue]LBound[/color](rng) + 1 [color=darkblue]To[/color] [color=darkblue]UBound[/color](rng)
            [color=darkblue]Set[/color] rngUN = Union(rngUN, rng(i))
        [color=darkblue]Next[/color]
    [color=darkblue]End[/color] [color=darkblue]If[/color]
    [color=darkblue]For[/color] [color=darkblue]Each[/color] cell [color=darkblue]In[/color] rngUN
        [color=darkblue]If[/color] [color=darkblue]Not[/color] IsEmpty(cell) And cell.Value <> "" [color=darkblue]Then[/color]
            Tong = Tong + cell
            Tsum = Tsum & "+" & cell
        [color=darkblue]End[/color] [color=darkblue]If[/color]
    [color=darkblue]Next[/color] cell
    Tsum = "(" & Tsum & ")/1000"
    Tsum = Tsum & " = " & [color=darkblue]CStr[/color](Tong)
    [color=darkblue]Set[/color] rngUN = [color=darkblue]Nothing[/color]
[color=darkblue]End[/color] [color=darkblue]Function[/color]

tuy nhiên mình chưa bẫy lỗi phần các range của bạn có giao nhau thì bạn sẽ bị double giá trị tại các cell đó.

Thân.
 
Upvote 0
hoặc ngắn gọn hơn

Mã:
[COLOR=darkblue]Public[/COLOR] [COLOR=darkblue]Function[/COLOR] Tsum2(ParamArray rng()) [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]String[/COLOR]
[COLOR=green]'On Error Resume Next[/COLOR]
    [COLOR=darkblue]Dim[/COLOR] cell [COLOR=darkblue]As[/COLOR] Range, Tong [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Double[/COLOR]
    [COLOR=darkblue]For[/COLOR] i = [COLOR=darkblue]LBound[/COLOR](rng) [COLOR=darkblue]To[/COLOR] [COLOR=darkblue]UBound[/COLOR](rng)
        [COLOR=darkblue]For[/COLOR] [COLOR=darkblue]Each[/COLOR] cell [COLOR=darkblue]In[/COLOR] rng(i)
            [COLOR=darkblue]If[/COLOR] cell.Value <> "" [COLOR=darkblue]Then[/COLOR]
                Tong = Tong + cell
                Tsum2 = Tsum2 & "+" & cell
            [COLOR=darkblue]End[/COLOR] [COLOR=darkblue]If[/COLOR]
        [COLOR=darkblue]Next[/COLOR] cell
    [COLOR=darkblue]Next[/COLOR]
    Tsum2 = "(" & Tsum2 & ")/1000"
    Tsum2 = Tsum2 & " = " & [COLOR=darkblue]CStr[/COLOR](Tong/1000)
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]Function[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
VBA_SUM2 là hàm tính tổng, cách dùng tương tự như hàm SUM của EXCEL
Mã:
Function VBA_SUM2(ParamArray ValueArg() As Variant) As Variant

Dim Value As Variant
Dim VT As VbVarType 'Kieu gia tri co trong bien VARIANT
Dim Cell As Variant

VBA_SUM2 = 0
For Each Value In ValueArg 'Tinh cho tat ca cac doi so
    
    VT = VarType(Value)
    
    'Kiem tra neu du lieu khong hop le
    If VT = vbEmpty Or VT = vbError Or VT = vbString Or VT = vbNull Then
        GoTo EndFor
    End If
    
    If VT = vbObject Then 'Neu Value la mot Object
        If Value Is Nothing Then
            GoTo EndFor
        End If
    End If
    
    '8204 la kieu Range trong Excel
    If VT = 8204 Or VT = vbObject Or VT = vbArray Then 'Neu Value cã gia tri kieu Range hoac la mot Array
        For Each Cell In Value
            'Kiem tra kieu gia tri cua tung phan tu Cell(i)
            VT = VarType(Cell)
            If VT <> vbEmpty And VT <> vbError And VT <> vbString And VT <> vbNull Then
                VBA_SUM2 = VBA_SUM2 + Cell
            End If
        Next 'Cell
    Else
        VBA_SUM2 = VBA_SUM2 + Value
    End If

EndFor:

Next 'For Each Value

End Function

Để sử dụng cho mọi file Excel thì bạn học cách tạo Addin.

Bạn có thể tìm hiểu thêm cách viết hàm có điều kiện như hàm SUMIF tại đây
http://www.giaiphapexcel.com/forum/showthread.php?t=3093&page=2&highlight=Viết+hàm,+chuẩn
 
Upvote 0
Web KT

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

Back
Top Bottom