【问题标题】:Change some of cell's text's color: inconsistent macro behaviour更改某些单元格文本的颜色:不一致的宏行为
【发布时间】:2019-03-25 21:48:23
【问题描述】:

我正在编写一本使用 Excel 制作的教科书(我们先不讨论使用 Excel 的缺点,我很清楚这些缺点),并且我有一个句子列表,其中仅突出显示了一个单词 - 即在不同的颜色。出于某种原因,一些未突出显示的单词最终变成黑色(#000),而另一些则是深灰色(#333)。为了解决这个问题,因为我们实际上有超过 1000 个句子,所以我尝试制作一个宏。一些谷歌搜索导致我找到以下代码:

Sub FixG2Colors()
'
'
   Dim xOut As String
   Dim xValue As String
   Dim i As Long
   Dim LastRow As Long

   LastRow = Cells(Rows.Count, "C").End(xlUp).Row

   Do Until ActiveCell.Row > LastRow

   xValue = ActiveCell.Text

   For i = 1 To Len(xValue)
       If (Not ActiveCell.Characters(i, 1).Font.Color = RGB(153, 102, 255)) Then
           ActiveCell.Characters(i, 1).Font.Color = vbBlack
       End If
   Next

   ActiveCell.Offset(4, 0).Select

   Loop

End Sub 

所以,我将检查每个字符并将其颜色与突出显示颜色进行比较;如果不同,请将其设置为黑色。这些句子是每 4 行,所以我从第一个选定的单元格到工作表末尾的循环运行它。

我的问题是我的行为非常不一致。删除循环并运行循环正常工作......大多数时候。在某些情况下,单元格内容会被有效地修改。例如:

Actually, I was hoping / you could help me / with this problem.

突出显示“实际上”。运行宏不仅删除了高亮(我双重和三重检查:它是 RGB(153, 102, 255)),它还在句子的看似随机的部分更改字体。我打开文件,运行宏;关闭文件而不保存并再次打开它;在同一个句子上运行宏,字体会在不同的部分发生变化。

此外,它在其他句子上也能正常工作。

当我尝试运行循环时,它花费的时间比它应该的要长得多,Excel 通常会崩溃(即使它已经成功运行了至少一次),即使对于不同运行的同一个单元格,结果也不一致......

我在 macOS 上使用最新的 Excel 和操作系统、在 Windows 虚拟机上、在几台 Windows 机器上进行了尝试……唯一一致的是,这是多么不一致。

所以我的问题有两个: 1-宏/VBA真的这么不可靠/不一致吗? 2- 有没有更好的方法来实现这个功能?

【问题讨论】:

  • 在我使用 VBA 的 2 年经验中,我从未遇到过您描述的不一致。但是我看不出代码有什么问题。工作簿中是否还有其他代码?有什么活动吗?你是如何调用/运行 Sub 的?您是否尝试过通过 F8 逐步执行该过程以查看实际发生的情况?
  • 您的文字在哪些列中?
  • @SpringFilip 就像我说的,这是我的第一个 VBA 宏,所以我像尼安德特人一样做: alt-F11 打开编辑器,创建一个新模块,将文本粘贴到那里,然后单击编辑器上的“运行宏”按钮。编辑器只显示 Microsoft Excel 对象和我所做的模块,据我所知,没有其他代码或事件。我从未尝试过停止该程序;我试试看。
  • @GMalc 文本位于 C 列,我运行此宏时选择了 C 列中的一个单元格。
  • 我不明白你在这一行中试图完成什么Do Until ActiveCell.Row > LastRow;如果LastRow 是一个“大于1000”的数字,那么如果你的ActiveCell.RowC1,它怎么可能是> 1000?您需要遍历每一行;例如For x = 1 to LastRow

标签: excel vba


【解决方案1】:

根据我的 cmets;我会循环到最后一行,这段代码在一个带有多个彩色字符的小例子上进行了测试......(基于@Gary'sStudent 的代码)

Sub fixFontColor()
    Dim r As Long, x As Integer, lRow As Long
    lRow = Cells(Rows.Count, "C").End(xlUp).Row

        For r = 1 To lRow 'Number of rows

            For x = 1 To Len(Cells(r, 3).Value) 'for each character in cell

                If Cells(r, 3).Characters(Start:=x, Length:=1).Font.Color <> RGB(153, 102, 255) Then
                    Cells(r, 3).Characters(Start:=x, Length:=1).Font.Color = RGB(0, 0, 0)
                End If

            Next x

        Next r
End Sub

【讨论】:

  • ActiveCell.Row 不是与当前单元格行匹配的整数吗?我已经用MsgBox ActiveCell.Row 对其进行了测试,它返回了例如366 而不是C366,这使得比较366 &gt; 1000 成为可能。另外,我想每隔 4 行编辑一次(其他行包含我不想更改的数据),并且可能会跳过工作表的最后一行;类似:current row is 998; fix; skip 4 rows; current row is 1002; is it bigger than 1000? Yes, so break.
  • 抱歉,我不清楚,我不喜欢在使用最后一行变量时使用Do Until。如果您测试了我的代码,是否得到不一致的结果?
  • 我试了几次,要么 Excel 崩溃,要么 90% 的行全黑,包括突出显示的单词。然后 Excel 崩溃了。不过,我的测试还远未得出结论,而且是在 Mac 版本上,所以当我有时间时,我会在 Windows 和较小的工作表上进行尝试,看看效果如何,我会告诉你的。
  • 是的,它不能在 Mac 上运行,我不知道你使用的是 Mac。对于未来,请确定您正在使用的系统。抱歉,我没有 Mac,我不熟悉为 Mac 编写 vba 时的差异。所以,我想这基本上是徒劳的。我确实在装有 MS Office 2016 的 PC 上测试了代码,它工作正常。
  • 我在我的主要帖子中确实提到了我在 macOS、VM 内的 Windows 以及两台单独的 Windows 机器上都发生了不一致。所以我的初始代码的问题不是特定于平台的;明天我会检查你的是否也一样。
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 2017-11-04
  • 2011-04-11
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2020-02-12
  • 2015-06-27
相关资源
最近更新 更多