yen_truy_van
Thành viên mới

- Tham gia
- 12/3/08
- Bài viết
- 4
- Được thích
- 0
Bạn dùng hàm Sumif là được.yen_truy_van đã viết:Nhờ Anh Chị giúp lập dùm công thức: tổng trong cột nhưng có điểm dừng (file đính kèm).
yen_truy_van đã viết:Mấy anh chỉ em, em không hiểu gì hết, vì em chưa biết nhiều về công thức cũng như VBA. Xin các anh giúp trực tiếp trên file em đã gởi kèm. Cám ơn các anh nhiều, cám ơn diễn đàn luôn !!!
Bạn xem thêm ở đâyyen_truy_van đã viết:Nhờ Anh Chị giúp lập dùm công thức: tổng trong cột nhưng có điểm dừng (file đính kèm).
Thưa thày có cách nào dùng VBA mà kết quả sau khi chạy xong, tại ô kết quả nó là công thức chứ không phải là giá trị (Value). Em ví dụ sau khi chạy VBA thì ô C11 xuất hiện công thức (=)A6+A7+A8 không ah.Với bài toán này thì dùng công thức ko hay bằng VBA.. vì nếu tính 1 cách tổng quát thì ta phải làm công thức cho toàn bộ cột C, với điều kiện cột A khác rổng thì sẽ SUMIF theo cột A... như vậy sẽ quá phí...
Bạn xong file này dùng vòng lập nhé.. (Hãy sửa code lại cho đúng với thực tế)
ANH TUẤN
Code cũ là:Thưa thày có cách nào dùng VBA mà kết quả sau khi chạy xong, tại ô kết quả nó là công thức chứ không phải là giá trị (Value). Em ví dụ sau khi chạy VBA thì ô C11 xuất hiện công thức (=)A6+A7+A8 không ah.
Sub TongCong()
Dim Er As Integer, iM As Integer
Er = Range("B10000").End(xlUp).Row
Range("C5:C" & Er).ClearContents
For i = Er To 5 Step -1
iM = iM + Cells(i, 2).Value
If Cells(i, 1) <> "" Then
Cells(i, 3).Value = iM
iM = 0
End If
Next i
End Sub
Sub TongCong()
Dim Er As Integer, iM As String
Er = Range("B10000").End(xlUp).Row
Range("C5:C" & Er).ClearContents
For i = Er To 5 Step -1
If iM = "" Then iM = Cells(i, 2).Address(0, 0)
If Cells(i, 1) <> "" Then
Cells(i, 3).Value = "=SUM(" & Cells(i, 2).Address(0, 0) & ":" & iM & ")"
iM = ""
End If
Next i
End Sub
Em nghĩ thuật toán từ tối mà không được trong trường hợp em muốn kết quả tổng cộng đặt ngay tại cột B chứ không phải là cột C như bài cũ nữa (tức kết quả tổng tính được đặt ngay trên cùng cột với các thành phần của nó) thì trong trường hợp này code sửa thế nào ah?Sửa lại tí thôi:
PHP:Sub TongCong() Dim Er As Integer, iM As String Er = Range("B10000").End(xlUp).Row Range("C5:C" & Er).ClearContents For i = Er To 5 Step -1 If iM = "" Then iM = Cells(i, 2).Address(0, 0) If Cells(i, 1) <> "" Then Cells(i, 3).Value = "=SUM(" & Cells(i, 2).Address(0, 0) & ":" & iM & ")" iM = "" End If Next i End Sub
Em nghĩ thuật toán từ tối mà không được trong trường hợp em muốn kết quả tổng cộng đặt ngay tại cột B chứ không phải là cột C như bài cũ nữa (tức kết quả tổng tính được đặt ngay trên cùng cột với các thành phần của nó) thì trong trường hợp này code sửa thế nào ah?
Em nghĩ thuật toán từ tối mà không được trong trường hợp em muốn kết quả tổng cộng đặt ngay tại cột B chứ không phải là cột C như bài cũ nữa (tức kết quả tổng tính được đặt ngay trên cùng cột với các thành phần của nó) thì trong trường hợp này code sửa thế nào ah?
Cũng chỉ sửa có tí thôi:Em nghĩ thuật toán từ tối mà không được trong trường hợp em muốn kết quả tổng cộng đặt ngay tại cột B chứ không phải là cột C như bài cũ nữa (tức kết quả tổng tính được đặt ngay trên cùng cột với các thành phần của nó) thì trong trường hợp này code sửa thế nào ah?
Sub TongCong()
Dim Er As Integer, iM As String
Er = Range("B10000").End(xlUp).Row
Range("C5:C" & Er).ClearContents
For i = Er To 5 Step -1
If iM = "" Then iM = Cells(i, 2).Address(0, 0)
If Cells(i, 2) = "" Then
Cells(i, 2).Value = "=SUM(" & Cells(i + 1, 2).Address(0, 0) & ":" & iM & ")"
iM = ""
End If
Next i
End Sub
Cũng chỉ sửa có tí thôi:
.....
cảm ơn thày, em đã tìm ra tại sao em không làm được rồi; tối hôm qua em cũng hình dung như vậy nhưng em quên là vòng lặp đi từ dưới lên trên (step-1) nên thay vì câu lệnh của thày em lại viết làCũng chỉ sửa có tí thôi:
PHP:.... Cells(i, 2).Value = "=SUM(" & Cells(i + 1, 2).Address(0, 0) & ":" & iM & ")"
cảm ơn thày, em đã tìm ra tại sao em không làm được rồi; tối hôm qua em cũng hình dung như vậy nhưng em quên là vòng lặp đi từ dưới lên trên (step-1) nên thay vì câu lệnh của thày em lại viết là
Cells(i, 2).Value = "=SUM(" & Cells(i -1, 2).Address(0, 0) & ":" & iM & ")" lên nó không ra.
Theo em cái này cũng đơn giản thôi, thêm câu lệnh xóa để thực hiện nguyên tắc dòng nào mà cột A có số thứ tự sẽ lập tức xóa nội dung cột B của dòng đó đi (cho ô B trở về rỗng như bài toán gốc), sau khi xong thao tác này mới thực hiện lện như thày ndu ở trên.Còn một cái mà tôi thấy vẫn chưa ổn là nếu giá trị bên trong mà thêm mục vào thì mình Insert hàng, nếu insert ở giữa thì khì OK, nhưng nếu bắt buộc từng mục có số thứ tự thì công thức sẽ không cộng vào những mục vừa insert mà code cũng không chạy vì Kết quả đã không phải là rỗng.
VD:
Mục A
A1
A2
A3
Mục B
B1
B2
B3
Sau khi chạy code, thì kết quả là SUM(A1,A3)
Bây giờ ta thêm vào 2 hàng nữa:
Mục A
A1
A2
A3
A4
A5
Mục B
B1
B2
B3
Vì code đã có kết quả ở trên, tức là không rỗng, thì code chạy sẽ bỏ qua kết quả này, như vậy công thức sẽ không được cập nhật, trừ khi ta NHỚ sau khi insert thì xoá cái SUM ở mục đó để chạy lại code.
Theo em cái này cũng đơn giản thôi, thêm câu lệnh xóa để thực hiện nguyên tắc dòng nào mà cột A có số thứ tự sẽ lập tức xóa nội dung cột B của dòng đó đi (cho ô B trở về rỗng như bài toán gốc), sau khi xong thao tác này mới thực hiện lện như thày ndu ở trên.
Sub TongCong()
Dim Rng As Range, Er As Long, i As Long, iM As String
Range([B5], [B65536].End(xlUp)).Font.Bold = False
For Each Rng In Range([A5], [A65536].End(xlUp))
If Rng <> vbNullString Then Rng.Offset(, 1).ClearContents
Next
Er = [B65536].End(xlUp).Row
For i = Er To 5 Step -1
With Cells(i, 2)
If iM = vbNullString Then iM = .Address(0, 0)
If .Value = vbNullString Then
.Value = "=SUM(" & Cells(i + 1, 2).Address(0, 0) & ":" & iM & ")"
.Font.Bold = True: iM = vbNullString
End If
End With
Next i
End Sub
Lúc này Cell(i-1,2) chưa xuất hiện thì làm sao mà tính được hả bạn.cảm ơn thày, em đã tìm ra tại sao em không làm được rồi; tối hôm qua em cũng hình dung như vậy nhưng em quên là vòng lặp đi từ dưới lên trên (step-1) nên thay vì câu lệnh của thày em lại viết là
Cells(i, 2).Value = "=SUM(" & Cells(i -1, 2).Address(0, 0) & ":" & iM & ")" lên nó không ra.
Lúc trước ta quét từ dưới lên, khi gặp cell rổng thì gán công thứcVì code đã có kết quả ở trên, tức là không rỗng, thì code chạy sẽ bỏ qua kết quả này, như vậy công thức sẽ không được cập nhật, trừ khi ta NHỚ sau khi insert thì xoá cái SUM ở mục đó để chạy lại code.
Lúc trước ta quét từ dưới lên, khi gặp cell rổng thì gán công thức
Giờ ta thêm 1 điều kiện nữa: Quét ngược từ dưới lên, nếu gặp cell rổng hoặc cell chứa công thức thì sẽ gán công thức mới
(chẳng hạn là If Cells(i, 2) = "" Or Cells(i, 2).HasFormula Then)
Đơn giản thế thôi
Sub TongCong()
Dim Er As Long, i As Long, iM As String
Range([B5], [B65536].End(xlUp)).Font.Bold = False
Er = [B65536].End(xlUp).Row
For i = Er To 5 Step -1
With Cells(i, 2)
If iM = vbNullString Then iM = .Address(0, 0)
If .Value = vbNullString Or .HasFormula Then
.Value = "=SUM(" & Cells(i + 1, 2).Address(0, 0) & ":" & iM & ")"
.Font.Bold = True: iM = vbNullString
End If
End With
Next i
End Sub
Nói chung là tuy từng trường hợp mà viết codep/s: Nếu chỉ có công thức SUM ở cột B như vậy thôi thì áp dụng cái thủ tục này, nhưng nếu các mục là công thức cập nhật từ nguồn khác thì dùng thủ tục 2 vòng lặp như bài trước!
Lúc trước ta quét từ dưới lên, khi gặp cell rổng thì gán công thức
Giờ ta thêm 1 điều kiện nữa: Quét ngược từ dưới lên, nếu gặp cell rổng hoặc cell chứa công thức thì sẽ gán công thức mới
(chẳng hạn là If Cells(i, 2) = "" Or Cells(i, 2).HasFormula Then)
Đơn giản thế thôi
Làm sao biết được cell chứa công thức thì sẽ liên quan đến HasFormula? Thường thì trong cửa sổ VBA, tôi sẽ bấm F1, gõ từ khóa nào đó (mà tôi quan tâm) xem phần trợ giúp trả lời điều gì... Còn như vẫn tìm không ra, ta có google để làm gì? Gõ từ khóa vào mà tìm (có thể bằng tiếng Anh hoặc tiếng Việt)Cư bài nào gặp trên diễn đàn mà do thày Ndu, thày Ptm0412 giải thì gần như là một thương hiệu tốt nhất, có thể coi là chuẩn mực mà mọi người tin tưởng; về mặt thuật toán như câu trên đơn thuần về mặt tư duy thì có thể suy luận được nhưng phần bôi đen ở trên sao em đọc các quyển sách VBA chẳng thấy nói đến. Xin thày chỉ cho em cách tìm các "từ vựng" như thế nào ah.
Bài này với những ai mới học VBA tiếp cận là hay, tuy nhiên nó chưa tổng quát lắm, bởi nhiều khi trong công việc các cột số thứ tự và cột cần tính tổng không cố định, năm ngoái em được thày concogia và thày ptm0412 giúp cho bài này http://www.giaiphapexcel.com/forum/showthread.php?45238-có-cách-nào-kết-hợp-lọc-để-tính-tổng-có-thể-copy-nhanh-không-ạh/page3vào đúng đêm 30 tết năm ngoái, đến giờ em vẫn nhớ như in. Gửi bạn Dauthivan xem tham khảo bài này sẽ giúp cho bạn rất nhiều.
Xét ô rỗng để gán công thức, hoặc xét ô chứa công thức, xoá đi cho rỗng để gán công thức mới, đó là xét cái ngọn.Theo em cái này cũng đơn giản thôi, thêm câu lệnh xóa để thực hiện nguyên tắc dòng nào mà cột A có số thứ tự sẽ lập tức xóa nội dung cột B của dòng đó đi (cho ô B trở về rỗng như bài toán gốc), sau khi xong thao tác này mới thực hiện lện như thày ndu ở trên.
[COLOR=#000000][COLOR=#007700]For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Er To 5 Step [/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1
With Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
If [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString Then iM [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700])
If .[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][/COLOR][COLOR=#ff0000]vbNullString Or .HasFormula [/COLOR][COLOR=#000000][COLOR=#0000BB]Then
[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"=SUM(" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#DD0000]":" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]")"
[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Font[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Bold [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]True[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString
End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000BB]End With
Next i[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#007700]For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Er To 5 Step [/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1
[/COLOR][COLOR=#007700] If [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString Then iM [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700])
[/COLOR][/COLOR][COLOR=#ff0000]If Cells(i, 1)= vbNullString [/COLOR][COLOR=#000000][COLOR=#0000BB]Then
[/COLOR][/COLOR][COLOR=#0000cd]Cells(i, 2)[/COLOR][COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"=SUM(" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#DD0000]":" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]")"
[/COLOR][/COLOR][COLOR=#0000cd]Cells(i, 2)[/COLOR][COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Font[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Bold [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]True[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString
End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000BB] Next i[/COLOR][/COLOR]