#excel #vba
Вопрос:
Я пытаюсь создать простую макрофункцию VBA, которая принимала бы количество/ диапазон значений, и если какое-либо значение ячейки превышает 100, оно должно изменить цвет соседней ячейки слева на gree).
Так что в моем цикле for,
Function Test(Rngg As Range) As String
x = 0
x2 =0
For Each Cell in Rngg
If Cell.Value > 100 Then
x = x 1
Cell.Offset(,-1).Interior.Color = vbGreen
Else
x2 = x2 1
End if
Next Cell
Test = :There are " x " large orders and" x " Short orders"
Msgbox(Test)
End Function
Не мог бы кто-нибудь, пожалуйста, помочь указать и сказать мне, что не так с этим фрагментом кода? Примечание Rngg-это диапазон, введенный пользователем.
Нет ошибок компиляции, но когда я в основном пытаюсь использовать функцию в качестве формулы в Excel, я постоянно получаю ошибку значения
Комментарии:
1. Возможно, вам захочется указать, какую ошибку вы получаете. Кроме того, он не будет работать, если
Rngg
включает первый столбец, так как слева от него нет столбца. Кроме того,,Interior
не следует использовать запятую… это должно быть.Interior
2. я думаю, что для использования смещения вам нужно выбрать ячейку. Я предпочитаю использовать: Для x = от 1 до qnt, Если thisworkbook.sheets(«ваш лист»).ячейка(x,2).значение > 100, то ‘2-столбец B … Следует логике.
3. @braX Привет, я обновил код, и ошибок компиляции нет. При попытке использовать функцию я постоянно, кажется, получаю ошибку значения.
4. Вы не хотите
x.Offset
— вы хотитеCell.Offset
—x
это число, поэтому у него нет свойств и методов.5. @braX Приношу свои извинения, это была опечатка с моей стороны. Код по-прежнему, похоже, не работает.
Ответ №1:
Цвет по значению
Option Explicit
Sub ColorByValueTEST()
Dim rg As Range: Set rg = Range("B2:B21")
ColorByValue rg, 100, -1, vbGreen
End Sub
Sub ColorByValue( _
ByVal rg As Range, _
ByVal GreaterThanValue As Double, _
ByVal ColumnOffset As Long, _
ByVal DestinationColor As Long)
If rg Is Nothing Then Exit Sub
Dim srg As Range: Set srg = rg.Columns(1)
If srg.Column ColumnOffset < 1 Then Exit Sub
If srg.Column ColumnOffset > srg.Worksheet.Columns.Count Then Exit Sub
Dim drg As Range
Dim sCell As Range
For Each sCell In srg.Cells
If IsNumeric(sCell) Then
If sCell.Value > GreaterThanValue Then
If drg Is Nothing Then
Set drg = sCell.Offset(, ColumnOffset)
Else
Set drg = Union(drg, sCell.Offset(, ColumnOffset))
End If
End If
End If
Next sCell
If drg Is Nothing Then Exit Sub
srg.Offset(, ColumnOffset).Interior.Color = xlNone
drg.Interior.Color = DestinationColor
End Sub
Ответ №2:
Большинство предупреждений ясно изложены в комментариях, но эта процедура, вероятно, делает то, что вы хотите. Есть пара вещей, на которые следует обратить внимание с помощью входного окна.
Sub inputBoxMacro()
Dim aRngg As Range, Cell As Range
On Error GoTo endThis 'used in case user cancels
Set aRnggr = Application.InputBox(Title:="The InputBox Title", Prompt:="Grab some cells", _
Type:=8)
On Error GoTo 0
For Each Cell In Intersect(aRngg, aRngg.Worksheet.UsedRange).Cells
If Cell.Column = 1 Then
'skip since nothing to the left
ElseIf Cell.Value > 50 Then
Cell.Offset(, -1).Interior.Color = vbGreen
End If
Next Cell
endThis:
End Sub