Tinh tổng + so sánh dữ liệu 2 sheet + copy dữ liệu sang sheet khác

Liên hệ QC

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
112
Xin chào các bạn.

Mình đang làm công việc kiểm tra sổ sách của các thành viên.
Hiện tại đang làm việc kiểm tra chênh lệch giữa sổ phụ ngân hàng & báo cáo ngân hàng 1 cách rất thủ công và mất nhiều thời gian.

Nay mong các bạn giúp hộ viết giúp code thực hiện các việc đó như trong file đính kèm.

Chân thành cảm ơn rất nhiều.

Thân.
 

File đính kèm

  • PM BIDVTB.rar
    21.7 KB · Đọc: 106
1/ Vào sheet PM tính tổng theo số của cột D và điền vào cột G

Cùng nhau ta kiểm tra câu I xem đúng ý bạn chưa bằng cách sau:

Vô Sheets("PM"); loại bỏ 2 dòng trống phía trên không chứa dữ liệu;
Đặt tên các trường cho CSDL, chí ít là [AAAA], [BBBB], [CCCC], , , , ,
Chạy macro sau & cho biết ý kiến của bạn, để còn hiệu đình. . . .

PHP:
Option Explicit
Sub SortForD()
 Dim Rng As Range:                  Dim Tong As Double
 Dim MyAdd As String
 Dim eRw As Long, Jj As Long
    
 Sheets("PM").Select:               Columns("A:I").Select
 Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Key2:=Range("G2") _
   , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1
 eRw = [d65500].End(xlUp).Row
 For Jj = 2 To eRw
   With Cells(Jj, "D")
      If .Offset(1).Value <> .Value Then
         If Tong = 0 Then
            .Offset(, 3).Value = .Offset(, 4).Value
         Else
            Range(MyAdd).Offset(, 3).Value = Tong + .Offset(, 4).Value
            Tong = 0:                  MyAdd = ""
         End If
      Else
         If MyAdd = "" Then MyAdd = .Address
         Tong = Tong + .Offset(, 4)
      End If
   End With
 Next Jj
End Sub
:-=
 
Upvote 0
To HYen17

Hay quá, cảm ơn sự quan tâm giúp đỡ của bạn rất nhiều.

Sau khi chạy code SortForD Có 1 sai sót khi bỏ qua tính tổng của dòng đầu. cụ thể trong file của mình là UCHI-01/1 với số tiền 15,934,768 đã không dược tình tổng và điền vào cột G1, còn các dòng khác thì rất chính xác. Chỗ sót này mình đã biết chỗ đổi For Jj = 2 To eRw
thành For Jj = 1 To eRw

Phần việc còn lại khó quá, hiện tại mình vẫn chưa nghỉ ra cách ngắn nhất để dễ viết code, bạn giúp nhé.

Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
2/ So sánh cột G trong sheet PM với cột C trong sheet SP để tìm các số giống nhau và

(1) Nói lại câu (I) 1 tẹo:
Nếu hóa đơn mà bạn nói đang nằm ở dòng thứ 2 như mình đã khuyến cáo, (Dòng 1 là tiêu đề các cột) Thì macro của mình đảm bảo tính hết, tính đúng & tính đủ cho bạn. Mình tin rằng bạn làm theo cách mình đã hướng dẫn nên không đưa file lên. Bạn xem lại đi

(2) Macro dưới đây sẽ thực thi câu (2') cho bạn; Vì trong câu (1), chúng ta đã gộp hầu hết các hóa đơn trùng nhau; nên so với cột 'G' thì chỉ sẽ có 4 recods được tô màu mà thôi
Còn nếu so với cột 'H' như dười đây thì sẽ có cơ man records được tô màu)
Nếu bạn vẫn giữ lập trường thì tự đổi ký tự biểu thị cột từ 'H' sang 'G' trước khi chạy nó.

PHP:
Option Explicit
Sub Cau2()
 Dim Sh As Worksheet
 Dim Rng As Range, sRng As Range
 Dim jJ As Long, eRw As Long
 
 Set Sh = Sheets("SP")
 Set Rng = Sh.Range(Sh.[c10], Sh.[c65500].End(xlUp))
 Sheets("PM").Select:         eRw = [d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Cells(jJ, "H")
      Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         sRng.Font.ColorIndex = 3
         .Interior.ColorIndex = 35
      End If
   End With
 Next jJ
End Sub
 
Upvote 0
Sau khi test thử có vài dòng nhờ bạn tư vấn hộ:
- Trong code SortForD Đừng sort lại theo cột D vì thứ tự UNC đã đúng theo tuần tự rùi.(Mình mong bạn giữ đúng cấu trúc ban đầu).
- Trong Code Cau2 chạy đúng với yêu cầu của Mình khi chuyển từ cột 'H' sang 'G'.

Nên mình mượn code của bạn chình lại theo ý mình như sau:
Mã:
Option Explicit
Sub SortForD()
 Dim Rng As Range:                  Dim Tong As Double
 Dim MyAdd As String
 Dim eRw As Long, jJ As Long
    
  Sheets("PM").Select
  eRw = [d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Cells(jJ, "D")
      If .Offset(1).Value <> .Value Then
         If Tong = 0 Then
            .Offset(, 3).Value = .Offset(, 4).Value
         Else
            Range(MyAdd).Offset(, 3).Value = Tong + .Offset(, 4).Value
            Tong = 0:                  MyAdd = ""
         End If
      Else
         If MyAdd = "" Then MyAdd = .Address
         Tong = Tong + .Offset(, 4)
      End If
   End With
 Next jJ
End Sub



Sub Cau2()
 Dim Sh As Worksheet
 Dim Rng As Range, sRng As Range
 Dim jJ As Long, eRw As Long
 
 Set Sh = Sheets("SP")
 Set Rng = Sh.Range(Sh.[c10], Sh.[c65500].End(xlUp))
 Sheets("PM").Select:         eRw = [d65500].End(xlUp).Row
 For jJ = 1 To eRw
   'With Cells(jJ, "H")
   With Cells(jJ, "G")
      Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         sRng.Font.ColorIndex = 3
         .Interior.ColorIndex = 35
      End If
   End With
 Next jJ
End Sub

Tuy hhiên còn sót 2 lỗi bên sheet SP sau không được đánh dấu đỏ:
14/01/09 500,000,000 TT VINAMILK CH ở dòng 177
21/01/09 500,000,000 TTOAN TIEN VINAMILK MAXI CH ở dòng 245

Hay quá đã giải quyết được 50% khối lượng công việc rùi. Bạn xem lại hộ & cho mình phần còn lại nha.

Cảm ơn bạn quan tâm giúp đỡ.

Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Tuy hhiên còn sót 2 lỗi bên sheet SP sau không được đánh dấu đỏ:
14/01/09 500,000,000 TT VINAMILK CH ở dòng 177
21/01/09 500,000,000 TTOAN TIEN VINAMILK MAXI CH ở dòng 245

Hay quá đã giải quyết được 50% khối lượng công việc rùi. Bạn xem lại hộ & cho mình phần còn lại nha.
Mình kiểm bên 'PM' không có 2 dòng nào 5 trăm triệu hết; Nếu bạn sort theo cột 'H' thì sau 3 anh 4 trăm triệu sẽ tới anh 5 trăm nặm chục triệu mà thôi

Phần tiếp theo sẽ căn cứ theo kết quả xét theo cột 'H' chứ không xét theo cột 'G' nữa phải không?

Chờ sự khẳng định của bạn đó nha! :-=

Bổ sung: Thực ra 2 macro này ta có thể nhốt chung, nhưng chuyện đó sẽ tính sau; Một khi kết thúc 50 % còn lại của bạn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình kiểm bên 'PM' không có 2 dòng nào 5 trăm triệu hết; Nếu bạn sort theo cột 'H' thì sau 3 anh 4 trăm triệu sẽ tới anh 5 trăm nặm chục triệu mà thôi

Phần tiếp theo sẽ căn cứ theo kết quả xét theo cột 'H' chứ không xét theo cột 'G' nữa phải không?

Chờ sự khẳng định của bạn đó nha! :-=

1/ Bên PM có đó bạn:
13/01/09 UCHI-01/122 136CH-TH 1121CTY-BIDTB 500,000,000 dòng 206
20/01/09 UCHI-01/235 136CH-TH 1121CTY-BIDTB 500,000,000 dòng 237.
như vậy phải bẫy lỗi có số trùng nhau thì phải đếm tổng số trùng (cùng 1 giá trị) và tô màu số trùng.

2/ Khi mang qua sheet KQ bạn lấy theo cột H nhưng phải dựa vào kết quả tô màu bên cột G (bạn xem lại file mình gửi bên sheet KQ). Nếu sau khi chạy code ra đúng dữ liệu như bên sheet KQ là chính xác rùi.

Vài dòng gừi bạn.

Thân

P/s: Mình có ý này Chúng ta chép dl bên PM sang KQ, sau đó đến SP (giữ đúng cột như PM-giống phần KQ trong file mình gửi lên). Sau đó ta xoá các dòng có tô màu đi là được rùi.
 
Lần chỉnh sửa cuối:
Upvote 0
1/ Bên PM có đó bạn:
13/01/09 UCHI-01/122 136CH-TH 1121CTY-BIDTB 500,000,000 dòng 206
20/01/09 UCHI-01/235 136CH-TH 1121CTY-BIDTB 500,000,000 dòng 237.
như vậy phải bẫy lỗi có số trùng nhau thì phải đếm tổng số trùng (cùng 1 giá trị) và tô màu số trùng.
2/ Khi mang qua sheet KQ bạn lấy theo cột H nhưng phải dựa vào kết quả tô màu bên cột G (bạn xem lại file mình gửi bên sheet KQ). Nếu sau khi chạy code ra đúng dữ liệu như bên sheet KQ là chính xác rùi.
P/s: Mình có ý này Chúng ta chép dl bên PM sang KQ, sau đó đến SP (giữ đúng cột như PM-giống phần KQ trong file mình gửi lên). Sau đó ta xoá các dòng có tô màu đi là được rùi.

(1) Mình mới tải lại file của bạn ở bài 1; Tại sheets("PM"), để con trỏ trên cột 'H' & tìm 5 trăm triệu, excel trả lời không có (!) & trên cột 'C', tìm '01/122' cũng như '01/235' cũng Nothing là sao (?)
Đúng là sau khi chạy macro 1 (tạm gọi vậy) sẽ có nhiều cái 5 trăm triệu trên cột 'G' Nhưng mình nghĩ các cái í không có nghĩa lý gì nhiều lắm! Hay chúng ta chưa hoàn toàn hiểu nhau;

(2) Cách của bạn sẽ rất tốt, nếu trên trang tính 'KQ' chỉ có 1 cột được tô màu. Còn ở đây một phần (đâu tô màu tại 'C', phần sau tô ở 'H' cơ mà?!
Áp dụng phương thức của bạn cũng sẽ phải
* Xác dịnh dòng kết thúc những dữ liệu vừa chép bên 'SP' qua;
* hoặc áp lệnh xét cả trên hai cột 'C' & 'H' của 'KQ' để thấy có màu là xóa.

(3) Tại cột 'C' của "SP" có những ô trống; Vậy tất nhiên chép cũng vô nghĩa, phải không?
 
Upvote 0
(1) Mình mới tải lại file của bạn ở bài 1; Tại sheets("PM"), để con trỏ trên cột 'H' & tìm 5 trăm triệu, excel trả lời không có (!) & trên cột 'C', tìm '01/122' cũng như '01/235' cũng Nothing là sao (?)
Đúng là sau khi chạy macro 1 (tạm gọi vậy) sẽ có nhiều cái 5 trăm triệu trên cột 'G' Nhưng mình nghĩ các cái í không có nghĩa lý gì nhiều lắm! Hay chúng ta chưa hoàn toàn hiểu nhau;
(2) Cách của bạn sẽ rất tốt, nếu trên trang tính 'KQ' chỉ có 1 cột được tô màu. Còn ở đây một phần (đâu tô màu tại 'C', phần sau tô ở 'H' cơ mà?!
Áp dụng phương thức của bạn cũng sẽ phải
* Xác dịnh dòng kết thúc những dữ liệu vừa chép bên 'SP' qua;
* hoặc áp lệnh xét cả trên hai cột 'C' & 'H' của 'KQ' để thấy có màu là xóa.
(3) Tại cột 'C' của "SP" có những ô trống; Vậy tất nhiên chép cũng vô nghĩa, phải không?

1/ Bạn khộng dùng code của mình, mình đã đổi cột tô màu ở bên sheet PM là 'H' sang 'G'.
2/ Bên sheet PM tìm ở cột G hoặc cột D thì ra được 2 phiếu mình nói (Bên PM tô màu nhưng SP không tô màu).
3/ Cột G bên PM là cột đem so sánh với cột C bên SP, nếu giống nhau sẽ tô màu. (Ở đây còn lỗi nếu nhiều số có cùng giá trị giống nhau thì chỉ tô 1 lần bên sheet SP thui còn bên PM thì tô đủ).
4/ Ý mình chép vào cùng sheet KQ để tiện viết code thui.
- Bạn giử nguyên cấu trúc bên PM chép sang KQ.
- Các cột B,C,E bên sheet SP khi chép sang KQ sẽ đi theo cấu trúc bên sheet PM (khi chép sang cột B bên SP = cột C bên PM, cột C bên SP = cột H bên PM, cột E bên SP = cột I bên PM).
- Khi chép xong chỉ còn xét đến việc xoá các dòng có ô tô màu.

Vài dòng gửi bạn.

Thân.
 
Upvote 0
Macro tô màu sửa lại như sau

3/ Cột G bên PM là cột đem so sánh với cột C bên SP, nếu giống nhau sẽ tô màu. (Ở đây còn lỗi nếu nhiều số có cùng giá trị giống nhau thì chỉ tô 1 lần bên sheet SP thui còn bên PM thì tô đủ).
PHP:
Sub Color2()
 Dim Sh As Worksheet:                     Dim MyAdd As String  '<=|'
 Dim Rng As Range, sRng As Range
 Dim jJ As Long, eRw As Long
  
 Set Sh = Sheets("SP")
 Set Rng = Sh.Range(Sh.[c10], Sh.[c65500].End(xlUp))
 Sheets("PM").Select:         eRw = [d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Cells(jJ, "G")
      If .Value <> "" Then
         Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address  '<=|'
            Do                             '<=|'
               sRng.Font.ColorIndex = 3
               .Interior.ColorIndex = 35
               Set sRng = Rng.FindNext(sRng)       '<=|'
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd '<=|'
         End If
      End If
   End With
 Next jJ
End Sub

& Macro này sẽ không tô những ô trống nữa.
Bạn xem thử nha.

(Mình cũng đã thử & gộp được 2 macro, nhưng với cột 'H' kia, nếu trên cột 'G' thì phải tuần tự từng macro thôi.)
 
Upvote 0
To HYen17

Cực bạn quá.
Việc đánh dấu màu của code ở bài 10 thì chạy chính xác. Việc còn lại là copy những dòng không có tô màu sang KQ.
Đễ tiện viết code, bạn hãy chép từ PM sang KQ theo cột G đi, chứ phải dò tìm theo cột H so với cột G rùi mới chép sang KQ thì khó quá.

Ban ráng giúp mình nha.

Thân.
 
Upvote 0
Thật là khổ hết sức với ô trộn của bạn, mất vô đó gần 1 h

Mình viết tiếp trong macro tô màu
Sau khi tô màu, macro sẽ Copy những ô không có màu đỏ sang 'KQ' & sau đó sẽ Copy nhựng ô không có màu lam sang nối tiếp;

Bạn thử xem, nếu không được mình sẽ đưa file lên.

PHP:
Sub ColorAndCopy()
 Dim Sh As Worksheet:                     Dim MyAdd As String
 Dim Rng As Range, sRng As Range, cRng As Range
 Dim jJ As Long, eRw As Long
 
1 ' Add Font Color Or Interior Color '
 Set Sh = Sheets("SP")
 Set Rng = Sh.Range(Sh.[c10], Sh.[c65500].End(xlUp))
 Sheets("PM").Select:         eRw = [d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Cells(jJ, "G")
      If .Value <> "" Then
         Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               sRng.Font.ColorIndex = 3
               .Interior.ColorIndex = 35
               Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
      End If
   End With
 Next jJ
2 ' Copy From None Color "SP" '
 Sheets("KQ").Select:            Cells.Clear
 [a1].Resize(, 9).Value = Sheets("PM").[a1].Resize(, 9).Value
 eRw = Sh.[A65500].End(xlUp).Row
 Set Rng = Sh.Range(Sh.[c11], Sh.Cells(eRw, "C"))
 For Each sRng In Rng
   With sRng
      If .Value <> "" And .Font.ColorIndex <> 3 Then
         Set cRng = Cells(65500, "C").End(xlUp)
         cRng.Offset(1).Value = .Offset(, -1).Value
         cRng.Offset(1, 5).Value = .Value
         cRng.Offset(1, 6).Value = .Offset(, 2).Value
      End If
   End With
 Next sRng
3 ' Copy From "PM" '
 Set Rng = Nothing
 Set Sh = Sheets("PM"):          eRw = Sh.[d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Sh.Cells(jJ, "G")
      If .Value <> "" And .Interior.ColorIndex <> 35 Then
         If Rng Is Nothing Then
            Set Rng = .Offset(, -6).Resize(, 9)
         Else
            Set Rng = Union(Rng, .Offset(, -6).Resize(, 9))
         End If
      End If
   End With
 Next jJ
 Rng.Copy Destination:=[c65500].End(xlUp).Offset(1, -2)
End Sub
 
Upvote 0
To HYen17

Mình đã test thấy rất chính xác.
Cảm ơn bạn đã giành nhiều thời gian quan tâm giúp đỡ mình.
Tiện đây bạn cho mình hỏi thêm một chút nha:
- Mình muốn dùng autofilter đễ fill những ô không có tô màu trong 2 sheet SP & PM có được không?.
- Trên GPE bạn OB có viết 1 hàm tự tạo rất hay để tính tổng các ô tô màu. Mình ứng dụng không thành công trong file của mình (hàm của OB chỉ tính có 2 màu đỏ & xanh). Bạn có thể cho mình code tính tổng các ô tô màu trong 2 sheet PM & SP?.

Cảm ơn bạn rất nhiều.

Thân.
 
Upvote 0
Upvote 0
Bạn cần tính tổng theo cột 'C' & 'G' sau khi đã tô màu?
Vậy thì tính tổng luôn, khỏi tô màu có tiện không?
Vì tính tổng hay tô màu không khác nhau là bao.
:-=

Mình cần hàm tính tổng những ô tô màu đỏ ngay tại sheet SP & tô màu xanh bên PM.
Quạn trọng nhất là khi mình vô sheet SP hay PM mình có thể fill được những ô không đánh dấu màu ngay tại từng sheet để kiểm tra.


Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là code sum theo màu nền & sum theo màu font chữ mà mình sưu tầm được trên GPE là của OB và Ozgrid:
Mã:
Function SumColor(rColor As Range, rSumRange As Range)

''''''''''''''''''''''''''''''''''''''
'Written by Ozgrid Business Applications
'www.ozgrid.com

'Sums cells based on a specified fill color.
'''''''''''''''''''''''''''''''''''''''
        Dim rCell As Range
        Dim iCol As Integer
        Dim vResult

        iCol = rColor.Interior.ColorIndex

                For Each rCell In rSumRange
                        If rCell.Interior.ColorIndex = iCol Then
                                vResult = WorksheetFunction.SUM(rCell) + vResult
                        End If
                Next rCell

        SumColor = vResult
End Function


Function ColorFont(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
    lCol = rColor.Font.ColorIndex
        If SUM = True Then
            For Each rCell In rRange
                If rCell.Font.ColorIndex = lCol Then
                    vResult = WorksheetFunction.SUM(rCell) + vResult
                End If
            Next rCell
        Else
            For Each rCell In rRange
                If rCell.Font.ColorIndex = lCol Then
                    vResult = 1 + vResult
                End If
            Next rCell
        End If
ColorFont = vResult
End Function

Còn việc muốn fill theo màu nền & màu font vẫn chưa biết. Có bạn nào chỉ hộ với (không copy sang sheet khác các dòng có màu mà fill ngay tại sheet hiện hành như mình chọn chức năng Autofilter.

Thân.
 
Upvote 0
Còn việc muốn fill theo màu nền & màu font vẫn chưa biết. Có bạn nào chỉ hộ với (không copy sang sheet khác các dòng có màu mà fill ngay tại sheet hiện hành như mình chọn chức năng Autofilter.

Thân.
Filter theo màu cũng khá đơn giản mà bạn ---> Tạo 1 cột phụ, với công thức lấy màu font hoặc màu nền (có thể dùng UDF hay hàm macro 4 đều được) ---> Sau đó là.. cứ filter thôi
 
Upvote 0
Đây là code sum theo màu nền & sum theo màu font chữ mà mình sưu tầm được trên GPE là của OB và Ozgrid:
Mã:
Function SumColor(rColor As Range, rSumRange As Range)

''''''''''''''''''''''''''''''''''''''
'Written by Ozgrid Business Applications
'www.ozgrid.com

'Sums cells based on a specified fill color.
'''''''''''''''''''''''''''''''''''''''
        Dim rCell As Range
        Dim iCol As Integer
        Dim vResult

        iCol = rColor.Interior.ColorIndex

                For Each rCell In rSumRange
                        If rCell.Interior.ColorIndex = iCol Then
                                vResult = WorksheetFunction.SUM(rCell) + vResult
                        End If
                Next rCell

        SumColor = vResult
End Function


Function ColorFont(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
    lCol = rColor.Font.ColorIndex
        If SUM = True Then
            For Each rCell In rRange
                If rCell.Font.ColorIndex = lCol Then
                    vResult = WorksheetFunction.SUM(rCell) + vResult
                End If
            Next rCell
        Else
            For Each rCell In rRange
                If rCell.Font.ColorIndex = lCol Then
                    vResult = 1 + vResult
                End If
            Next rCell
        End If
ColorFont = vResult
End Function
Còn việc muốn fill theo màu nền & màu font vẫn chưa biết. Có bạn nào chỉ hộ với (không copy sang sheet khác các dòng có màu mà fill ngay tại sheet hiện hành như mình chọn chức năng Autofilter.

Thân.


C1 : Tạo ra 1 UDF để nhận diện màu nền. Dùng cột phụ như bác Ndu nói.
C2 : Dùng Excel 2007.

--CV--
 
Upvote 0
Xin đưa ra anh em hàm tính tổng để bạn tham khảo & lựa chọn

(1) Tính tổng theo màu

PHP:
Option Explicit
Function SumForColor(Rng As Range, Color_ As Byte, Optional Back As Boolean = True) As Double
 Dim Clls As Range
 For Each Clls In Rng
   If Back Then
      If Clls.Interior.ColorIndex = Color_ Then _
         SumForColor = SumForColor + Clls.Value
   Else
      If Clls.Font.ColorIndex = Color_ Then _
         SumForColor = SumForColor + Clls.Value
   End If
 Next Clls
End Function

(2) Tính tổng theo màu của ô chuẩn

PHP:
Function SumByColor(Rng As Range, Color_ As Range, Optional Back As Boolean = True) As Double
 Dim Clls As Range
 For Each Clls In Rng
   If Back Then
      If Clls.Interior.ColorIndex = Color_.Interior.ColorIndex Then _
         SumByColor = SumByColor + Clls.Value
   Else
      If Clls.Font.ColorIndex = Color_.Font.ColorIndex Then _
         SumByColor = SumByColor + Clls.Value
   End If
 Next Clls
End Function
 
Upvote 0
(1) Tính tổng theo màu

PHP:
Option Explicit
Function SumForColor(Rng As Range, Color_ As Byte, Optional Back As Boolean = True) As Double
 Dim Clls As Range
 For Each Clls In Rng
   If Back Then
      If Clls.Interior.ColorIndex = Color_ Then _
         SumForColor = SumForColor + Clls.Value
   Else
      If Clls.Font.ColorIndex = Color_ Then _
         SumForColor = SumForColor + Clls.Value
   End If
 Next Clls
End Function
(2) Tính tổng theo màu của ô chuẩn

PHP:
Function SumByColor(Rng As Range, Color_ As Range, Optional Back As Boolean = True) As Double
 Dim Clls As Range
 For Each Clls In Rng
   If Back Then
      If Clls.Interior.ColorIndex = Color_.Interior.ColorIndex Then _
         SumByColor = SumByColor + Clls.Value
   Else
      If Clls.Font.ColorIndex = Color_.Font.ColorIndex Then _
         SumByColor = SumByColor + Clls.Value
   End If
 Next Clls
End Function

Cảm ơn Chanh tiên sinh.
Nghe nói Chanh tiên sinh có tuyệt kỹ Find (by Format) nổi danh giang hồ, sao không đem ra để anh em đồng đạo được dịp mãn nhãn.
Chứ cứ dùng For each nhiều quá có khi . . quên Find đấy. Văn ôn võ luyện mà.

--CV--
 
Upvote 0
Web KT
Back
Top Bottom