Cornel Westside
Cornel Westside

Reputation: 117

If statement not changing colors when conditions are met

I'm using Excel VBA to try to solve the following problem:

In Column A, I'm given a list of 42 countries. In Column D, I'm given the price of a Big Mac in that country in USD. Row 1 has headers, so the data starts at Row 2. I need to build a Macro that allows the user to input 2 countries (Country1 and Country2), will loop through column A to find the countries the user put in, and their corresponding prices. It should save the cell location of the country into some variable, and the Price as just a number. If the Price of Country1 is greater than that of country 2, the name of Country1 should have a font color of green, and Country2 a font color of red. And vice versa.

Right now, the entire code is running through. But the colors of the cells aren't changing.

In case you want to test it, here is the top of the sheet:

Top of the data, with headers

Sub CountryComparison()

Dim Counter As Integer

Dim Country1 As String
Dim Country2 As String
Dim TheCell As Range
Dim Price1Cell As Range
Dim Price2Cell As Range
Dim Price1 As Single
Dim Price2 As Single

'The user inputs what countries they want to compare

Country1 = InputBox("Enter Country 1")
Country2 = InputBox("Enter Country 2")

'We are starting at row 2, column 1. Since we're going to check every row, I'm making counter a variable so that I can continuously add 1 to it after every loop.

Counter = 2
Set TheCell = Cells(Counter, 1)

'Here's my loop. It will select TheCell, and if it contains the name of Country1, then it will save that cell as Price1Cell (to be used later), and save the price of a Big Mac in that country (also to be used later). It does the same thing for Country2 thanks to the ElseIf statement. And if neither is a match, it goes on to the next row. Since there are 42 rows, it does this until Counter is greater than 43 (maybe it should be until greater than 42, but that shouldn't matter). I'm worried the way I'm saving Price1Cell/Price2Cell is incorrect. Should I be using TheCell instead of ActiveCell? Should I not be using the .Address function? Should I not be using Set and making it an object?... Feel like I've tried everything. This may be the reason for my problem later.

Do

    TheCell.Select

    If ActiveCell.Value = Country1 Then
    Set Price1Cell = Range(ActiveCell.Address)
    Price1 = ActiveCell.Offset(0, 3).Value

    ElseIf ActiveCell.Value = Country2 Then
    Set Price2Cell = Range(ActiveCell.Address)
    Price2 = ActiveCell.Offset(0, 3).Value

    End If

    Counter = Counter + 1

Loop Until Counter > 43

'Here's the final point, and where I seem to be getting my problem. If Country1's price is greater than Country2's Price, then Country1 should be colored red and Country2 green. And vice-versa. I think it might have to do with the way that I defined Price1Cell and Price2Cell. But I've tried a few different ways and got nothing. I tried a couple of different ways of writing my Do Until Loop, but nothing changes. It shouldn't need to be broken up into 2 loops, because I have the ElseIf statement.

If Price1 > Price2 Then
    Price1Cell.Font.Color = vbRed
    Price2Cell.Font.Color = vbGreen
End If

If Price2 > Price1 Then
    Price1Cell.Font.Color = vbGreen
    Price2Cell.Font.Color = vbRed
End If


End Sub

Upvotes: 1

Views: 216

Answers (1)

dwirony
dwirony

Reputation: 5450

The problem is you don't have Set TheCell inside your Do loop, so it never changes from Cells(2, 1). Move it inside:

Counter = 2

Do
    Set TheCell = Cells(Counter, 1)
    TheCell.Select

    If ActiveCell.Value = Country1 Then

Better yet, ditch the loop entirely and utilize .Find:

Option Explicit
Sub CountryComparison()

    Dim Country1 As String
    Dim Country2 As String
    Dim Price1Cell As Range
    Dim Price2Cell As Range
    Dim Price1 As Single
    Dim Price2 As Single

    Range("A:A").Font.Color = vbBlack

    Country1 = InputBox("Enter Country 1")
    Country2 = InputBox("Enter Country 2")

    Set Price1Cell = Range("A" & Columns("A:A").Find(What:=Country1).Row)
    Set Price2Cell = Range("A" & Columns("A:A").Find(What:=Country2).Row)

    Price1 = Range("A" & Columns("A:A").Find(What:=Country1).Row).Offset(0, 3).Value
    Price2 = Range("A" & Columns("A:A").Find(What:=Country2).Row).Offset(0, 3).Value

    If Price1 > Price2 Then
        Price1Cell.Font.Color = vbRed
        Price2Cell.Font.Color = vbGreen
    Else
        Price1Cell.Font.Color = vbGreen
        Price2Cell.Font.Color = vbRed
    End If

End Sub

Upvotes: 2

Related Questions