Меня попросили создать макрос, который сравнивает два числа в двух ячейках, а затем должен написать третий столбец, в котором, например, указано: 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
и это вывод:
Это всего лишь пример, вскоре весь код должен быть использован для большого количества данных, в любом случае следует избегать некоторых ошибок.
Можете ли вы помочь мне сделать код лучше, чем этот?
Вот альтернатива:
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 ↑ Есть ли способ, используя ваш предыдущий код, чтобы изменить размер и цвет только символа ↑?
Вот простое решение, которое вводит формулу во всем диапазоне без зацикливания.
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)
Если вы хотите поставить формулу из 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
В бою
Привет, вчера я подумал, что достаточно использовать стрелку символа, которую вы мне предложили, вместо этого сегодня меня попросили рассмотреть изображение больше, чем символ символа, например, фигуры внутри панели «Вставка», можете ли вы помочь мне вставлять эти фигуры в макрос?
for example the shapes inside the "Insert" panel
Вышеупомянутый символ присутствует в таблице Insert-Symbol
, но если вы имеете в виду конкретный символ, поделитесь им.
Большое спасибо, я записал это видео, чтобы показать, что я имею в виду. drive.google.com/file/d/161ippLgysRoclvpEUtO1XjXfDLl4HSXD/… Мне также нужно, чтобы эта стрелка вела себя как текст, например, когда я удаляю ячейку, стрелка все еще остается там, и я буду избегать этого.
Тот, кто попросил вас сделать это, должен понять, что это действительно плохая идея. Фигуры можно показывать и скрывать, но это слишком большая головная боль 1. Чтобы вставлять/удалять фигуры, вам придется использовать Worksheet_Change
Событие. Если есть 1000 ячеек, то в худшем случае будет 1000 стрелок. Кошмар, чтобы справиться! 2. Вам также необходимо убедиться, что фигуры увеличиваются, уменьшаются или меняют свое положение, когда пользователь изменяет размер строки/столбца.
у вас есть другие идеи, чтобы использовать фигуры? Как вы думаете, лучше использовать значки?
Знаете ли вы, что вы можете выбрать соответствующий символ из Insert | Symbol
я думаю, что ваш вариант великолепен, честно говоря, еще одна вещь, как вы думаете, возможно ли использовать уже отформатированный текст стрелки? Например, красный (или любого другого цвета) определенного размера? А затем поместите это в свой код vba?
Давайте продолжим обсуждение в чате.
Для проблемы с изображением, можете ли вы попробовать использовать (скопировать и вставить) эти файлы? =SE(L2=M2;"L и M равны"; SE(L2>M2;"L больше, чем M ▲";"L меньше, чем M ▼"))