Sai chổ nào khi truy xuất thông tin của FormatConditions? (1 người xem)

  • Thread starter Thread starter bivily
  • Ngày gửi Ngày gửi
Liên hệ QC

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

bivily

Thành viên hoạt động
Tham gia
11/10/07
Bài viết
110
Được thích
26
Mình viết hàm CountColor để đếm số ô trong vùng chọn có Conditional Formatting của Font (tức Font Color). Hiện tại trên bảng tính của mình (như file đính kèm), trong cột C có 2 loại Conditional Formatting khác nhau. Tại ô C10 vừa có CF dạng Font Color và vừa có CF dạng Interior Color. Lẽ ra hàm sau cho ô C10 phải trả về kết quả là 1, tại sao ở đây lại cho kết quả là 0. Ai rành món VBA này xin chỉ giúp mình là sai ở đâu được không?

PHP:
Function CountColor(rg As Range) As Long
    Dim cel As Range, i As Long
    Dim Dem As Long, mau As Long
    For Each cel In rg
        With cel.FormatConditions
            For i = 1 To .Count
                On Error Resume Next
                mau = .Item(i).Font.Color

               If Err.Number = 0 Then Dem = Dem + 1
                If Err.Number > 0 Then MsgBox Err.Description
                                '......
                On Error GoTo 0
            Next
        End With
    Next
    CountColor = Dem
End Function

Chân thành cám ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Mình viết hàm CountColor để đếm số ô trong vùng chọn có Conditional Formatting của Font (tức Font Color). Hiện tại trên bảng tính của mình (như file đính kèm), trong cột C có 2 loại Conditional Formatting khác nhau. Tại ô C10 vừa có CF dạng Font Color và vừa có CF dạng Interior Color. Lẽ ra hàm sau cho ô C10 phải trả về kết quả là 1, tại sao ở đây lại cho kết quả là 0. Ai rành món VBA này xin chỉ giúp mình là sai ở đâu được không?

PHP:
Function CountColor(rg As Range) As Long
    Dim cel As Range, i As Long
    Dim Dem As Long, mau As Long
    For Each cel In rg
        With cel.FormatConditions
            For i = 1 To .Count
                On Error Resume Next
                mau = .Item(i).Font.Color

               If Err.Number = 0 Then Dem = Dem + 1
                If Err.Number > 0 Then MsgBox Err.Description
                                '......
                On Error GoTo 0
            Next
        End With
    Next
    CountColor = Dem
End Function
Chân thành cám ơn!
VBA không đọc được CF bạn à, muốn vậy thì định dạng bằng cách khác thôi
 
Upvote 0
VBA không đọc được CF bạn à, muốn vậy thì định dạng bằng cách khác thôi

Có mà bạn! Mình không hiểu sao lại gặp những lỗi khi một ô có các CF như ô C10 thôi. Trong trường hợp của mình đây nếu bạn dùng công thức =CountColor(C11) hàm vẫn trả về kết quả là 1 mà không có bất cứ thông báo lỗi nào mà.
 
Upvote 0
Mình viết hàm CountColor để đếm số ô trong vùng chọn có Conditional Formatting của Font (tức Font Color). Hiện tại trên bảng tính của mình (như file đính kèm), trong cột C có 2 loại Conditional Formatting khác nhau. Tại ô C10 vừa có CF dạng Font Color và vừa có CF dạng Interior Color. Lẽ ra hàm sau cho ô C10 phải trả về kết quả là 1, tại sao ở đây lại cho kết quả là 0. Ai rành món VBA này xin chỉ giúp mình là sai ở đâu được không?

PHP:
Function CountColor(rg As Range) As Long
    Dim cel As Range, i As Long
    Dim Dem As Long, mau As Long
    For Each cel In rg
        With cel.FormatConditions
            For i = 1 To .Count
                On Error Resume Next
                mau = .Item(i).Font.Color

               If Err.Number = 0 Then Dem = Dem + 1
                If Err.Number > 0 Then MsgBox Err.Description
                                '......
                On Error GoTo 0
            Next
        End With
    Next
    CountColor = Dem
End Function

Chân thành cám ơn!

Hổng hiểu mau = .Item(i).Font.Color là để làm giống gì? (bạn đâu có dùng nó)
Phải chăng bạn muốn đếm số lượng điều kiện trong CF?
-------------------
Ah... hiểu rồi! Là vầy chăng:
Mã:
Function CountColor(rg As Range) As Long
  Dim cel As Range, i As Long
  Dim Dem As Long, mau As Long
  Application.Volatile
  On Error Resume Next
  For Each cel In rg
    mau = 0
    With cel.FormatConditions
      For i = 1 To .Count
         mau = .Item(i).Font.Color
         If mau Then Dem = Dem + 1
         On Error GoTo 0
       Next
     End With
  Next
  CountColor = Dem
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hổng hiểu mau = .Item(i).Font.Color là để làm giống gì? (bạn đâu có dùng nó)
Phải chăng bạn muốn đếm số lượng điều kiện trong CF?
-------------------
Ah... hiểu rồi! Là vầy chăng:
Mã:
Function CountColor(rg As Range) As Long
  Dim cel As Range, i As Long
  Dim Dem As Long, mau As Long
  Application.Volatile
  On Error Resume Next
  For Each cel In rg
    mau = 0
    With cel.FormatConditions
      For i = 1 To .Count
         mau = .Item(i).Font.Color
         If mau Then Dem = Dem + 1
         On Error GoTo 0
       Next
     End With
  Next
  CountColor = Dem
End Function

Em dùng mau = .Item(i).Font.Color là để xem có lỗi gì phát sinh khi truy cập .Item(i).Font.Color không. Nếu không có lỗi phát sinh nghĩa là CF về Font Color không tồn tại. Về cơ bản hàm của em đã viết là như anh đã sửa nhưng em không hiểu sao khi chạy với ô C10 lại cho kết quả sai? Kết quả đúng phải là 1 nhưng cả 2 công thức điều trả về kết quả là 0. Khi dùng công thức này với ô C11 thì cho kết quả đúng? Anh thử Test cái công thức của anh trên cái file em đính kèm thì sẽ rõ hơn à. Giúp em lần này anh nhé!
Tiện đây cho em hỏi luôn, Application.Volatile có ý nghĩa là gì vậy anh?

Cám ơn anh nhiều!
 
Upvote 0
Em dùng mau = .Item(i).Font.Color là để xem có lỗi gì phát sinh khi truy cập .Item(i).Font.Color không. Nếu không có lỗi phát sinh nghĩa là CF về Font Color không tồn tại. Về cơ bản hàm của em đã viết là như anh đã sửa nhưng em không hiểu sao khi chạy với ô C10 lại cho kết quả sai? Kết quả đúng phải là 1 nhưng cả 2 công thức điều trả về kết quả là 0. Khi dùng công thức này với ô C11 thì cho kết quả đúng? Anh thử Test cái công thức của anh trên cái file em đính kèm thì sẽ rõ hơn à. Giúp em lần này anh nhé!
Tiện đây cho em hỏi luôn, Application.Volatile có ý nghĩa là gì vậy anh?

Cám ơn anh nhiều!

Thì tại C10 kết quả = 1 đấy thôi, tôi có thấy bị Zero như bạn nói đâu chứ
 
Upvote 0
Thì tại C10 kết quả = 1 đấy thôi, tôi có thấy bị Zero như bạn nói đâu chứ

Sao lạ vậy nhỉ? Em đã thử cả trên Excel 2007 Excel 2010 của 4 máy khác nhau trong văn phòng làm việc của em. Tất cả điều không được và cho kết quả như sau:
Nếu để nguyên Code của anh thì khi chạy kết quả là #VALUE!. Theo suy đoán của em là khi vừa lặp xong i = 1 đã là On Error GoTo 0 nên khi i=2, 3... sẽ không thực hiện được câu lệnh mau = .Item(i).Font.Color. Em đã di chuyển câu lệnh On Error GoTo 0 ra ngoài For ... Next thì kết quả vẫn là 0 cho ô C10.
Thật không thể tin được.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom