我正在研究使用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
因此,我要遍历每个字符并将其颜色与突出显示的颜色进行比较;如果不同,则将其设置为黑色。这些句子每隔第四行,因此我将其从第一个选定单元格到工作表末尾的循环运行。
我的问题是我的行为变得异常不一致。在大多数情况下,卸下循环并运行循环即可正常工作。在某些情况下,单元格内容会被有效地修改。例如:
Actually, I was hoping / you could help me / with this problem.
突出显示“实际上”。运行宏不仅会删除突出显示(我对其进行了三遍和两遍的检查:它是RGB(153,102,255)),还更改了字体在句子的看似随机的部分。我打开文件,运行宏;关闭文件而不保存并再次打开;在同一句子上运行宏,字体将在之前的不同部分更改。
它也可以在其他句子上正常工作。
当我尝试运行循环时,它花费的时间要长得多,Excel通常会崩溃(即使它至少已成功运行了一次),即使对于不同运行的同一单元格,结果也不一致……
我在具有最新Excel和OS的macOS上,Windows VM和几台Windows机器上尝试了此操作……唯一一致的是不一致的情况。
所以我的问题有两个: 1-宏/ VBA真的不可靠/不一致吗? 2-是否有更好的方法来实现此功能?
答案 0 :(得分:0)
根据我的评论;我将循环到最后一行,此代码已在一个带有多个彩色字符的小示例上进行了测试...(基于@ 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