Cách Lấy Màu Nền (cell Color) Trong Excel: Hướng Dẫn Chi Tiết Và Thực Hành

Mục lục bài viết

Mở Đầu: Tại Sao Việc Lấy Màu Nền Ô Trong Excel lại Quan Trọng?

Trong công việc hàng ngày, Excel không chỉ là công cụ tính toán mà còn là “bảng vẽ” giúp chúng ta thể hiện dữ liệu một cách trực quan. Một trong những cách phổ biến nhất để làm cho dữ liệu nổi bật là đánh màu nền các ô (cell color). Tuy nhiên, khi chúng ta cần đánh giá, lọc, hoặc thực hiện các phép tính dựa trên màu nền, Excel không cung cấp một hàm tích hợp sẵn để lấy màu của ô. Điều này tạo ra một nhu cầu thực tế: làm sao để “đọc” màu nền của ô trong Excel?

Bài viết này sẽ cung cấp cho bạn một hướng dẫn toàn diện, chi tiết và thực hành, giúp bạn:

  1. Hiểu rõ các cách tiếp cận khác nhau (VBA, hàm tùy chỉnh, Power Query, Power Automate, và các add‑in).
  2. Tạo hàm VBA GetCellColor để trả về mã màu (RGB hoặc Hex) hoặc chỉ số màu (ColorIndex).
  3. Sử dụng hàm này trong công thức, Conditional Formatting, PivotTable, và lọc dữ liệu.
  4. Xây dựng các ví dụ thực tế: đếm số ô có màu xanh, tính tổng giá trị theo màu, và tự động thay đổi màu dựa trên giá trị.
  5. Giải quyết các vấn đề thường gặp (ô có màu được áp dụng qua Conditional Formatting, màu trong Table, màu nền được gán bằng Themes, v.v.).
  6. Đưa ra các giải pháp không dùng VBA (Power Query, Power Automate, và các add‑in miễn phí).

Sau khi đọc xong, bạn sẽ có bộ công cụ đầy đủ để “đọc” và “xử lý” màu nền ô trong Excel một cách hiệu quả, đồng thời tránh những lỗi phổ biến mà người dùng thường gặp.

1. Tổng Quan Về Các Phương Pháp Lấy Màu Ô

Phương phápƯu điểmNhược điểmKhi nào nên dùng
VBA (User Defined Function – UDF)Linh hoạt, trả về giá trị số, dễ tích hợp vào công thứcCần bật macro, không hoạt động trên Excel OnlineKhi cần tính toán trực tiếp trong ô, hoặc tạo báo cáo phức tạp
Power QueryKhông cần macro, hoạt động trên Excel Desktop & OnlineKhông trả về màu trực tiếp, phải chuyển đổi qua bảng màuKhi xử lý dữ liệu lớn, cần ETL trước khi phân tích
Power Automate (Flow)Tự động hoá quy trình, không cần VBACần tài khoản Power Automate, độ trễ caoKhi muốn tự động cập nhật báo cáo trên cloud
Add‑in (Kutools, ASAP Utilities, etc.)Giao diện người dùng, không cần viết codeCó phí, không luôn tương thíchKhi muốn giải pháp “cầm tay” nhanh chóng
Conditional Formatting + Helper ColumnKhông dùng code, dễ bảo trìGiới hạn trong việc “đọc” màu do CF không tạo giá trịKhi chỉ cần hiển thị màu, không cần tính toán sâu

Trong phần tiếp theo, chúng ta sẽ đi sâu vào phương pháp VBA, vì đây là cách phổ biến nhất và cho phép lấy màu một cách chính xác nhất.

2. Tạo Hàm VBA GetCellColor

2.1. Mở Trình Soạn Thảo VBA

  1. Mở Excel và nhấn Alt + F11 để mở Visual Basic for Applications (VBA).
  2. Trong Project Explorer, chuột phải vào VBAProject (TênFile.xlsx) → Insert → Module.
  3. Đặt tên module (ví dụ: modCellColor).

2.2. Định Nghĩa Hàm Cơ Bản

' Trả về ColorIndex (1‑56) của ô
Public Function GetCellColorIndex(rng As Range) As Long If rng Is Nothing Then GetCellColorIndex = -1 Else GetCellColorIndex = rng.Interior.ColorIndex End If
End Function
  • ColorIndex là chỉ số màu trong bảng màu mặc định của Excel (1‑56). Nếu ô không có màu, giá trị trả về là -4142 (xlColorIndexNone).

2.3. Trả Về Mã Màu RGB

' Trả về mã màu RGB dưới dạng Long (ví dụ: 255 = &HFF)
Public Function GetCellColorRGB(rng As Range) As Long If rng Is Nothing Then GetCellColorRGB = -1 Else GetCellColorRGB = rng.Interior.Color End If
End Function
  • Mã màu RGB được lưu dưới dạng Long (0‑16777215). Để hiển thị dưới dạng Hex, có thể dùng công thức Excel: =DEC2HEX(GetCellColorRGB(A1),6).

2.4. Hàm Trả Về Mã Hex (Chuỗi)

' Trả về mã màu Hex #RRGGBB
Public Function GetCellColorHex(rng As Range) As String Dim rgb As Long If rng Is Nothing Then GetCellColorHex = "" Else rgb = rng.Interior.Color GetCellColorHex = "#" & Right("0" & Hex((rgb And &HFF0000) \ &H10000), 2) _ & Right("0" & Hex((rgb And &HFF00) \ &H100), 2) _ & Right("0" & Hex(rgb And &HFF), 2) End If
End Function

2.5. Xử Lý Conditional Formatting

VBA Interior.Color không phản ánh màu được áp dụng qua Conditional Formatting (CF). Để lấy màu CF, chúng ta cần:

Public Function GetCellColorFromCF(rng As Range) As Long Dim fmt As FormatCondition Dim col As Long col = -1 ' Mặc định không có màu On Error Resume Next For Each fmt In rng.FormatConditions If fmt.Type = xlCellValue Or fmt.Type = xlExpression Then If fmt.Interior.Pattern <> xlNone Then col = fmt.Interior.Color Exit For End If End If Next fmt On Error GoTo 0 GetCellColorFromCF = col
End Function

Lưu ý: Hàm trên chỉ trả về màu của điều kiện đầu tiên thỏa mãn. Nếu có nhiều điều kiện, bạn cần logic phức tạp hơn.

2.6. Lưu và Kích Hoạt Macro

  1. Chọn File → Save As → Định dạng Excel Macro‑Enabled Workbook (.xlsm).
  2. Khi mở lại, Enable Content để cho phép macro chạy.

3. Sử Dụng Hàm VBA Trong Công Thức Excel

3.1. Đếm Số Ô Có Màu Xác Định

Giả sử chúng ta muốn đếm số ô màu đỏ (RGB = 255,0,0) trong phạm vi A1:A100.

=COUNTIF(A1:A100, "=GetCellColorRGB(A1)")

Thực tế, hàm COUNTIF không chấp nhận hàm UDF trong điều kiện. Thay vào đó, dùng SUMPRODUCT:

=SUMPRODUCT(--(GetCellColorRGB(A1:A100)=255))
  • GetCellColorRGB(A1:A100) trả về một mảng các giá trị màu; -- chuyển TRUE/FALSE thành 1/0.

3.2. Tổng Giá Trị Theo Màu

Nếu cột B chứa giá trị số và cột A chứa màu, tổng giá trị các ô màu xanh lá (RGB = 65280) :

=SUMPRODUCT((GetCellColorRGB(A1:A100)=65280)B1:B100)

3.3. Tạo Cột Trợ Giúp Đánh Dấu Màu

Trong cột C, nhập công thức:

=GetCellColorHex(A2)

Kéo công thức xuống. Bạn sẽ có một cột hiển thị mã Hex, ví dụ #00FF00. Điều này giúp filter dữ liệu bằng cách lọc theo giá trị text.

3.4. Kết Hợp Với Conditional Formatting

Bạn có thể dùng hàm GetCellColorHex để đánh dấu lại các ô có màu không mong muốn:

  1. Chọn phạm vi cần áp dụng.
  2. Vào Home → Conditional Formatting → New Rule → Use a formula to determine which cells to format.
  3. Nhập công thức (giả sử ô A2 là ô bắt đầu):

excel =GetCellColorHex(A2)="#FF0000"

  1. Chọn định dạng (ví dụ: tô nền màu vàng) → OK.

Khi màu nền của ô A2 là đỏ, ô sẽ hiển thị nền vàng, giúp người dùng nhận diện nhanh.

4. Các Ứng Dụng Thực Tế

4.1. Báo Cáo KPI Với Màu Nhãn

Trong một bảng KPI, các chỉ tiêu vượt mục tiêu được tô xanh lá, dưới mục tiêu đỏ, và đạt mục tiêu vàng. Để tính tổng số chỉ tiêu “vượt mục tiêu”:

=SUMPRODUCT(--(GetCellColorRGB(B2:B200)=65280)) ' 65280 = màu xanh lá (RGB 0,255,0)

Bạn có thể đặt công thức này trong một ô tổng kết, tự động cập nhật khi người dùng thay đổi màu.

4.2. Đếm Số Đơn Hàng Được Xác Nhận (Màu Xanh) Trong Danh Sách

Excel Get Color Of Cell
Excel Get Color Of Cell

Giả sử cột D chứa trạng thái màu (xác nhận = xanh, chưa xác nhận = không màu). Đếm số đơn hàng đã xác nhận:

=COUNTIF(D2:D500, "=GetCellColorIndex(D2)")

Thực tế lại dùng:

=SUMPRODUCT(--(GetCellColorIndex(D2:D500)=4)) ' 4 thường là màu xanh trong ColorIndex

4.3. Tự Động Gán Màu Dựa Trên Giá Trị (Không Dùng Conditional Formatting)

Bạn có thể viết một macro Worksheet_Change để gán màu nền khi giá trị thay đổi:

Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Set rng = Intersect(Target, Me.Range("E:E")) ' Giả sử cột E là cột giá trị If rng Is Nothing Then Exit Sub Application.EnableEvents = False Dim cell As Range For Each cell In rng Select Case cell.Value Case Is > 1000: cell.Interior.Color = RGB(0, 255, 0) ' Xanh Case Is < 0: cell.Interior.Color = RGB(255, 0, 0) ' Đỏ Case Else: cell.Interior.Color = RGB(255, 255, 0) ' Vàng End Select Next cell Application.EnableEvents = True
End Sub

Khi người dùng nhập hoặc chỉnh sửa giá trị trong cột E, màu nền sẽ tự động thay đổi mà không cần Conditional Formatting.

5. Giải Quyết Các Vấn Đề Thường Gặp

5.1. Ô Được Đánh Màu Bằng Theme (Màu Chủ Đề)

Khi người dùng chọn Home → Fill Color → Theme Colors, Excel lưu màu dưới dạng ThemeColor + TintAndShade. Hàm Interior.Color sẽ trả về giá trị RGB đã được tính toán, vì vậy không có vấn đề. Tuy nhiên, nếu bạn muốn so sánh với màu Theme gốc, cần:

Public Function IsSameThemeColor(rng As Range, themeColor As XlThemeColor, tint As Double) As Boolean Dim c As Long c = rng.Interior.ThemeColor If c = themeColor Then IsSameThemeColor = Abs(rng.Interior.TintAndShade - tint) < 0.001 Else IsSameThemeColor = False End If
End Function

5.2. Màu Được Áp Dụng Qua Table Styles

Khi sử dụng Table (Ctrl+T), màu nền có thể được định nghĩa trong Table Style. Để lấy màu, cần truy cập ListObject:

Public Function GetTableCellColor(lo As ListObject, rowIdx As Long, colIdx As Long) As Long Dim rng As Range Set rng = lo.DataBodyRange.Cells(rowIdx, colIdx) GetTableCellColor = rng.Interior.Color
End Function

5.3. Đọc Màu Khi Workbook Được Mở Trên Excel Online

Excel Online không hỗ trợ VBA. Vì vậy, các giải pháp không dùng macro là:

  • Power Query: Sử dụng Excel.CurrentWorkbook() để lấy dữ liệu, sau đó dùng Table.TransformColumns để trích xuất Color nếu dữ liệu được lưu dưới dạng table style (không luôn khả thi).
  • Power Automate: Tạo flow “When a row is modified” → “Get a row” → “Condition” dựa trên format (được trả về trong API Graph). Tuy nhiên, độ trễ và chi phí có thể cao.

5.4. Khi Ô Không Có Màu (ColorIndex = xlColorIndexNone)

Trong các hàm trên, nếu ô không có màu, ColorIndex trả về -4142. Bạn có thể chuẩn hoá:

Public Function GetCellColorIndexSafe(rng As Range) As Long Dim idx As Long idx = rng.Interior.ColorIndex If idx = xlColorIndexNone Then GetCellColorIndexSafe = 0 ' 0 đại diện cho “không màu” Else GetCellColorIndexSafe = idx End If
End Function

6. Phương Pháp Không Dùng VBA

6.1. Sử Dụng Power Query Để Ghi Nhận Màu

  1. Chọn dữ liệu → Data → From Table/Range.
  2. Trong Power Query Editor, Add Column → Custom Column.
  3. Nhập công thức:

m = Table.AddColumn(#"PreviousStep", "Color", each Record.FieldValues(Column1{0}){0}Color)

(Lưu ý: Power Query không cung cấp trực tiếp thuộc tính màu; phải xuất dữ liệu sang CSV hoặc sử dụng Office Scripts.)

6.2. Office Scripts (Excel trên Web)

Office Scripts cho phép viết TypeScript để thao tác workbook. Ví dụ:

function main(workbook: ExcelScript.Workbook) { let sheet = workbook.getWorksheet("Sheet1"); let range = sheet.getRange("A2:A100"); let colors = range.getFormat().getFill().getColor(); // trả về Hex // Ghi màu vào cột B for (let i = 0; i < colors.length; i++) { sheet.getRange(`B${i+2}`).setValue(colorsi); }
}
  • Đặt script này trong Automate → New Script, chạy để lấy màu và ghi vào cột phụ.

6.3. Add‑In Miễn Phí: “Color Picker” hoặc “XLTools”

Một số add‑in miễn phí cung cấp chức năng Get Cell Color mà không cần viết code. Cài đặt từ Insert → Add‑ins → Store, tìm “Color Picker”. Sau khi cài, bạn có thể:

  • Chọn ô → Nhấn nút add‑in → Nhận mã màu hiển thị trong thanh công cụ.
  • Sử dụng tính năng “Copy color to clipboard” và dán vào công thức =HEX2DEC("FF0000").

7. Tối Ưu Hóa Hiệu Suất Khi Xử Lý Hàng Ngàn Ô

Khi áp dụng hàm VBA trên một phạm vi lớn (hàng ngàn ô), hiệu suất có thể chậm. Một số mẹo:

  1. Tính toán mảng trong một lần gọi: Đảm bảo hàm được viết để nhận mảng và trả về mảng, tránh lặp lại gọi hàm cho từng ô.
  2. Tắt tính toán tự động trong macro:

vba Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '... thực hiện Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True

  1. Sử dụng Dictionary để lưu trữ màu đã tính toán, tránh lặp lại tính toán cho cùng một màu.
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
If Not dict.Exists(rng.Address) Then dict(rng.Address) = rng.Interior.Color
End If
GetCellColorRGB = dict(rng.Address)
  1. Kết hợp với Worksheet_Change: Khi chỉ có một số ô thay đổi màu, cập nhật chỉ những ô đó thay vì toàn bộ bảng.

8. Tổng Kết và Những Bước Tiếp Theo

8.1. Điểm Mấu Chốt

  • Excel không có hàm tích hợp để lấy màu nền ô; VBA là giải pháp nhanh nhất.
  • Hàm GetCellColorRGB, GetCellColorHex, và GetCellColorIndex cho phép bạn truy xuất màu dưới các dạng khác nhau, phù hợp với việc đếm, tổng hợp, lọc.
  • Khi màu được áp dụng qua Conditional Formatting, cần một hàm phụ để đọc điều kiện.
  • Đối với môi trường Không VBA (Excel Online), hãy cân nhắc Office Scripts, Power Automate, hoặc add‑in.
  • Hiệu suất có thể tối ưu bằng tính toán mảng, tắt tính toán tự động, và caching.

8.2. Hành Động Ngay Bây Giờ

  1. Mở file .xlsm, chèn module và dán các hàm VBA ở trên.
  2. Thử nghiệm: trong một cột, nhập =GetCellColorHex(A2) và xem kết quả.
  3. Áp dụng: dùng SUMPRODUCT để tính tổng theo màu, hoặc tạo báo cáo KPI.
  4. Nếu cần: triển khai Office Scripts để đồng bộ màu lên cloud.

8.3. Nguồn Tài Nguyên Tham Khảo

  • Microsoft Docs – VBA Range.Interior.Color và ColorIndex.
  • Office Scripts Documentation – Range.getFormat().getFill().getColor().
  • Power Automate – “Excel Online (Business)” connector.
  • Add‑ins: Kutools for Excel, ASAP Utilities (phiên bản trial).

9. Câu Hỏi Thường Gặp (FAQ)

Câu hỏiTrả lời
Tôi có thể dùng hàm này trong Google Sheets?Google Sheets không hỗ trợ VBA; bạn cần dùng Apps Script (getBackground()), nhưng cú pháp và cách trả về màu khác.
Màu được áp dụng qua Conditional Formatting có được hàm GetCellColorRGB trả về không?Không. Cần dùng hàm GetCellColorFromCF hoặc đọc điều kiện CF riêng.
Làm sao để so sánh màu khi workbook có Theme khác?So sánh ThemeColor và TintAndShade thay vì Color.
Có cách nào để lấy màu của ô trong một workbook được mở trên Mac?VBA hoạt động trên Mac Excel (Office 365) nhưng không hỗ trợ một số thuộc tính UI; hàm Interior.Color vẫn hoạt động.
Nếu tôi muốn lấy màu của ô trong file .csv đã mở, có cách nào không?CSV không lưu màu; cần lưu dưới dạng .xlsx hoặc .xlsm để bảo toàn định dạng.

10. Kết Luận

Việc lấy màu nền của ô trong Excel không phải là một nhiệm vụ “đơn giản” nhưng lại cực kỳ hữu ích trong nhiều kịch bản thực tế: đánh giá KPI, báo cáo màu sắc, tự động hoá quy trình, và tạo dashboard tương tác. Nhờ vào VBA, bạn có thể tạo ra các hàm tùy chỉnh mạnh mẽ, tích hợp liền mạch vào công thức và báo cáo. Khi làm việc trong môi trường không hỗ trợ macro, Office Scripts, Power Automate, và các add‑in là những lựa chọn thay thế đáng cân nhắc.

Hy vọng bài viết đã cung cấp cho bạn công cụ toàn diện để “đọc” và “xử lý” màu nền ô trong Excel một cách hiệu quả và chuyên nghiệp. Hãy thử áp dụng ngay vào dự án của mình và chia sẻ kết quả với đồng nghiệp! Nếu có bất kỳ thắc mắc nào, đừng ngần ngại để lại bình luận – cộng đồng Excel luôn sẵn sàng hỗ trợ.

Chúc bạn thành công!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận