Excel 比较两个单元格并用符号显示输出
我被要求创建一个宏来比较两个单元格中的两个数字,然后它应该写第三列,例如:L6小于M6(任何向下箭头的图像) 我尝试录制此宏:Excel 比较两个单元格并用符号显示输出,excel,vba,Excel,Vba,我被要求创建一个宏来比较两个单元格中的两个数字,然后它应该写第三列,例如:L6小于M6(任何向下箭头的图像) 我尝试录制此宏: Sub Macro20() Range("N2").Select ActiveCell.FormulaR1C1 = _ "=IF(RC[-2]=RC[-1],""L and M are equal"",IF(RC[-2]>RC[-1],""L
Sub Macro20()
Range("N2").Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-2]=RC[-1],""L and M are equal"",IF(RC[-2]>RC[-1],""L is greater than M (UP ARROW) "",""L is less than M (DOWN ARROW)""))"
Range("N2").Select
Selection.AutoFill Destination:=Range("N2:N" & Range("L" & Rows.Count).End(xlUp).Row)
Range(Selection, Selection.End(xlDown)).Select
End Sub
这是输出:
这只是一个例子,整个代码应该使用大量的数据很快,无论如何有一些错误必须避免
你能帮我编写比这更好的代码吗?这里有一个替代方案:
Sub alex()
Dim i As Long, LastRow As Long
Dim L, M, txt As String
LastRow = Cells(Rows.Count, "L").End(xlUp).Row
For i = 2 To LastRow
L = Cells(i, "L").Value
M = Cells(i, "M").Value
If L = M Then
txt = "they are equal"
ElseIf L > M Then
txt = "L is greater"
Else
txt = "M is greater"
End If
Cells(i, "N") = txt
Next i
End Sub
通过将所有列L和M数据放入VBA数组并在VBA中进行比较,可以稍微加快速度
要获取箭头而不是文本,请使用:
Sub alex()
Dim i As Long, LastRow As Long
Dim L, M, txt As String
LastRow = Cells(Rows.Count, "L").End(xlUp).Row
For i = 2 To LastRow
L = Cells(i, "L").Value
M = Cells(i, "M").Value
If L = M Then
txt = "n"
ElseIf L > M Then
txt = "h"
Else
txt = "i"
End If
Cells(i, "N") = txt
Next i
End Sub
并格式化列N中的结果单元格,以使用
Wingdings 3
font这里有一个简单的解决方案,它在整个范围内输入公式,而不循环
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long
'~~> Change this to the relevant sheet
Set ws = Sheet1
With ws
'~~> Find last row in column L
lRow = .Range("L" & .Rows.Count).End(xlUp).Row
'~~> Insert the formula in Col N. Change as applicable
With .Range("N1:N" & lRow)
.Formula = "=IF(L1=M1,""L and M are equal"",IF(L1>M1,""L is greater than M " & _
ChrW(&H2191) & _
""", ""L is less than M " & _
ChrW(&H2193) & _
"""))"
'~~> Optional - Convert formula to values
.Value = .Value
End With
End With
End Sub
屏幕截图
注意:
ChrW(&H2191)
;要插入向下箭头,可以使用ChrW(&H2193)
'~~> Insert the formula in Col N. Change as applicable
With .Range("N2:N" & lRow)
.Formula = "=IF(L2=M2,""L and M are equal"",IF(L2>M2,""L is greater than M " & _
ChrW(&H2191) & _
""", ""L is less than M " & _
ChrW(&H2193) & _
"""))"
'~~> Optional - Convert formula to values
.Value = .Value
End With
编辑 您认为可以使用已格式化的箭头文本吗?例如,有特定尺寸的红色(或任何颜色)?然后将其放入vba代码中?——亚历克斯,4小时前 是的,这是可能的。在这种情况下,您可以使用事件来处理列
L
和列M
中的更改,以填充列N
我已经对下面的代码进行了注释。如果你在理解它时仍然有问题,那么请随意提问。以下代码位于图纸代码区域。可以在代码顶部更改符号属性(样式、颜色和大小)
代码
Option Explicit
'~~> Change the symbol attributes here
Const Font_Style As String = "Bold"
Const Font_Size As Long = 15
Const Font_Color As Long = -16776961 '(Red)
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
Dim r As Variant
'~~> Check if the change happened in the relevant column
If Not Intersect(Target, Me.Range("L:M")) Is Nothing Then
For Each r In Target.Rows
'~~> If even one cell is empty then clear out N cell
If Len(Trim(Range("L" & r.Row).Value2)) = 0 Or _
Len(Trim(Range("M" & r.Row).Value2)) = 0 Then
Range("N" & r.Row).ClearContents
'~~> Check if L = M
ElseIf Range("L" & r.Row) = Range("M" & r.Row) Then
Range("N" & r.Row).Value = "L and M are equal"
'~~> Check if L > M
ElseIf Range("L" & r.Row) > Range("M" & r.Row) Then
With Range("N" & r.Row)
.Value = "L is greater than M " & ChrW(&H2191)
'~~> Format the symbol which is at 21st position
With .Characters(Start:=21, Length:=1).Font
.FontStyle = Font_Style
.Size = Font_Size
.Color = Font_Color
End With
End With
'~~> L < M
Else
With Range("N" & r.Row)
.Value = "L is less than M " & ChrW(&H2193)
'~~> Format the symbol which is at 18th position
With .Characters(Start:=18, Length:=1).Font
.FontStyle = Font_Style
.Size = Font_Size
.Color = Font_Color
End With
End With
End If
Next r
End If
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
选项显式
“~~>在此处更改符号属性
Const Font_样式为String=“Bold”
常量字体大小(长度=15)
常量字体颜色长度=-16776961'(红色)
私有子工作表_更改(ByVal目标作为范围)
关于错误转到哇
Application.EnableEvents=False
dimr作为变体
“~~>检查相关列中是否发生了更改
如果不相交(目标,距离(“L:M”))则为零
对于Target.Rows中的每个r
“~~>如果一个单元格为空,则清除N个单元格
如果Len(微调(范围(“L”和r.Row).Value2))=0或_
Len(微调(范围(“M”和r.Row).Value2))=0
范围(“N”和r.Row).ClearContents
“~~>检查L=M
ElseIf范围(“L”和r.Row)=范围(“M”和r.Row)然后
范围(“N”和r.Row).Value=“L和M相等”
“~~>检查L是否大于M
ElseIf范围(“L”和r.Row)>范围(“M”和r.Row)然后
带范围(“N”和r.Row)
.Value=“L大于M”&ChrW(&H2191)
“~~>格式化位于第21位的符号
带.Characters(开始=21,长度=1)。字体
.FontStyle=Font\u样式
.Size=字体大小
.Color=Font\u颜色
以
以
“~~>L格式化位于第18位的符号
带.Characters(开始=18,长度=1)。字体
.FontStyle=Font\u样式
.Size=字体大小
.Color=Font\u颜色
以
以
如果结束
下一个r
如果结束
让我们继续:
Application.EnableEvents=True
出口接头
哇
MsgBox错误说明
继续
端接头
在行动中
对于图像问题,您可以尝试使用(复制和粘贴)这些选项吗=SE(L2=M2;“L和M相等”SE(L2>M2;“L大于M▲";"L比M小▼"))嗨,昨天我觉得用你建议的字符箭头就足够了,今天我被要求考虑一个比字符符号多的图像,例如“插入”面板里面的形状,你能帮我把这些形状嵌入宏吗?<代码>,例如“插入”中的形状。"面板上面的符号出现在
插入符号
表中,但是如果您有一个特定的符号,请与他人分享。非常感谢,我录制了这段视频以显示我的意思。我还需要该箭头的行为像文本一样,例如,当我删除单元格时,箭头仍然保留在那里,我将避免出现这种情况。谁问过这个问题要执行此操作,您需要了解这确实是一个坏主意。形状可以显示和隐藏,但这太麻烦了1.要插入/删除形状,您必须使用工作表\u Change
事件。如果有1000个单元格,那么在最坏的情况下,将有1000个箭头。要处理的是一个噩梦!2.您还必须当用户调整行/列的大小时,请确保形状增长、收缩或更改位置。您是否有其他想法来代替使用形状?您认为使用图标更好吗?嗨,Gary,我修改了您的代码,将字符串改为:“L大于M”&_ChrW(&H2191)而不是:txt=“n”这是输出:L大于M↑ 是否有一种方法,使用您以前的代码,来更改刚刚发布的文件的大小和颜色↑ 性格