My apologies if my question is too basic. I am trying to achieve the following results
If Cell E11 value is less than 25,000, then hide Rows 14 & 15.
If Cell E11 value is between 25k-50k, then hide only row 15 only.
If Cell E11 value is between 50k-75k, then unhide both rows.
And it is possible to make the calculation automated?
So far I found the following code, which of course isn't helping with my situation.
Sub PG1()
If Range("E11").Value = "Pass" Then
Rows("14:14").EntireRow.Hidden = True
ElseIf Range("E11").Value = "Fail" Then
Rows("14:14").EntireRow.Hidden = False
End If
End Sub
A minor amount of trial and error based on nothing else but the code you posted gave me this code, which should get you started. It completes two of the three requirements (using different cells and rows), but it works. If it's still not something you can use to complete your task, you should probably hire someone to do this for you.
Sub ShowOrHide()
If ActiveSheet.Range("A1").Value < 25000 Then
ActiveSheet.Rows("2:3").EntireRow.Hidden = True
ElseIf ActiveSheet.Range("A1").Value >= 50000 Then
ActiveSheet.Rows("2:3").EntireRow.Hidden = False
End If
End Sub
Here you go.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$11" Then
If Target.Value < 25000 Then Rows("13:15").EntireRow.Hidden = True
If Target.Value > 25000 Then Rows("13:14").EntireRow.Hidden = False
If Target.Value > 50000 Then Rows("13:15").EntireRow.Hidden = False
If Target.Value > 75000 Then Rows("13:15").EntireRow.Hidden = True
End If
End Sub
Related
I’m trying, with Excel 2013, to hide and unhide rows when a cell is a certain value.
It's a form which should expand based on answers given.
When C16 = YES hide rows 18:22
When C16 = NO hide rows 24:38
When C16 =blank hide rows 18:38
When L43 = YES unhide rows 43:68 (if it’s not yes a zero is displayed)
I have tried 2 methods.
First: Into the worksheet - selected change in the top right dropdown
Private Sub Worksheet_Change(ByVal Target As Range)
Range("A18:A22").EntireRow.Hidden = (Range("$C$16").Value = "Yes")
Range("A24:A38").EntireRow.Hidden = (Range("$C$16").Value = "NO")
Range("A18:A38").EntireRow.Hidden = (Range("$C$16").Value = "")
Range("A43:A68").EntireRow.Hidden = (Range("$L$43").Value = "0")
End Sub
Second: code from here:
Unhide rows based on cell value
Using both of these methods only one of the changes seems to go ahead. So cell C16 is changed but that means range L43 is ignored
Also when the cell was blank it didn’t change anything. It remained as is and didn’t hide the columns as required.
Your ranges overlap so even if C16 = "Yes" the line C16 = "" will override it and unhide it. L42 is probably also a number where as you're comparing it to a text value try using the following instead. Your code would run on every single change in your sheet as well so have also updated it to only run when either C16 or L43 is changed
Private Sub Worksheet_Change(ByVal Target As Range)
With Me
If Not Intersect(Target, Union(.Range("C16"), .Range("L43"))) Is Nothing Then
.Range("A18:A38").EntireRow.Hidden = False
Select Case LCase(.Range("C16").Value2)
Case "yes"
.Range("A18:A22").EntireRow.Hidden = True
Case "no"
.Range("A24:A38").EntireRow.Hidden = True
Case Else
.Range("A18:A38").EntireRow.Hidden = True
End Select
.Range("A43:A68").EntireRow.Hidden = False
Select Case LCase(.Range("L43").Value2)
Case "yes"
.Range("A43:A68").EntireRow.Hidden = False
Case Else
.Range("A43:A68").EntireRow.Hidden = True
End Select
End If
End With
End Sub
After comments
I'd break this into two from your comments. The first would watch the dropdown and execute on the change of that cell. The second would update using the calculate event. Put these Subs in the sheets where applicable
Private Sub Worksheet_Change(ByVal Target As Range)
With Me
If Not Intersect(Target, Union(.Range("C16"), .Range("L43"))) Is Nothing Then
.Range("A18:A38").EntireRow.Hidden = False
Select Case LCase(.Range("C16").Value2)
Case "yes"
.Range("A18:A22").EntireRow.Hidden = True
Case "no"
.Range("A24:A38").EntireRow.Hidden = True
Case Else
.Range("A18:A38").EntireRow.Hidden = True
End Select
End If
End With
End Sub
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
With Me
.Range("A43:A68").EntireRow.Hidden = False
Select Case LCase(.Range("L43").Value2)
Case "yes"
.Range("A43:A68").EntireRow.Hidden = False
Case Else
.Range("A43:A68").EntireRow.Hidden = True
End Select
End With
Application.EnableEvents = True
End Sub
Try:
With Worksheets("Sheet1")
.Rows("18:68").EntireRow.Hidden = False
opt = UCase(.Range("C16").Value)
Select Case opt
Case "YES"
Rows("18:22").EntireRow.Hidden = True
Case "NO"
Rows("24:38").EntireRow.Hidden = True
Case ""
Rows("18:38").EntireRow.Hidden = True
Case Else
MsgBox "Invalid option in cell C16."
End Select
If UCase(.Range("L43").Value) = "Yes" Then
Rows("43:68").EntireRow.Hidden = True
Else
MsgBox "Invalid option in cell L43."
End Select
End With
...though I didn't understand what you wanted to be '0'.
I'm making a form to calculate the price rooms we rent out. Among others this cost is based on the arrival and departure date. You can see a screenshot of the form below;
- "Aankomst" (the first date) means "Arrival"
- "Vertrek" (the second date) means "Departure"
As you can see, I added buttons to respectively decrease or increase the dates. I also made sure that impossible values would be rectified. The departure date can never be equal or lower than the arrival date. When trying to decrease the departure date, or increase the arrival date, this is triggered when wrong.
When inputting values manually, this check does not occur. A bit of searching learned me I could do this with a change event macro.
I wrote this bit of code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Address = "$B$5" And Range("$b$5").Value + 1 >= Range("$b$6").Value Then
Range("$b$6").Value = Range("$b$5").Value + 1
End If
If Target.Address = "$B$6" And Range("$b$6").Value - 1 <= Range("$b$5").Value Then
Range("$b$5").Value = Range("$b$6").Value - 1
End If
Application.ScreenUpdating = True
End Sub
B5 is the cell containing the arrival date, b6 is the cell containing the departure date. When triggered, this macro should check both which cell was changed (b5 or b6) and if the arr. date is equal to or higher than the dep. date. And if so, automatically change the other cell (the one that was not manually changed).
Now when I omit the second if-statement, it works just fine. If I omit the second if-statement, it works fine as well. When both statements are active, it bugs everytime. I get a prompt saying 'insufficient stacking space' (translated from dutch).
I've tried this code as well, using case:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Range("b6").Value - 1 <= Range("b5").Value Then
Select Case Target.Address(0, 0)
Case "b5": Range("vertrek").Value = Range("aankomst").Value + 1
Case "b6": Range("aankomst").Value = Range("vertrek").Value - 1
End Select
End If
Application.ScreenUpdating = True
End Sub
...but also without success, same error. When I debug, I can see that the date was indeed changed if necessary, so I presume I somehow create an infinite loop or smth and that causes Excel to bug.
Does anyone know where my error lies or anyone aware of another method to achieve my goal?
Protect against re-raising the same event over and over:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Target.Address = "$B$5" And Range("$b$5").Value + 1 >= Range("$b$6").Value Then
Range("$b$6").Value = Range("$b$5").Value + 1
End If
If Target.Address = "$B$6" And Range("$b$6").Value - 1 <= Range("$b$5").Value Then
Range("$b$5").Value = Range("$b$6").Value - 1
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
I've got several data validation dropdown boxes across the top row of a spreadsheet. I'm using the following code to expand the box size (to help the users see their options) upon selecting the cell. I'm having problems getting the VBA script to ignore columns A:C upon returning the columns to normal width. These columns should be fixed at 20 and the others returned to 8.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("D1:AP1")) Is Nothing And Target.Columns <> "A1:C1" Then
ActiveWindow.Zoom = 100
Target.Columns.ColumnWidth = 8
Else
ActiveWindow.Zoom = 120
Target.Columns.ColumnWidth = 30
End If
End Sub
If I have understand well, the code shall be like:
Application.ScreenUpdating = False
If Target.Cells.Count > 1 Then
Exit Sub
Application.ScreenUpdating = True
End If
Set xx = Application.Intersect(Target, Range("D1:AP1"))
If xx Is Nothing Then
ActiveWindow.Zoom = 100
For i = 4 To 42
If Columns(i).Hidden = False Then Columns(i).ColumnWidth = 8
Next
Else
ActiveWindow.Zoom = 120
Target.Columns.ColumnWidth = 30
End If
Application.ScreenUpdating = True
The control of the Target cor Columns A:C shall be made after.
Also I prefer to chaneg all the width for columns D:AP when you return ...
I have a little bit chaged the code... Adding the check if are Hidden, and with the line Application.ScreenUpdating, the code show only at the end.
I have also removed code non necessary (some if ...).
I'm looking for a way for excel to alert me when a dynamic value (market feed data) is out of line by x%. The alert needs to appear in front of all my windows with a msg box "CHECK VALUES".
Is this possible to do and has anyone have an example of code for this?
More specifically
Minimum difference = 0.5
CELL A = 10
CELL B = 11
Difference = 1
ALERT user "Difference > 0.5"
Thank you in advance.
Thank you. This works perfect. Now I understand how it works, I'm hoping for another solution similar to the above. Both cells in A1 and B1 are constantly changing(variables). Cell C1 is the =ABS(B1-A1). What I need now is a code to alert me when Cell C1 is greater than 0.5.
You can use worksheet_change event. Try below code.
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo err_rout
Application.EnableEvents = False
If Target.Address = "$A$1" And Target.CountLarge = 1 Then
If (Target.Value - Target.Offset(0, 1)) > 0.5 Then
MsgBox "CHECK VALUES"
End If
ElseIf Target.Address = "$B$1" And Target.CountLarge = 1 Then
If (Target.Value - Target.Offset(0, -1)) > 0.5 Then
MsgBox "CHECK VALUES"
End If
End If
err_rout:
Application.EnableEvents = True
End Sub
Im having a little trouble with a code in excel vba.
What I want to do is that If any CELL within a RANGE on Sheet 1 is <= 2000 THEN hide a given row on Sheet 2. So it only takes 1 cell within a that range to be <= 2000 for the rows on the other sheet to be hidden. Kind of like a rotten apple spoils the bunch kind of thing.
Any help would be greatly appriciated. Thanks in Advance.
Edit: code i have that isnt working:
Edit2: code updated based on comments given, still no luck with it working.
Private Sub HideRows()
Sheets("Summary").Cells.EntireRow.Hidden = False
For Each cell In Sheets("Worksheet").Range("G9:P9")
If Abs(cell.Value) < 2000 Then
Sheets("Summary").Rows(11).EntireRow.Hidden = True
Sheets("Summary").Rows(23).EntireRow.Hidden = True
Sheets("Summary").Rows(43).EntireRow.Hidden = True
Sheets("Summary").Rows(54).EntireRow.Hidden = True
Sheets("Summary").Rows(78).EntireRow.Hidden = True
Sheets("Summary").Rows(90).EntireRow.Hidden = True
End If
Next
End Sub
The code does have the correct enders too such as End Select, Next, End Sub
-Matt
I'd do it this way:
Private Sub HideRows()
Worksheets("Summary").Cells.EntireRow.Hidden = False
For Each cell In Sheets("Worksheet").Range("G9:P9")
If Abs(cell) < 2000 Then
Worksheets("Summary").Range("A11,A22,A43,A54,A78,A90").EntireRow.Hidden = True
End If
Next
End Sub
It's best to use the Range object and reference non-contiguous cells as it makes it a single line.
You might Want to try and avoid Loops Something Like:
Sub NoLoopSample()
Dim lngLessThenSum As Long, lngGreaterThenSum As Long
Dim rngTestRange As Range
Set rngTestRange = Sheets("Worksheet").Range("G9:P9")
lngBetween2k4k = WorksheetFunction.SumIfs(rngTestRange, rngTestRange, ">=" & 2000, rngTestRange, "<" & 4000)
lngLessThenSum = WorksheetFunction.SumIf(rngTestRange, "<" & 2000)
If lngBetween2k4k > 0 Then
MsgBox "Atleast 1 Number Is Between 2000 And 4000"
End If
If lngLessThenSum > 0 Then
MsgBox "Atleast 1 Number Is Less then 2000"
Sheets("Summary").Range("11:11, 23:23, 43:43, 54:54, 78:78, 90:90").EntireRow.Hidden = True
End If
End Sub
Should do what you want and won't have to test EVERY Single cell in your range. There may be other functions or ways to do it but this was at the top of my head. Although on such a small range you shouldn't even notice the difference.
I also like to make as few changes to a worksheet from VBA as possible so in my example I hide all the rows you mention in one call rather then a call for each row.
Maybe it's about EntireRow property ..
Reference .. http://msdn.microsoft.com/en-us/library/office/ff836836.aspx
Since your code .. Rows("11").EntireRow.Hidden = True .. you have to make it sure that Row("11") is Range var ..
And to hide rows you may do Rows(11).Hidden = True
Sub try()
i = 1
While Sheet1.Cells(i, 1).Value <> ""
If Sheet1.Cells(i, 1).Value > 2000 Then
Sheet2.Rows(i).EntireRow.Hidden = True
End If
i = i + 1
Wend
End Sub
Straight to the point:
Range("a11,a22,a43,a54,a78,a90").EntireRow.Hidden = [sum((g9:p9>0)*(g9:p9<2001))]
You are concerned more with the minimum value only. I would rather use Excel's Min function for the work:
Sub HideRows()
Set InRng = Worksheets("Worksheet").Range("G9:P9") 'Input Range
Set OutRng = Worksheets("Summary").Range("A11,A22,A43,A54,A78,A90") 'Rows to be hidden
MinVal = Application.WorksheetFunction.Min(InRng) 'Invoking inbuilt function to get minimum value
If MinVal < 2000 Then
OutRng.EntireRow.Hidden = True
End If
End Sub