【问题标题】:Change Application.Caller Fill Color更改 Application.Caller 填充颜色
【发布时间】:2021-12-24 06:46:45
【问题描述】:

我正在尝试让我的函数更改调用该函数的单元格的单元格颜色。我在this question 上找到了一些好的建议,但我遇到了#VALUE!以下代码出错(函数的其余部分按预期工作,省略此代码)。

main函数内部:

Dim checkCounter As Long

checkCounter = 0

当某些 if 语句被执行时,checkCounter = checkCounter + 1.

也在主函数内部:

If checkCounter <> 0 Then

    With Application.Caller
        .Parent.Evaluate "Changeit(" & .Address(False, False) & ")"
    End With

'Else (would like to get this working as well)

    With Application.Caller
        .Parent.Evaluate "Clearit(" & .Address(False, False) & ")"
    End With'

End If

ChangeIt 子:

Sub ChangeIt(cl as Range)
    cl.Interior.ColorIndex = 22
   'cl.Font.ColorIndex = 9 (would like this to function as well)'
End Sub

(潜在的)ClearIt Sub:

'Sub ClearIt(cl as Range)
    cl.Interior.ColorIndex = 0
    cl.Font.ColorIndex = 1
End Sub'

如果我编辑先例单元格(用于函数参数),将应用填充颜色,但 #VALUE!错误仍然存​​在。有什么办法解决这个问题?

附带问题:当子是 ClearIt 时,为什么/应该 .Parent.Evaluate "Clearit(" &amp; .Address(False, False) &amp; ")" 与 Clearit 一起工作?

【问题讨论】:

  • 如果您的主函数返回#VALUE,那么发布该函数的完整代码(或重现问题的最小函数)会很有用。对于最后一个问题 - VBA 不区分大小写。
  • 字体颜色仅供参考 - 我认为这是您可以直接从 UDF 执行的一件事。

标签: excel vba valueerror


【解决方案1】:

本质上,您的代码中的变色元素应该可以工作。所以我怀疑#VALUE 不是因为这个。尽管如此,这是一个经过测试且有效的示例,说明您正在尝试执行的操作。
它也是颜色设置元素的一种更完整(并且有些替代)的方法。
它支持使用更广泛的颜色“突出显示”,以及将颜色恢复为默认值(如果条件随后需要):

''' Note: Change as appropriate to suite your fuller function
Public Function TestColorSetting(Optional Value = 0)

    Dim checkCounter%, lgIntColor&, lgFontColor&
    
''' Set any color you want for interior and font (not limited by the color index pallet)
''' Note: To get a color value, 'Record Macro' yourself setting colors via the 'More Colors...' option
    lgIntColor = 16764006
    lgFontColor = -16763956
    
''' For testing, I've set checkCounter to value passed (or zero by default)
''' Obviously: Your 'other' code will do this.
    checkCounter = Value

''' Run either HighlightColors or DefaultColors (based on checkCounter)
    With Application.Caller
        If checkCounter <> 0 Then
            .Parent.Evaluate "HighlightColors(" & .Address(False, False) & "," & lgIntColor & "," & lgFontColor & ")"
        Else: .Parent.Evaluate "DefaultColors(" & .Address(False, False) & ")"
        End If
    End With

End Function

''' Sub to set highlight colors
Sub HighlightColors(Target As Range, IntColor&, FontColor&)
    With Target
        .Interior.Color = IntColor
        .Font.Color = FontColor
    End With
End Sub

''' Sub to set default colors
Sub DefaultColors(Target As Range)
    With Target
        .Interior.Pattern = xlNone
        .Font.ColorIndex = xlAutomatic
    End With
End Sub

分别:
要考虑的另一件事(如果您还没有)是使用条件格式。
这都是专门为这类事情设计的,而且条件看起来相对简单,可能更合适?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多