Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 比较两个单元格并用符号显示输出_Excel_Vba - Fatal编程技术网

Excel 比较两个单元格并用符号显示输出

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

我被要求创建一个宏来比较两个单元格中的两个数字,然后它应该写第三列,例如: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 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
这是输出:

这只是一个例子,整个代码应该使用大量的数据很快,无论如何有一些错误必须避免

  • 单元格中的代码不得显示(请参见图片中的蓝色箭头),它应仅显示值
  • 如何获取箭头图像而不是字符串:L大于M(向上箭头)

  • 你能帮我编写比这更好的代码吗?

    这里有一个替代方案:

    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
    

    通过将所有列LM数据放入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↑ 是否有一种方法,使用您以前的代码,来更改刚刚发布的文件的大小和颜色↑ 性格