Сравните две ячейки и покажите результат с символом

Меня попросили создать макрос, который сравнивает два числа в двух ячейках, а затем должен написать третий столбец, в котором, например, указано: 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

и это вывод:

Это всего лишь пример, вскоре весь код должен быть использован для большого количества данных, в любом случае следует избегать некоторых ошибок.

  1. Код в ячейке не должен отображаться (см. синюю стрелку на картинке), он должен отображать только значение.
  2. Как я могу получить изображение стрелки вместо строки: L больше, чем M (СТРЕЛКА ВВЕРХ)?

Можете ли вы помочь мне сделать код лучше, чем этот?

Для проблемы с изображением, можете ли вы попробовать использовать (скопировать и вставить) эти файлы? =SE(L2=M2;"L и M равны"; SE(L2>M2;"L больше, чем M ▲";"L меньше, чем M ▼"))

Ken Lee 13.12.2020 12:54
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
207
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот альтернатива:

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

Привет Гэри, я изменил ваш код, добавив строку: "L больше, чем M" & _ChrW(&H2191) вместо: txt = "n" это вывод: L больше, чем M ↑ Есть ли способ, используя ваш предыдущий код, чтобы изменить размер и цвет только символа ↑?

Alex D. 15.12.2020 12:50

Вот простое решение, которое вводит формулу во всем диапазоне без зацикливания.

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

Скриншот

Примечание:

  1. Чтобы вставить стрелку вверх, вы можете использовать ChrW(&H2191), а для стрелки вниз вы можете использовать ChrW(&H2193)

  2. Если вы хотите поставить формулу из 2-й строки, то она будет

     '~~> 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 часа назад

Да, это возможно. В этом случае вы можете использовать событие Worksheet_Change для обработки изменений в столбце 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

В бою

Привет, вчера я подумал, что достаточно использовать стрелку символа, которую вы мне предложили, вместо этого сегодня меня попросили рассмотреть изображение больше, чем символ символа, например, фигуры внутри панели «Вставка», можете ли вы помочь мне вставлять эти фигуры в макрос?

Alex D. 14.12.2020 16:11
for example the shapes inside the "Insert" panel Вышеупомянутый символ присутствует в таблице Insert-Symbol, но если вы имеете в виду конкретный символ, поделитесь им.
Siddharth Rout 14.12.2020 16:19

Большое спасибо, я записал это видео, чтобы показать, что я имею в виду. drive.google.com/file/d/161ippLgysRoclvpEUtO1XjXfDLl4HSXD/… Мне также нужно, чтобы эта стрелка вела себя как текст, например, когда я удаляю ячейку, стрелка все еще остается там, и я буду избегать этого.

Alex D. 14.12.2020 16:45

Тот, кто попросил вас сделать это, должен понять, что это действительно плохая идея. Фигуры можно показывать и скрывать, но это слишком большая головная боль 1. Чтобы вставлять/удалять фигуры, вам придется использовать Worksheet_Change Событие. Если есть 1000 ячеек, то в худшем случае будет 1000 стрелок. Кошмар, чтобы справиться! 2. Вам также необходимо убедиться, что фигуры увеличиваются, уменьшаются или меняют свое положение, когда пользователь изменяет размер строки/столбца.

Siddharth Rout 14.12.2020 20:44

у вас есть другие идеи, чтобы использовать фигуры? Как вы думаете, лучше использовать значки?

Alex D. 15.12.2020 09:29

Знаете ли вы, что вы можете выбрать соответствующий символ из Insert | Symbol

Siddharth Rout 15.12.2020 09:36

я думаю, что ваш вариант великолепен, честно говоря, еще одна вещь, как вы думаете, возможно ли использовать уже отформатированный текст стрелки? Например, красный (или любого другого цвета) определенного размера? А затем поместите это в свой код vba?

Alex D. 15.12.2020 11:25

Давайте продолжим обсуждение в чате.

Siddharth Rout 15.12.2020 12:06

Другие вопросы по теме