【问题标题】:Macro produces negative font.colorindex values宏产生负的 font.colorindex 值
【发布时间】:2020-06-01 04:03:10
【问题描述】:

初步讨论结束时可能原因的线索.....

一个简单的 VBA 宏代码行,如:

FontCol = Cells(K, AmntCol).Font.ColorIndex

报告,光标悬停在“FontCol”上,值为“1” - 这是黑色的索引值。

但当此值“发布”到相关(活动)Excel 电子表格时:

Cells(RowRef, ColRef) = FontCol

如上解决的单元格显示 -5 而不是 1(作为问题的一个示例)

“1”是您期望看到的黑色,我什至无法弄清楚“-5”与什么有关 更不用说为什么它也不是在 VBA 代码中起作用的东西。 - 如果我将“-5”写入一些代码逻辑,则不会产生有用的结果,这证实了真正的基础值是 1 而不是 -5。

似乎没有多少(登陆)单元格的格式或将 FontCol 的“维度作为语句”更改为“整数”或“字符串”或“变体”会更改发布到单元格的内容。

我无法获得有关此问题的任何信息。最接近的是关于索引空间中较短数字的长数字和剩余驱动事物......无论这应该是什么意思。

我真的很想解决这个问题,因为我打算使用 ColorIndex 值作为安全编辑单元格值的一种方式。

任何智慧将不胜感激。

以上补充——作为回应。

将变量的 Dim 从“整数”更改为“长”没有区别。

在准备提供如下示例代码时,我已经确定了部分问题 - 它似乎与速度有关。但首先是代码。

'''' 子字体宏问题()

Dim I As Long
Dim FontCol As Long

For I = 36 To 51
    FontCol = Cells(I, 10).Font.ColorIndex
    If FontCol = 3 Then
        Cells(I, 18) = "Red"
        Cells(I, 19) = FontCol
    Else
        Cells(I, 18) = "Not Red"
        Cells(I, 19) = FontCol
    End If
Next I

End Sub
''''

以上是在 Windows 10 64 位机器上运行的(双引导到 Linux)...这应该不相关。

如果上述内容按原样运行,则输出大部分/全部为“非红色”,并且 FontCol 值的字符串打印为,

1 -5 -5 -5 -5 -7 -7 -7 -7 -7 -7 -7 -7 -7 -5 -7 - 如果减速,如 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1

慢,我的意思是在调试模式下运行宏,在“Next I”或类似的地方有一个断点,然后每秒按两次 F5 按钮(比如说)。全速情况下的输出大部分/全部是“非红色”,但是当对正在评估的字体放慢速度时,正确报告“红色”和“非红色”。

所以我现在的问题更多了,“这种行为是否正常”,“我怎样才能最好地放慢速度以获得正确的结果”或“什么代码更有效”? 编辑...

我倾向于同意 Fun Thomas 的观点,因为即使 2 个周期/秒也会带来问题。 我没有答案,但有些 cmets 可能会有所帮助。 1. 我的硬盘是 2 TB SSD 2. 相关电子表格有超过 46000 行。 3. 这绝非巧合: 8 -7 = 1,黑色字体报告为 1 和 -7,并且 8 -5 = 3,红色字体报告为 3 和 -5。 谢谢

【问题讨论】:

  • FontColDim 语句是什么?
  • 试试吧,请Dim FontCol As Long...
  • 您可能会得到 -4105 的结果,请参阅:docs.microsoft.com/nl-nl/office/vba/api/excel.xlcolorindex 其中表示 -4105 是“自动颜色”,而 -4142 是“无颜色”。
  • 您应该发布整个代码。我这边似乎一切都很好。你可以edit你的代码。你显然没有告诉我们足够的信息。如果代码在带有参数的过程中,则缺少ByVal 可能是问题所在。顺便说一句,单元格格式是General吗?
  • 我建议您使用简单的三行代码,看看是否出现问题,还有:Dim FontCol As LongFontCol = ActiveCell.Font.ColorIndexDebug.Print FontCol。您可以在即时窗口中看到什么?如果您看到正确的值,则问题必须在您的整个代码中找到...

标签: excel vba


【解决方案1】:

Font.ColorIndex 返回:

颜色被指定为当前调色板的索引值,或以下XlColorIndex 常量之一:xlColorIndexAutomatic 或 xlColorIndexNone。

常量将分别显示为整数值 -4105 和 -4142。

【讨论】:

    【解决方案2】:

    可能的事件程序问题

    您可能有一个会影响结果的事件过程。

    Workbook Download (Google Drive)

    • 以下事件过程可以复制您的问题。第一个代码进入标准模块(Module1),第二个代码进入工作表模块(例如Sheet1)。

    • 您只运行第一个代码,它将在R36:R51T36:T51 范围内返回正确的值,它会“随机”返回S36:S51 范围内的正确或错误值。

    • 另外,当您在S36:S51 范围内手动输入值时 如果它们是数字,在通过例如确认后按 ENTER, 输入的值将“随机”减少8

    模块1

    Option Explicit
    
    Sub FontMacroIssue()
    
        Dim i As Long
        Dim FontCol As Long
    
        For i = 36 To 51
            FontCol = Cells(i, 10).Font.ColorIndex
            If FontCol = 3 Then
                Cells(i, 18).Value = "Red"
            Else
                Cells(i, 18).Value = "Not Red"
            End If
            Cells(i, 19).Value = FontCol
            Cells(i, 20).Value = FontCol
        Next i
    
    End Sub
    

    Sheet1

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Const TargetCol As Long = 19
        Const TargetRows As String = "36:51"
        Const Offset As Long = 8
    
        Dim rng As Range
        Set rng = Intersect(Target, Columns(TargetCol))
        If rng Is Nothing Then Exit Sub
        Set rng = Intersect(rng, Rows(TargetRows))
        If rng Is Nothing Then Exit Sub
    
        On Error GoTo CleanExit
    
        Dim cel As Range
        For Each cel In rng
            If Round(Rnd()) = 0 Then
                Application.EnableEvents = False
                cel.Value = cel.Value - Offset
                Application.EnableEvents = True
            End If
        Next cel
    
        Exit Sub
    
    CleanExit:
        Application.EnableEvents = True
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2015-09-14
      • 2021-10-06
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多