vba кодът не работи на първото число в цикъла, но е добре за левите числа в цикъла

Искам автоматично да променя цвета на клетките, ако дадена клетка е с 10% по-голяма или по-малка от съответната клетка, която е в същия ред, но три колони вляво, или от съответната клетка (в същия ред и колона) в работната книга „2014variance.xlsx“.

Sub testing1()

Dim x As Integer

Dim y As Integer

For x = 35 To 5 Step -3

For y = 11 To 76 Step 1

If IsNumeric(Cells(y, x).Value) Then

If VBA.Abs(Cells(y, x).Value) < VBA.Abs(0.9 * Cells(y, x - 3).Value) Or _

   VBA.Abs(Cells(y, x).Value) > VBA.Abs(1.1 * Cells(y, x - 3)) Then

     Cells(y, x).Interior.ColorIndex = 22

ElseIf VBA.Abs(Cells(y, x).Value) < VBA.Abs(0.9 *            
      Workbooks("2014variance.xlsx").Worksheets("Sheet1").Cells(y, x)) Or _

       VBA.Abs(Cells(y, x).Value) > VBA.Abs(1.1 * 
       Workbooks("2014variance.xlsx").Worksheets("Sheet1").Cells(y, x)) Then

     Cells(y, x).Interior.ColorIndex = 42


End If

End If

Next y

Next x

End Sub

Кодът работи добре с изключение на колона 2. Разбирам, че няма да бъде оцветен при първото условие if. Искам обаче да работи при условието „ElseIf“. Колона 2 трябва да има син цвят, защото тези числа са по-ниски от 90% от „2014variance.xlsx“. Как мога да направя това? Благодаря ти много.


person cljsibyl123    schedule 25.08.2015    source източник


Отговори (1)


След като създадох макетна среда, взех вашата подпроцедура и преминах през кода. Изглеждаше, че прекалявате с функцията Abs; математиката не постигаше това, което искахте. Не мисля, че сте възнамерявали -0.9 да бъде в рамките на 10% от 0.9. Добавих няколко варианта и стегнах някои раздели.

Sub testing1()
    Dim x As Long, y As Long, wbws1 As Double, c2 As Double, c5 As Double
    Dim xWS As Worksheet

    Set xWS = Workbooks("2014variance.xlsx").Worksheets("Sheet1")

    With ActiveSheet
        For x = 35 To 5 Step -3
            For y = 11 To 76 Step 1
                If IsNumeric(.Cells(y, x).Value2) Then
                    If CBool(.Cells(y, x).Value2) Then   '<>0
                        c2 = .Cells(y, x - 3).Value2
                        c5 = .Cells(y, x).Value2
                        If (Abs(c2 - c5) / c5) > 0.1 Then

                            .Cells(y, x).Interior.ColorIndex = 22

                        Else
                            wbws1 = xWS.Cells(y, x).Value2
                            If (Abs(wbws1 - c5) / c5) > 0.1 Then

                                .Cells(y, x).Interior.ColorIndex = 42

                            End If
                        End If
                    End If
                End If
            Next y
        Next x
    End With

    Set xWS = Nothing
End Sub

Това използва функцията Abs, но само за получаване на 0 -> 0,10 от -0,10 -> 0. Работи добре в моята макетна среда.

person Community    schedule 25.08.2015
comment
Благодаря ви много за отговора. Вашият код работи. Първата колона обаче все още се игнорира от VBA. Електронната таблица е посочена като януари до декември през 2015 г. И искам VBA да сравнява всеки месец през 2015 г. с 2014 г. От февруари до декември работи добре, но януари, който е колона 2, няма промяна на цвета в тази колона. Знаете ли има ли проблеми? - person cljsibyl123; 28.08.2015
comment
За x = 35 до 2, стъпка -3 ще причини грешка „дефинирано приложение или дефиниран обект“. Мисля, че е така, защото имам клетки (y,x-3).value и x - 3 ще бъде -1, което не съществува в колони. Така че поставям x = 35 към 5, стъпка -3. Но тъй като поставих x=5, x =2 не може да се изчисли. Как да решим проблема? - person cljsibyl123; 28.08.2015