Отладка макроса Visual Basic

#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