2015-05-29 17 views
9

Tôi đã nhìn thấy nhiều người dùng đặt câu hỏi cố gắng thay đổi màu của ô bằng cách sử dụng chức năng do người dùng định nghĩa. Tôi đã luôn luôn ấn tượng rằng nó không thể làm như vậy. Sự hiểu biết của tôi là một hàm do người dùng định nghĩa không thể thay đổi bất kỳ thuộc tính nào của một ô ngoại trừ giá trị của ô chứa công thức. Subs là những gì thay đổi các tế bào mình.Chức năng do người dùng định nghĩa để thay đổi màu của ô

Tuy nhiên, khi chơi xung quanh với một số mã để kiểm tra điều này, tôi thấy rằng nó không phải luôn luôn như vậy.
Sử dụng mã đơn giản:

Function ColorCell(rng As Range) 
If rng.Value = 1 Then 
    ColorCell = False 
Else 
    ColorCell = True 
    rng.Interior.ColorIndex = 3 
End If 
End Function 

Nếu tôi nhập vào chức năng vào phòng giam, tôi đạt được kết quả mong đợi, không có tế bào thay đổi màu sắc. Tuy nhiên, nếu tôi sử dụng nút Công thức> Chèn hàm và điều hướng đến công thức của tôi để chèn công thức theo cách này, nó làm tô màu các ô được nhắm mục tiêu.
Cell Color Function

Làm thế nào điều này có thể và tại sao chức năng hoạt động khác khi được nhập theo các cách khác nhau?

EDIT: này đã được thử nghiệm sử dụng Excel 2007

+0

Tôi không biết câu trả lời cho điều này, nhưng lưu ý rằng nếu bạn thay đổi giá trị ô, nó sẽ không thay đổi màu ngay cả trong trường hợp đáy. Vì vậy, nếu bạn thay đổi ô A11 thành 1 ô vẫn còn màu đỏ. – OpiesDad

+0

Đúng, không có bản cập nhật nào của chính hàm đó. Ngoại trừ nếu bạn quay trở lại và sử dụng lại "Insert Function", nó * sẽ * cập nhật giá trị/màu sắc. – TMH8885

+3

'Tôi thấy rằng nó không phải luôn luôn như vậy.' Đúng :) Bạn đã thấy [This] (http://stackoverflow.com/questions/23433096/using-a-udf-in-excel-to-update-the- worksheet) –

Trả lời

2

sử dụng mã này ... chỉ cần thay tên sheet và thử

Sheets("sheet_name").range(j:j).clear 

for j=2 to 15 
if Sheets("sheet_name").Cells(j, 1).value=1 then 

else 

Sheets("sheet_name").Cells(j, 1).Interior.ColorIndex = 3 
next j 
0

tôi sử dụng Worksheet_Change kiện để phát hiện sự thay đổi giá trị trong phạm vi làm việc. Ví dụ: Tôi muốn làm điều gì đó khi phạm vi A1: A5 đã thay đổi. Tôi sử dụng sự kiện bên dưới.

Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range(<Your working range>)) Is Nothing Then 'Define range that you want to do 
     'Statement here 
     ... 

    End If 
End Sub 

Khi giá trị phạm vi thay đổi. Nó sẽ thực thi mã của bạn.

Và cách khác. Sử dụng định dạng có điều kiện.

0

Như chúng ta đều biết sớm hay muộn, trong các chức năng của người dùng, bạn không thể truy cập các đăng ký thay đổi trực tiếp mọi thứ trong bảng tính của mình.

Nhưng thử điều này:

Dim ColorMeTarget As Range, ColorMeVal As Long 

Public Function ColorMe(ByVal TargetRange As Range, ByVal ColVal As Long) 
    Set ColorMeTarget = TargetRange 
    ColorMeVal = ColVal 
    ColorMe = ColVal 
End Function 

Public Sub ColorMeSub() 
    Application.OnTime Now + TimeValue("00:00:05"), "ColorMeSub" 
    If ColorMeTarget.Interior.Color <> ColorMeVal Then ColorMeTarget.Interior.Color = ColorMeVal 
End Sub 

Nếu bạn chạy các phụ đầu tiên, nó sẽ liên tục quét các biến tĩnh ColorMeTarget và ColorMeVal để xem nếu có sự thay đổi. Chức năng ColorMe sẽ thiết lập các giá trị này. Một số mã bổ sung là cần thiết trong trường hợp ColorMeTarget chưa được khởi tạo.

Nếu bạn thông minh hơn, trước tiên bạn có thể có chức năng kiểm tra xem liệu có thực sự là một thay đổi và thêm các yêu cầu tô màu mới vào ngăn xếp hay không. Tiểu ban tái phát của bạn có thể 'bắt kịp', đặc biệt nếu bạn có nhiều chức năng như thế này.

Bạn thậm chí có thể có tất cả các loại điều khiển bổ sung được thêm vào chức năng/macro của bạn - EVEN STUFF KHÔNG ĐƯỢC BAO GỒM THEO CÁC PHIÊN BẢN MỚI NHẤT CỦA 'ĐỊNH DẠNG ĐIỀU KIỆN' !!! YAY !!!!

Điều gì đó cần thử: Trong một số macro tự động của tôi, tôi có thể đặt OnTime thông qua một hàm nhưng không thể làm cho nó hoạt động ở đây. Nó sẽ được sạch hơn để có chức năng thiết lập các OnTime và không có một phụ reoccuring cần khởi tạo.

0

cũng có thể thử phương pháp phi kịch bản của tự động tô màu một tế bào dựa trên tình trạng của tế bào (aka Conditional Formatting):

highlight desired range & click "conditional formatting from the toolbar

use either an established rule or make a new rule

note options on rule types; I selected one to simply format the range based on cell contents. You can format based on a formula as well. Set the conditions to test ... in this case I said the condition is when a cell value is more than 5. Then click on format and set the desire format whether it be a font change or shading of the cell, etc. Here I selected to shade the cell a color of green when above 5 Here is the result. You can delete the contents of the cells without deleting the conditional formatting set for the cells.

Các vấn đề liên quan