【问题标题】:Strange errors reading properties of a FormatCondition读取 FormatCondition 属性的奇怪错误
【发布时间】:2018-11-26 03:00:24
【问题描述】:

我有一个FormatCondition、cf1。我执行以下操作:

Dim WS As Worksheet
Dim fcs As FormatConditions
Dim cf1 As FormatCondition
Dim b1 As Border

Set WS = ActiveSheet
Set fcs = WS.Cells.FormatConditions
Set cf1 = fcs.item(1)
Set b1 = cf1.Borders.item(xlEdgeBottom)

Dim ls As XlLineStyle
ls = b1.LineStyle

如果我尝试在即时窗口中读取b1.LineStyle 或将其分配给一个变量(根据上面的最后一行),我会得到

错误 1004:'无法获取 Border 类的 LineStyle 属性'

(与监视列表中的错误字符串相同,但没有错误编号)

b1.Weight 我得到了类似的东西

无论条件格式的边界是否有一条线都会发生这种情况,这肯定是不对的。如果确实没有该格式的线型,我认为LineStyle 应该是xlLineStyleNone,如果有线型,那么它肯定应该是可读的吗?

有谁知道发生了什么以及我该如何解决?

请注意:我查看了找到的边框,其他一些边框属性似乎正确(即Color=0 和ColorIndex 是-4142 或-4105)。 ThemeColor 和 TintAndShade 是 Null,Creator 是 xlCreatorCode。

我在设置 LineStyle 和 Weight 中发现了一些对问题的引用,并且那些说工作表已被锁定。据我所知,这里不是这种情况。


补充: 我有时在尝试读取 b1.ThemeColor 时也会遇到不同的错误。

'应用程序定义的或对象定义的错误'

在观察名单中,或

运行时错误 5:'无效的过程调用或参数'

在立即窗口中阅读时。其他时候只是Null


进一步补充: 对于cf1.Interior.InvertIfNegative,我得到了

'应用程序定义的或对象定义的错误'

在观察名单中,或

运行时错误 1004:“应用程序定义或对象定义错误”

尝试在立即窗口中阅读时。

可能还有其他我还没找到。

【问题讨论】:

  • 你能提供更多代码吗? cf1 是如何定义和初始化的?你能提供一个minimal reproducible example 来重现这个问题吗?
  • @Pᴇʜ - 完成,抱歉。我已经检查过了,FormatCondition 确实似乎是有效的,它包含我在大多数属性中所期望的值。您将需要创建一个带有适当条件格式规则的 Excel 工作表进行测试。
  • 我使用的规则是使用一个公式,例如=NOT(ISNUMBER(C9)),并在单元格底部施加一个单元格填充颜色,有时还有一个边框,并覆盖一系列单元格,例如@987654343 @
  • 使用单元格的DisplayFormat而不是通过formatconditions
  • 感谢@EvR,但我实际上需要 FormatConditions

标签: excel vba


【解决方案1】:

其实我可以重现你描述的问题。

问题似乎出在Set b1 = cf1.Borders.item(xlEdgeBottom),根据文档FormatCondition.Borders property,这是正确的。

但似乎有一个错误,因为xlEdgeBottom 的值是9(根据xlBordersIndex enumeration),如果我们查看cf1.Borders 的调试,我们会看到只有第 1 项… 4(见图),其中 4 似乎是底部边框。

如果没有其他人在这里有一个非常好的主意,我会说这看起来像一个 Excel 错误。

要解决此问题,您可以使用例如Set b1 = cf1.Borders.item(4) 作为底部边框。


所以解决方案是……

Set b1 = cf1.Borders.item(xlBottom) 实际上对我有用。

显然FormatCondition.Borders 没有使用正确的xlBordersIndex enumeration,而是使用xlTop、xlLeft、xlBottom、xlRight。

另请参阅FormatConditions border on a single edge。

但这仍然不符合文档,必须是一个错误。

【讨论】:

  • 老实说,我一直模糊地想知道这一点(因为我在其他地方检查了 cf1.Borders.Count 值)但认为 Excel 必须以某种方式使其工作,也许是通过集合中的有效项目开始索引为 5 或其他值 - 我不像 C# 那样熟悉 VBA 的细节,因为我可以看到 Border 的至少一些属性似乎是有效的,所以我从来没有想过整体边界可能不是。
  • 我应该提一下,如果只是针对在不同情况下阅读本文的其他人,可以想象它可能只适用于条件格式的边框......范围上的正常边框可能会正常工作跨度>
  • 显然FormatCondition.Borders 没有使用正确的xlBordersIndex 枚举。相反,它使用xlTop、xlLeft、xlBottom、xlRight。但根据文档,这是错误的,必须是一个错误。
  • 同意。这大概也解释了b1.ThemeColor 问题。对cf1.Interior.InvertIfNegative 有任何想法吗?
  • 不,b1.ThemeColor 问题仍然是一个问题。只发生在某些边界上,而不是所有边界上。似乎是格式中有一行的地方。我刚刚找到了一条注释:Attempting to access a theme color for an object whose color is not currently themed will result in an invalid request run-time error 现在我只需要弄清楚如何判断颜色是否为主题... :( 感谢您的所有帮助,太好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多