Xin mã code của lệnh sum. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

duong.vu

Thành viên mới
Tham gia
4/2/11
Bài viết
7
Được thích
0
E xin chào các đại ca VB
E có thử viết code cho lệnh sum.
những biến số e đưa vào chỉ được là từng biến số riêng rẽ
VD : Sum(x1,x2,..)
E không thể viết được cho 1 mạng giống như trong excel
VD : Sum (X1:X5)

Vậy các đại ca có thể giúp e bài toán này được không a.
 
E xin chào các đại ca VB
E có thử viết code cho lệnh sum.
những biến số e đưa vào chỉ được là từng biến số riêng rẽ
VD : Sum(x1,x2,..)
E không thể viết được cho 1 mạng giống như trong excel
VD : Sum (X1:X5)

Vậy các đại ca có thể giúp e bài toán này được không a.
Dùng vòng lặp duyệt qua các biến số (chắc là có điều kiện cho biến số riêng lẻ đó), đặt một biến tạm để cộng qua mỗi vòng lặp, kết quả bằng biến tạm. Có file ví dụ sẽ cho giải pháp nhanh hơn, cụ thể hơn.
P/s: Bạn không nên xưng hô như vậy, rất nhiều thành viên là bậc cha chú, thầy cô, ...
 
Upvote 0
Em xin lỗi mọi người vì cách xưng hô này.
e sẽ rút kinh nghiệm về việc này.
e se thử cách của anh.

Thanks anh.
 
Upvote 0
Dear anh.
Vấn đề e gặp phải là cách khai báo hàm để có thể chuyền biến số.
hiện tại nếu e khái báo
' function su(x1,x2,x3 as double) as double
end function
thì trong excel chuyền tham số bằng cách chọn từng ô.
Liệu có cách khai báo nào để có thể chọn luộn cả mảng giống như lệnh sum không a.

Thanks anh.
 
Upvote 0
E xin chào các đại ca VB
E có thử viết code cho lệnh sum.
những biến số e đưa vào chỉ được là từng biến số riêng rẽ
VD : Sum(x1,x2,..)
E không thể viết được cho 1 mạng giống như trong excel
VD : Sum (X1:X5)

Vậy các đại ca có thể giúp e bài toán này được không a.
Bạn khai báo các biến x1, x2,... gì đó theo kiểu Range, sau đó duyệt qua lần lượt các Cell của từng biến này và cộng dồn nếu là số. Với cách này, bạn có thể đưa tham số dạng A1:B10,...

Mà trong WorksheetFunction cũng có hàm SUM, mắc gì không xài mà phải xây dựng chi cho mệt? Có ý kiến cho rằng không nên xài WorksheetFunction vì vấn đề tiện dụng hay tốc độ gì gì đó, nhưng theo tôi thì giữa việc đi xây dựng một hàm có chức năng tương tự và việc sử dụng hàm có sẵn thì tôi sẽ dùng cái có sẵn. Thứ nhất là nhanh thấy kết quả, khỏi phải bận tâm suy nghĩ; thứ hai, dễ gì mình xây dựng hàm đã ưu việt hơn cả một đội ngũ lập trình viên của Microsoft.
 
Upvote 0
Dear anh.
Vấn đề e gặp phải là cách khai báo hàm để có thể chuyền biến số.
hiện tại nếu e khái báo
' function su(x1,x2,x3 as double) as double
end function
thì trong excel chuyền tham số bằng cách chọn từng ô.
Liệu có cách khai báo nào để có thể chọn luộn cả mảng giống như lệnh sum không a.

Thanks anh.
Bạn tham khảo, Hàm "SU"không khác gì hàm "SUM" có sẵn@$@!^%.
Public Function su(rng As Range) As Double
Dim i As Long, j As Long, arr(), tong As Long
tong = 0
arr = rng.Value
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
tong = tong + arr(i, j)
Next j
Next i
su = tong
End Function
Bấm cảm ơn nếu thấy có ích cho bạn.
 

File đính kèm

Upvote 0
Bạn tham khảo, Hàm "SU"không khác gì hàm "SUM" có sẵn
Public Function su(rng As Range) As Double
Dim i As Long, j As Long, arr(), tong As Long
tong = 0
arr = rng.Value
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
tong = tong + arr(i, j)
Next j
Next i
su = tong
End Function
.

Chắc ăn hàm này không xài được:
- Làm gì có cái chuyện hàm SUM mà đối số chỉ là Range? Bạn để ý hàm SUM của bác Bill =SUM(1,2,3) cho kết quả =6 nhé. Còn hàm của bạn?
- Bạn cho arr = rng.Value và nghĩ rằng arr là mảng 2 chiều? Quá chủ quan đấy! Thử công thức =su(A4) xem kết quả là gì
vân.. vân và... mây.. mây..
 
Upvote 0
Chắc ăn hàm này không xài được:
- Làm gì có cái chuyện hàm SUM mà đối số chỉ là Range? Bạn để ý hàm SUM của bác Bill =SUM(1,2,3) cho kết quả =6 nhé. Còn hàm của bạn?
- Bạn cho arr = rng.Value và nghĩ rằng arr là mảng 2 chiều? Quá chủ quan đấy! Thử công thức =su(A4) xem kết quả là gì
vân.. vân và... mây.. mây..
Dạ, em viết hàm này là theo yêu cầu của tác giả ạ!
Em mới tập tành với VBA thôi nên ...
Ở chỗ=su(A4) em nghĩ đã tính tổng thì phải có ít nhất 2 ô trở nên chứ Thầy??? Nếu chỉ có 1 ô như thầy đưa thì cần gì dùng hàm ạ???
P/S: Em nói 1 vài câu vui vui với tác giả thôi ạ.
 
Upvote 0
Ở chỗ=su(A4) em nghĩ đã tính tổng thì phải có ít nhất 2 ô trở nên chứ Thầy??? Nếu chỉ có 1 ô như thầy đưa thì cần gì dùng hàm ạ???
.

Trong 1 bài toán mà người ta phải ghép hàm thì cái chuyện SUM 1 ô là hoàn toàn có thể xảy ra!
Ví dụ: =su(OFFSET(A4,,,n)) với n là biến chạy (dùng để thay đổi khi người ta kéo fill). Trường hợp này code của bạn sẽ lỗi khi n =1
--------------------------------
Phân tích code của bạn chơi thế thôi chứ tôi dám khẳng định: Để viết 1 hàm giống như hàm SUM là chuyện vượt quá tầm tay (ít nhất với trình độ của tôi)
 
Upvote 0
Trong 1 bài toán mà người ta phải ghép hàm thì cái chuyện SUM 1 ô là hoàn toàn có thể xảy ra!
Ví dụ: =su(OFFSET(A4,,,n)) với n là biến chạy (dùng để thay đổi khi người ta kéo fill). Trường hợp này code của bạn sẽ lỗi khi n =1
--------------------------------
Phân tích code của bạn chơi thế thôi chứ tôi dám khẳng định: Để viết 1 hàm giống như hàm SUM là chuyện vượt quá tầm tay (ít nhất với trình độ của tôi)
Thầy ơi cho em hỏi, liệu mình có thể viết hàm su mà nó có thể tính như: =su(1,2,3,....) hoặc =su(A1,B3, D5,...) không ạ?
 
Upvote 0
Thầy ơi cho em hỏi, liệu mình có thể viết hàm su mà nó có thể tính như: =su(1,2,3,....) hoặc =su(A1,B3, D5,...) không ạ?

Đương nhiên được! Dùng ParamArray. Đại khái thế này:
Mã:
Function SU([COLOR=#ff0000]ParamArray Arrays()[/COLOR]) As Double
  Dim aTmp, Item, tmp As Double
  Dim i As Long
  On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      If IsNumeric(Item) Then tmp = tmp + CDbl(Item)
    Next
  Next
  SU = tmp
End Function
Viết chơi chơi thôi chứ chưa hoàn chỉnh đâu. Chủ yếu minh họa về ParamArray chứ tôi không hề có tham vọng viết được hàm SUM như anh Bill (vô cùng khó)
 
Upvote 0
dear moi nguoi.
E rất cảm ơn ý kiếm các thầy, các anh cho bài toán của e.
Tuy e mới biết về lập trình, nhưng e sẽ viết code cho đến khi dc lệnh Sum.

Thanks mọi người đã giúp đỡ.
 
Upvote 0
dear moi nguoi.
E rất cảm ơn ý kiếm các thầy, các anh cho bài toán của e.
Tuy e mới biết về lập trình, nhưng e sẽ viết code cho đến khi dc lệnh Sum.

Thanks mọi người đã giúp đỡ.
Thấy bạn có quyết tâm, vậy thử viết sao cho có được kết quả của SUM như: =SuSu(1*2;5/3;10^2;A1:C5) nhé.
 
Upvote 0
dear moi nguoi.
E rất cảm ơn ý kiếm các thầy, các anh cho bài toán của e.
Tuy e mới biết về lập trình, nhưng e sẽ viết code cho đến khi dc lệnh Sum.

Thanks mọi người đã giúp đỡ.

Tôi đã chỉ cho một lần rồi. Mã nguồn của MS là đồ chơi bản quyền, đâu có lấy được.
Muốn biết người ta viết hàm SUM ra sao thì lên mạng những nơi chuyên mã nguồn mở, đao về một cái bản như Open Office rồi tha hồ xem mã nguồn của nó.

Với điều kiện là bạn biết cách đọc mã C/C++
 
Upvote 0

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

Back
Top Bottom