【问题标题】:Range.Offset is turned into a DoubleRange.Offset 变成了 Double
【发布时间】:2020-05-15 11:15:14
【问题描述】:

我有一个 Range 对象的奇怪行为:不知何故它变成了 Double。

这是我的代码:

Sub Test()

    Dim RRange As Range
    Set RRange = ThisWorkbook.Worksheets("Sheet1").Range("R4")
    Set RRange = RRange.Offset(0, -1)
    UpdateConditionalFormatting (RRange)
    UpdateConditionalFormatting (ThisWorkbook.Worksheets("Sheet1").Range("R4"))

End Sub

所以第一次调用 UpdateConditionalFormatting 会使程序崩溃(需要对象),第二次调用会起作用。 sub 需要 Range 对象

我不知道这里出了什么问题:(

Sub UpdateConditionalFormatting(ByVal rng As Range)

    With rng.FormatConditions.AddColorScale(ColorScaleType:=3)
     .SetFirstPriority
    .ColorScaleCriteria(1).Type = xlConditionValueLowestValue
    .ColorScaleCriteria(1).FormatColor.Color = 8109667
    .ColorScaleCriteria(2).Type = xlConditionValuePercentile
    .ColorScaleCriteria(2).Value = 50
    .ColorScaleCriteria(2).FormatColor.Color = 8711167
    .ColorScaleCriteria(3).Type = xlConditionValueHighestValue
    .ColorScaleCriteria(3).FormatColor.Color = 7039480

End With
End Sub

【问题讨论】:

    标签: vba offset


    【解决方案1】:

    去掉括号,使用

    UpdateConditionalFormatting RRange
    

    而不是

    UpdateConditionalFormatting (RRange)
    

    或者使用Call语法:

    Call UpdateConditionalFormatting(RRange)
    

    注意:另外,您的第二个电话提供了不同的 Range,因为您没有 Offset 它 - 这不会导致您遇到错误,但我只是想我会突出显示它。

    【讨论】:

    • 我认为发生这种情况的原因是,如果您只将一个参数传递给例程,括号是评估表达式的简写。因为无法评估 RRange,所以它会引发错误。 ThisWorkbook.Worksheets("Sheet1").Range("R4") 表达式可以被评估为 Range 对象,因此可以通过。
    • 实际上括号从ByRef转换为ByVal。查看有关括号作用的完整说明here
    • 工作就像一个魅力!事实上,我曾经用Call 给我的潜艇打电话,所以我把这一切搞混了。谢谢你:)
    • 它将它转换为ByVal,因为它正在尝试evaluate?
    • @jamheadart 好吧,从技术上讲就是这样,只有值被提交。
    猜你喜欢
    • 2014-01-16
    • 2021-11-27
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多