VBA-更改修改文本的颜色
我有一段代码,如果单元格中的文本被修改,它会改变文本的颜色。然而,我正在研究一些只改变单元格内修改文本颜色的东西。例如,我在单元格A1中有“This cell”,当我将其更改为“This cell-This is new text”时,“我只想更改颜色”-This is new text”VBA-更改修改文本的颜色,vba,excel,Vba,Excel,我有一段代码,如果单元格中的文本被修改,它会改变文本的颜色。然而,我正在研究一些只改变单元格内修改文本颜色的东西。例如,我在单元格A1中有“This cell”,当我将其更改为“This cell-This is new text”时,“我只想更改颜色”-This is new text” 谢谢这将更改字体,但它并不完美。如果在同一单元格中有不同的字体颜色,则Target.font.ColorIndex将返回NULL,因此它仅适用于第一次更改 Option Explicit Dim sOldV
谢谢这将更改字体,但它并不完美。如果在同一单元格中有不同的字体颜色,则
Target.font.ColorIndex
将返回NULL,因此它仅适用于第一次更改
Option Explicit
Dim sOldValue As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sNewValue As String
Dim sDifference As String
Dim lStart As Long
Dim lLength As Long
Dim lColorIndex As Long
On Error GoTo ERROR_HANDLER
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
sNewValue = Target.Value
sDifference = Replace(sNewValue, sOldValue, "")
lStart = InStr(sNewValue, sDifference)
lLength = Len(sDifference)
If Target.Font.ColorIndex = 3 Then
lColorIndex = 5
Else
lColorIndex = 3
End If
Target.Characters(Start:=lStart, Length:=lLength).Font.ColorIndex = lColorIndex
End If
On Error GoTo 0
Exit Sub
ERROR_HANDLER:
Select Case Err.Number
'I haven't added error handling - trap any errors here.
Case Else
MsgBox "Error " & Err.Number & vbCr & _
" (" & Err.Description & ") in procedure Sheet1.Worksheet_Change."
End Select
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
sOldValue = Target.Value
End If
End Sub
编辑:它仅适用于连续字符串。可能可以更改为查看sOldValue
和sNewValue
中的每个字符,并根据需要更改颜色。这很费劲:
UnDo
获取原始内容ReDo
获取新内容Characters
属性格式化新字符我会使用
UnDo
来避免保留100个单元格中每个单元格的静态副本
Dim oldString$, newString$
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
newString = Target.Value
If Target.Font.ColorIndex = 3 Then
Target.Font.ColorIndex = 5
Else
Target.Font.ColorIndex = 3
End If
End If
Debug.Print "New text: " & newString
color_New_Text oldString, newString, Target
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
oldString$ = Target.Value
Debug.Print "Original text: " & oldString$
End If
End Sub
Sub color_New_Text(ByVal oldString As String, ByVal newString As String, ByVal theCell As Range)
Dim oldLen&, newLen&, i&, k&
oldLen = Len(oldString)
newLen = Len(newString)
Debug.Print newString & ", " & oldString
For i = 1 To newLen
If Mid(newString, i, 1) <> Mid(oldString, i, 1) Then
Debug.Print "different"
Debug.Print theCell.Characters(i, 1).Text
If theCell.Characters(i, 1).Font.ColorIndex = 3 Then
theCell.Characters(i, 1).Font.ColorIndex = 5
Else
theCell.Characters(i, 1).Font.ColorIndex = 3
End If
End If
Next i
End Sub
Dim oldString$,新闻字符串$
私有子工作表_更改(ByVal目标作为范围)
如果不相交(目标,范围(“A1:A100”))则为零
newString=Target.Value
如果Target.Font.ColorIndex=3,则
Target.Font.ColorIndex=5
其他的
Target.Font.ColorIndex=3
如果结束
如果结束
调试。打印“新文本:”&新闻字符串
颜色\新\文本旧字符串、新闻字符串、目标
端接头
专用子工作表\u选择更改(以Excel.Range形式显示的ByVal目标)
如果不相交(目标,范围(“A1:A100”))则为零
oldString$=Target.Value
调试。打印“原始文本:”&oldString$
如果结束
端接头
子颜色\新\文本(ByVal oldString作为字符串,ByVal newString作为字符串,ByVal theCell作为范围)
Dim oldLen&,newLen&,i&,k&
oldLen=Len(oldString)
newLen=Len(newString)
调试。打印新闻字符串&“,”&旧字符串
对于i=1到newLen
如果Mid(newString,i,1)Mid(oldString,i,1),那么
调试。打印“不同”
调试。打印cell.Characters(i,1)。文本
如果cell.Characters(i,1).Font.ColorIndex=3,则
cell.Characters(i,1).Font.ColorIndex=5
其他的
cell.Characters(i,1).Font.ColorIndex=3
如果结束
如果结束
接下来我
端接头
这是两个全局变量,一个工作表\u selection Change
和工作表\u Change
来获取字符串。使用Gary学生的提示,我保留单元格的旧值并与新值进行比较。然后使用长度获得“差异”并给“字符”上色。修改如下:
Option Explicit
Public oldValue As Variant
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim oldColor
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
If Target.Value <> oldValue Then
oldColor = Target.Font.ColorIndex
Target.Characters(Len(oldValue) + 1, Len(Target) - Len(oldValue)).Font.ColorIndex = IIf(oldColor = 3, 5, 3)
End If
End If
End Sub
选项显式
作为变体的公共价值
公共子工作表\u选择更改(ByVal目标作为范围)
oldValue=Target.Value
端接头
私有子工作表_更改(ByVal目标作为范围)
暗淡的旧颜色
如果不相交(目标,范围(“A1:A100”))则为零
如果目标值为oldValue,则
oldColor=Target.Font.ColorIndex
Target.Characters(Len(oldValue)+1,Len(Target)-Len(oldValue)).Font.ColorIndex=IIf(oldColor=3,5,3)
如果结束
如果结束
端接头
抱歉,我的英语请尝试以下内容
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newvalue As String
Dim olvalue As String
Dim content
Application.EnableEvents = False
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
If Target.Font.ColorIndex <> -4105 Or IsNull(Target.Font.ColorIndex) = True Then
newvalue = Target.Value
Application.Undo
oldvalue = Target.Value
Content = InStr(newvalue, Replace(newvalue, oldvalue, ""))
Target.Value = newvalue
With Target.Characters(Start:=Content, Length:=Len(newvalue)).Font
.Color = 5
End With
Else
Target.Font.ColorIndex = 3
End If
End If
Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
将newvalue设置为字符串
将值设置为字符串
模糊内容
Application.EnableEvents=False
如果不相交(目标,范围(“A1:A100”))则为零
如果Target.Font.ColorIndex-4105或为null(Target.Font.ColorIndex)=True,则
newvalue=Target.Value
应用程序。撤消
oldvalue=Target.Value
Content=InStr(newvalue,替换为newvalue,oldvalue,“”)
Target.Value=newvalue
使用Target.Characters(开始:=内容,长度:=Len(newvalue)).Font
.颜色=5
以
其他的
Target.Font.ColorIndex=3
如果结束
如果结束
Application.EnableEvents=True
端接头
您可以在这里找到答案:看起来不错………您是否应该在工作表\u selection change
事件中处理的代码中的某个地方刷新sOldValue
。更新单元格后,按enter键将移动到下一个单元格并捕获该单元格的旧值。代码良好。。。。。。。。。。。。。。但是,如果只有一个全局单元格,则可能无法保留感兴趣范围内所有单元格的旧值。谢谢!虽然如果我在单元格的开头更改某些内容,它会更改右侧字符的颜色,但它确实起作用。但不管怎样,它确实达到了目的。谢谢!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newvalue As String
Dim olvalue As String
Dim content
Application.EnableEvents = False
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
If Target.Font.ColorIndex <> -4105 Or IsNull(Target.Font.ColorIndex) = True Then
newvalue = Target.Value
Application.Undo
oldvalue = Target.Value
Content = InStr(newvalue, Replace(newvalue, oldvalue, ""))
Target.Value = newvalue
With Target.Characters(Start:=Content, Length:=Len(newvalue)).Font
.Color = 5
End With
Else
Target.Font.ColorIndex = 3
End If
End If
Application.EnableEvents = True
End Sub