Tạo màu giống nhau cho Object và Cell (macro)

  • Thread starter Thread starter Ông Nam
  • Ngày gửi Ngày gửi
Liên hệ QC

Ông Nam

Thành viên mới
Tham gia
31/7/08
Bài viết
6
Được thích
0
Hiện tại tôi đang dùng macro để tạo màu cho Object (đã có dữ liệu nguồn về R,G,B). Tuy nhiên khi sử dụng dữ liệu RGB này cho cell thì màu tạo ra lại khác nhau. Làm thế nào để có macro tạo màu giống nhau cho Object và cell (tôi cần màu tạo từ cell hơn, vì rất khó để thao tác với Object).

Dưới đây là các đoạn code đang sử dụng:

Tạo màu cho Object

ActiveSheet.Shapes("Rectangle 15").Select
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(Range("ae51"), Range("ae52"), Range("ae53"))
Selection.ShapeRange.Fill.Transparency = 0#
Selection.ShapeRange.Line.Weight = 0.75
Selection.ShapeRange.Line.DashStyle = msoLineSolid
Selection.ShapeRange.Line.Style = msoLineSingle
Selection.ShapeRange.Line.Transparency = 0#
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)

Tạo màu cho cell

ActiveCell.Interior.Color = RGB(Range("ae51"), Range("ae52"), Range("ae53"))
 
Nếu tôi nhớ không lầm thì với cell ta không thể tùy biến màu nhiều như Object được (chỉ có 56 màu) ---> Chính vì thế mà màu cell không thể "bắt chước" y chang màu Object được
 
Upvote 0
Hiện tại tôi đang dùng macro để tạo màu cho Object (đã có dữ liệu nguồn về R,G,B). Tuy nhiên khi sử dụng dữ liệu RGB này cho cell thì màu tạo ra lại khác nhau. Làm thế nào để có macro tạo màu giống nhau cho Object và cell (tôi cần màu tạo từ cell hơn, vì rất khó để thao tác với Object).
Bạn dùng số (1-56) để chỉ định màu, câu lệnh đơn giản hơn. Ví dụ tô màu đỏ:
- ô B1: Range("B11").Interior.ColorIndex = 3
- Hình chữ nhật ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.SchemeColor = 10
Số màu của ColorIndexSchemeColor không giống nhau nên không thể lấy giá trị màu trực tiếp từ ô gán cho hình mà phải qua bước chuyển.

Hàm chuyển từ
ColorIndex của 1 ô sang SchemeColor
PHP:
Function ColorIdScheme(MyCell As Range)
ColorId = "01-53-52-51-49-11-55-56-09-46-12-10-14-05-47-16-03-45-43-50-42-41-13-48-07-44-06-04-08-33-54-15-38-40-36-35-34-37-39-02-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-"
ColorSc = "08-60-59-58-56-18-62-63-16-53-19-17-21-12-54-23-10-52-50-57-49-48-20-55-14-51-13-11-15-40-61-22-45-47-43-42-41-44-46-09-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-"
id = MyCell.Interior.ColorIndex
If id = "False" Then
  ColorIdScheme = "False"
Else
  ColorIdScheme = Mid(ColorSc, InStr(1, ColorId, Format(id, "00") & "-"), 2)
End If
End Function

Nếu kết quả là
False có nghĩa No Fill (không màu).
Ví dụ ô B1 màu đỏ, công thức ColorIdScheme(B1) cho kết quả 10
Câu lệnh ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.SchemeColor = 10 sẽ tô màu đỏ cho Rectangle 1

Thủ tục ColorId_SchemeColor tô màu Rectangle 1 giống như màu của ô B1
PHP:
Sub ColorId_SchemeColor()
Dim id  As Long
id = ColorIdScheme(Range("B1"))
If id = "False" Then  'No Fill
  ActiveSheet.Shapes("Rectangle 1").Fill.Visible = msoFalse
Else
  ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.SchemeColor = id
  ActiveSheet.Shapes("Rectangle 1").Fill.Visible = msoTrue
End If
End Sub
Bạn tự điều chỉnh các câu lệnh cho phù hợp với yêu cầu của bạn.


 
Lần chỉnh sửa cuối:
Upvote 0
Tách 3 thành phần Red, Green, Blue của giá trị màu RGB

Để tô màu, ta có thể dùng hàm RGB(Red, Green, Blue) với các đối số thay đổi từ 0-255. Dùng hàm này thì màu sắc phong phú hơn vì có rất nhiều màu.
Ví dụ đặt màu hồng cho ô A1 dùng lệnh Range("A1").Interior.Color = RGB(255, 100, 200)
Muốn lấy mã màu ô A1 vào biến nRGB dùng lệnh nRGB = Range("A1").Interior.Color, kết quả trả về nRGB=13408767
Số 13408767 được thành lập từ công thức nRGB=Red + Green* 256 + Blue * 256^2
Từ công thức này, ta có thể tách 3 thành phần màu của RGB. Thủ tục FillColor sẽ lấy màu của ô A1 gán cho hình chữ nhật Rectangle 1:
PHP:
Sub FillColor()
Dim nRGB As Long, Red As Long, Green As Long, Blue As Long
nRGB = Range("A1").Interior.Color
Red = nRGB Mod 256
Green = ((nRGB - Red) Mod 65536) / 256
Blue = (nRGB - Red - Green * 256) / 65536
ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.RGB = RGB(Red, Green, Blue)
 
Lần chỉnh sửa cuối:
Upvote 0
Xin hỏi Thầy Long:
PHP:
Function ColorIdScheme(MyCell As Range)
ColorId = "01-53-52-51-49-11-55-56-09-46-12-10-14-05-47-16-03-45-43-50-42-41-13-48-07-44-06-04-08-33-54-15-38-40-36-35-34-37-39-02-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-"
ColorSc = "08-60-59-58-56-18-62-63-16-53-19-17-21-12-54-23-10-52-50-57-49-48-20-55-14-51-13-11-15-40-61-22-45-47-43-42-41-44-46-09-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-"
id = MyCell.Interior.ColorIndex
.......
End Function

Vì sao không làm như sau:
PHP:
Function ColorIdScheme(MyCell As Range)
ColorIdScheme = MyCell.Interior.ColorIndex + 7
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Xin hỏi Thầy Long:
PHP:
Function ColorIdScheme(MyCell As Range)
ColorId = "01-53-52-51-49-11-55-56-09-46-12-10-14-05-47-16-03-45-43-50-42-41-13-48-07-44-06-04-08-33-54-15-38-40-36-35-34-37-39-02-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-"
ColorSc = "08-60-59-58-56-18-62-63-16-53-19-17-21-12-54-23-10-52-50-57-49-48-20-55-14-51-13-11-15-40-61-22-45-47-43-42-41-44-46-09-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-"
id = MyCell.Interior.ColorIndex
.......
End Function
Vì sao không làm như sau:
PHP:
Function ColorIdScheme(MyCell As Range)
ColorIdScheme = MyCell.Interior.ColorIndex + 7
End Function
Có thấy quy luật đâu mà viết như thế ? Đúng là đường thẳng không đi mà đi đường vòng !
Mà cũng đã mất cả buổi mới có được 2 dãy số đó.
Thank ptm0412.
 
Upvote 0
Rất cảm ơn anh Long đã giúp đỡ.

Về fill màu xuôi (tạm gọi như vậy): Từ giá trị màu của cell -> qui đổi ra giá trị màu thành phần -> phủ màu cho Object
Tôi thấy màu như vậy là hoàn toàn có thể chấp nhận được.

Về fill màu ngược: Từ giá trị màu thành phần của Object -> qui đổi ra giá trị màu cho cell -> phủ màu cho cell.
Tôi thấy màu khác nhau rất lớn (tuy vẫn có một số màu chấp nhận được)

Anh có thể xem lại trên file gửi kèm được không. Vì hiện tại tôi đang có data dữ liệu màu cho Object, tôi cần fill màu cho cell để có thể sử dụng cho các thao tác khác.
 

File đính kèm

Upvote 0
Rất cảm ơn anh Long đã giúp đỡ.

Về fill màu xuôi (tạm gọi như vậy): Từ giá trị màu của cell -> qui đổi ra giá trị màu thành phần -> phủ màu cho Object
Tôi thấy màu như vậy là hoàn toàn có thể chấp nhận được.

Về fill màu ngược: Từ giá trị màu thành phần của Object -> qui đổi ra giá trị màu cho cell -> phủ màu cho cell.
Tôi thấy màu khác nhau rất lớn (tuy vẫn có một số màu chấp nhận được)

Anh có thể xem lại trên file gửi kèm được không. Vì hiện tại tôi đang có data dữ liệu màu cho Object, tôi cần fill màu cho cell để có thể sử dụng cho các thao tác khác.
Như đã nói ở trên: Cell chỉ có 56 màu, làm sao bạn có thể lấy màu object gắn cho cell được chứ? Nhìn xem object có bao nhiêu màu? (bao la)
 
Upvote 0
Web KT

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

Back
Top Bottom