Có thể tô màu (ListView.ForeColor) cho từng hàng trong một ListView theo điều kiện ? (2 người xem)

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

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

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,212
Nghề nghiệp
Dạy đàn piano
Có thể tô màu (ListView.ForeColor) cho từng hàng trong một ListView theo điều kiện không?

Tôi có một cái ListView gồm có 5 cột (ColumnHeaders)
Trong đó, cột thứ 3 có tên là Type, trong cột Type này chỉ có 2 giá trị (loại): "Mua" hoặc "Bán"

Tôi muốn rằng hễ Type = "Mua" thì cả hàng tô màu đỏ (.ForeColor = 255)
Type = "Bán" thì cả hàng tô màu xanh (.ForeColor = 16711680)

Nhờ các bạn giúp với. Xin cảm ơn.
 
MrOKeBap có cho tôi đoạn code này để tô màu cho từng hàng theo kiểu cứ một hàng màu đen (0), một hàng màu đỏ (255), một hàng màu xanh (16711680):

Mã:
Public Sub TaoColorLV(LV As ListView)
    On Error Resume Next
    Dim iR As Integer, iC As Byte, iColor As Long
    SoCot = LV.ColumnHeaders.Count
    LV.ForeColor = 0
    For iR = 1 To LV.ListItems.Count
        Select Case iR Mod 3
            Case 1: iColor = 0
            Case 2: iColor = 16711680
            Case 0: iColor = 255
        End Select
        LV.ListItems.Item(iR).ForeColor = iColor
        For iC = 1 To SoCot - 1
            LV.ListItems.Item(iR).ListSubItems.Item(iC).ForeColor = iColor
        Next
    Next
End Sub
Đọc thì tôi hiểu. Nhưng bi giờ vận dụng để làm bài trên kia tôi nói, thì thấy khó quá...
 
MrOKeBap có cho tôi đoạn code này để tô màu cho từng hàng theo kiểu cứ một hàng màu đen (0), một hàng màu đỏ (255), một hàng màu xanh (16711680):

Mã:
Public Sub TaoColorLV(LV As ListView)
    On Error Resume Next
    Dim iR As Integer, iC As Byte, iColor As Long
    SoCot = LV.ColumnHeaders.Count
    LV.ForeColor = 0
    For iR = 1 To LV.ListItems.Count
        Select Case iR Mod 3
            Case 1: iColor = 0
            Case 2: iColor = 16711680
            Case 0: iColor = 255
        End Select
        LV.ListItems.Item(iR).ForeColor = iColor
        For iC = 1 To SoCot - 1
            LV.ListItems.Item(iR).ListSubItems.Item(iC).ForeColor = iColor
        Next
    Next
End Sub
Đọc thì tôi hiểu. Nhưng bi giờ vận dụng để làm bài trên kia tôi nói, thì thấy khó quá...

Đây là một dang Sub có tham số.
Giả sửa trong Form của bác có 1 Listview là LVabc
Khi đó chỉ cần code thế này :

PHP:
Call TaoColorLV(Me.LVabc)

Thế là OK bác ạ.

Em mượn File của thanhphong để bác xem lại nhé.
Bác chú ý Checkbox Color

Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Hì, OKeBap hiểu sai ý mình rồi.
Nếu để vận dụng cái code TaoColorLV để tô màu xen kẽ đen, đỏ, xanh.... thì mình đã làm được rồi. Làm y như bạn nói.

Nhưng ở đây, ý mình là Tô màu theo giá trị trong một cột nào đó. Mà cụ thể, trong ListView của mình có một cột Type, trong cột Type này chỉ có 2 giá trị (Mua, Bán). Ý mình là dò trong ListView, hễ hàng nào mà có Type là Mua, thì tô màu xanh, hàng nào mà có Type là Bán thì tô màu đỏ. Nghĩa là chỉ có 2 màu thôi, nhưng 2 màu này không phải tô xen kẽ như cái code trên kia, mà là tô theo giá trị của cột Type. Bạn hiểu chứ ?
 
Hì, OKeBap hiểu sai ý mình rồi.
Nếu để vận dụng cái code TaoColorLV để tô màu xen kẽ đen, đỏ, xanh.... thì mình đã làm được rồi. Làm y như bạn nói.

Nhưng ở đây, ý mình là Tô màu theo giá trị trong một cột nào đó. Mà cụ thể, trong ListView của mình có một cột Type, trong cột Type này chỉ có 2 giá trị (Mua, Bán). Ý mình là dò trong ListView, hễ hàng nào mà có Type là Mua, thì tô màu xanh, hàng nào mà có Type là Bán thì tô màu đỏ. Nghĩa là chỉ có 2 màu thôi, nhưng 2 màu này không phải tô xen kẽ như cái code trên kia, mà là tô theo giá trị của cột Type. Bạn hiểu chứ ?

Bác xem qua nhé :
PHP:
Public Sub TaoColorLVBebe(LV As ListView)
    On Error Resume Next
    Dim iR As Integer, iC As Byte, iColor As Long
    SoCot = LV.ColumnHeaders.Count
    LV.ForeColor = 0
    With LV.ListItems
        For iR = 1 To .Count ' Xet tung hang cua LV
            ' Neu cot 3 la mua
            If .Item(iR).ListSubItems.Item(2) = "Mua" Then
                iColor = 16711680
            Else ' Nguoc lai
                iColor = 255
            End If
            .Item(iR).ForeColor = iColor
        For iC = 1 To SoCot - 1 ' Xet tung cot
            .Item(iR).ListSubItems.Item(iC).ForeColor = iColor
        Next
        Next
    End With
End Sub

Sao mà lười đưa File VD lên thế bác.

Thân!
 
Cảm ơn OkBap nhiều. Hôm nay mới biết ListView.Item(iR).ListSubItems.Item(x) là cái khỉ gì.
Còn cái vụ file ví dụ, có đâu mà đưa lên? Vì đây mới chỉ là ý tưởng thôi mà...
 
Đọc bài của Bác Okebab. thử một ứng dụng nho nhỏ, thấy hay quá load lên để các bạn cùng xem.
P/S. Xin phép mượn file của bạn Sealand làm dữ liệu để làm ví dụ.
 

File đính kèm

Phải chi các Thầy làm được trong ListView từng Row xen kẻ với màu khác nhau (nền) chứ không phải text tô màu khác nhau thì quá hay! Mình tìm mãi vẫn chưa thấy ai làm được để mình học hỏi!
 
Đã vậy thì sao không thế này cho mỗi tỉnh 1 màu
PHP:
Public Sub TaoColorLVBebe(LV As ListView)
'Ham nay do Mr. Okebab cua GPE cung cap
    On Error Resume Next
    Dim iR As Integer, iC As Byte, iColor As Long
    SoCot = LV.ColumnHeaders.Count
    LV.ForeColor = 0
    With LV.ListItems
        For iR = 1 To .Count ' Xet tung hang cua LV
            ' Neu cot 3 la mua
            Select Case .Item(iR).ListSubItems.Item(2)
         Case Is = "Ha Noi"
         iColor = 255
         Case Is = "Hai Phong"
         iColor = 16711680
         Case Is = "Quang Ninh"
         iColor = 128
         Case Is = "Hai Duong"
         iColor = 32768
         Case Is = "Thai Binh"
         iColor = 16711935
         Case Else
          iColor = 26367
          End Select
            .Item(iR).ForeColor = iColor
        For iC = 1 To SoCot - 1 ' Xet tung cot
            .Item(iR).ListSubItems.Item(iC).ForeColor = iColor
        Next
        Next
    End With
End Sub
 
Phải chi các Thầy làm được trong ListView từng Row xen kẻ với màu khác nhau (nền) chứ không phải text tô màu khác nhau thì quá hay! Mình tìm mãi vẫn chưa thấy ai làm được để mình học hỏi!
Thì dùng Spreadsheet Control đi ---> Nó giống y chang 1 Worksheet vậy, có thể tô màu thoải mái
Code thí nghiệm:
PHP:
Private Sub UserForm_Initialize()
  Dim i As Long
  With Spreadsheet1.Range("A1").CurrentRegion
    For i = 1 To .Rows.Count
      If i Mod 2 = 0 Then .Rows(i).Interior.ColorIndex = 35
    Next
  End With
End Sub
Tóm lại: Với sheet ta tô màu thế nào thì Control này cũng vậy!
 

File đính kèm

Trích từ Sealand: "Đã vậy thì sao không thế này cho mỗi tỉnh 1 màu"
Mình là dân nghiệp dư. Nhờ chịu khó ghé thăm GPE nên võ vẽ được một tí. Cám ơn các bạn đã lập nên diễn đàn này.

Cái VBA của mình nó bị làm sao ấy. Khi chọn "Additional Control" trong Form Toolbox nó cứ đờ ra chả có ý kiến gì cả. Thấy cái Spreadsheet của Bác NDU hay quá mà không biết sử dụng thế nào. Mong được chỉ giáo thêm.
Trân trọng.
 
Trích từ Sealand: "Đã vậy thì sao không thế này cho mỗi tỉnh 1 màu"
Mình là dân nghiệp dư. Nhờ chịu khó ghé thăm GPE nên võ vẽ được một tí. Cám ơn các bạn đã lập nên diễn đàn này.

Cái VBA của mình nó bị làm sao ấy. Khi chọn "Additional Control" trong Form Toolbox nó cứ đờ ra chả có ý kiến gì cả. Thấy cái Spreadsheet của Bác NDU hay quá mà không biết sử dụng thế nào. Mong được chỉ giáo thêm.
Trân trọng.
Tức là Office của bạn bị lổi gì đó ---> Cho đến thời điểm này vẫn chưa có cách khắc phục đâu (trừ khi cài lại Windows)
Tạm thời có 1 cách giúp bạn dùng được Additional Control, xem tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=32295&p=216234
 
Theo chỉ dẫn của bạn NDU, mình đã làm được rồi. Hay quá. Cám ơn bạn rất nhiều nhiều nhiều. Chúc năm mới sức khoẻ và thêm nhiều bài học mới cho những tay không chuyên như mình.
Rất cảm ơn.
Trân trọng.
 
Thì dùng Spreadsheet Control đi ---> Nó giống y chang 1 Worksheet vậy, có thể tô màu thoải mái
Code thí nghiệm:
PHP:
Private Sub UserForm_Initialize()
  Dim i As Long
  With Spreadsheet1.Range("A1").CurrentRegion
    For i = 1 To .Rows.Count
      If i Mod 2 = 0 Then .Rows(i).Interior.ColorIndex = 35
    Next
  End With
End Sub
Tóm lại: Với sheet ta tô màu thế nào thì Control này cũng vậy!

Tức thật Thầy ơi, em mở file cứ báo lỗi "Could not load an object because it is not available on this machine", đã vào Tool > References... để bỏ chọn MISSING ... rồi nhưng vẫn báo lỗi trên. Không biết có cách nào để load lên không?
 
Kiểu này Minh Thien khổ rồi, MS của ta thường là dùng "chạc". Vọc hoài nó phát hiện ra là nó khoá hết các chức năng mở rộng chứ cái Object ấy là đương nhiên có trong Exc. Mình thi thoảng Reset lại chút cho nó lẹ bằng Gost cũng thấy hay.
 
Lần chỉnh sửa cuối:
Tức thật Thầy ơi, em mở file cứ báo lỗi "Could not load an object because it is not available on this machine", đã vào Tool > References... để bỏ chọn MISSING ... rồi nhưng vẫn báo lỗi trên. Không biết có cách nào để load lên không?
Có thể máy bạn thiếu thành phần: Microsoft Office Web Components chăng?
Vào đây download nhé:
http://www.microsoft.com/downloads/...2c-402e-4f72-97a5-e0fd290d4b76&displaylang=en
Bỏ chọn MISSING có nghĩa là bạn không muốn xài đến nó chứ đâu phải là cách giải quyết vấn đề
 
Web KT

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

Back
Top Bottom