Excel中如何根据其他单元格的字体颜色设置目标单元格值
按字体颜色匹配取值实现方案
原有自定义函数问题
你最初编写的判定函数存在两个核心问题,会导致判断失效:
- 混用了
ColorIndex和RGB长整型颜色值:Font.ColorIndex是工作簿内置调色板的序号(仅0-56),和Font.Color返回的RGB标准长整型值不是同一套体系,直接传入颜色值对比会出错 - 未标记易失性:修改字体颜色属于格式操作,默认不会触发非易失性函数重算,结果不会自动更新
具体实现步骤
1. 修正颜色判定自定义函数
按Alt+F11打开VBA编辑器,插入标准模块,写入以下通用判定函数:
Function IsFontColor(targetRng As Range, expectedColor As Long) As Boolean ' 标记为易失性函数,工作表重算时自动更新判定结果 Application.Volatile True ' 直接对比Font.Color的RGB值,避免ColorIndex的调色板兼容问题 IsFontColor = (targetRng.Font.Color = expectedColor) End Function
如果你用的绿色是Excel默认主题深绿,对应RGB值为
RGB(0,128,0);如果是亮绿色对应RGB(0,255,0),如果判断不准,可以选中已设置好绿色字体的单元格,在VBA立即窗口执行? Selection.Font.Color拿到准确颜色值。
2. 配置自动重算(可选)
修改字体颜色默认不会触发工作表重算,如果需要改完颜色自动刷新结果,可以在对应功能工作表的代码模块中写入以下事件:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 选区变化时自动重算当前工作表,改完颜色点其他单元格即可刷新结果 Me.Calculate End Sub
如果不需要自动刷新,每次改完字体颜色手动按F9即可触发全表重算。
3. 写入取值公式
假设三列数值分别在A、B、C列,结果需要输出到D列,从第2行开始(第1行为表头),在D2单元格输入以下公式后下拉填充即可:
=IF(IsFontColor(A2,RGB(0,128,0)),A2,IF(IsFontColor(B2,RGB(0,128,0)),B2,C2))
公式逻辑为按顺序判定三列单元格字体是否为绿色,匹配到后直接返回对应单元格的数值。
参考效果如下:
注意事项
- 不要使用
Font.ColorIndex做颜色判定,不同工作簿调色板配置不同时,同个索引可能对应完全不同的颜色,会导致判断逻辑失效 - 如果三列中可能出现多个绿色字体的单元格,可以根据业务需求调整公式的优先级,当前公式默认按从左到右的优先级返回第一个匹配到的绿色单元格值
- 自定义函数仅能在保存为
.xlsm格式的启用宏工作簿中正常运行
内容的提问来源于stack exchange,提问作者Satanas
相关产品推荐
相关产品推荐

