automatically hide row if cell contains asterisk

D

djarcadian

Is it possible for a row to automatically be set to HIDE is one of the
cells in said row contains an asterisk?
 
S

Sloth

You can use the autofilter and then select "custom". Select "does not equal"
and type ~* in the text box.
 
D

djarcadian

Thanks. That did the trick but is there a way for it to refresh
automatically? Sometimes I change data on one sheet but the filter
doesn't change to reflect these changes.
 
S

Sloth

you can use a macro like this. Right click on the sheet tab and select "view
code". Insert this code in "ThisWorkbook". Warning: This macro will run
everytime you change the worksheet.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Range("A1").AutoFilter Field:=1, Criteria1:="<>~*", Operator:=xlAnd
End Sub
 
D

djarcadian

It doesn't seem to work for me. Is the "range" supposed to be just A1 or
do I put something like A1:G100?
 
V

vezerid

djarcadian

IF what you want is to hide the row as soon as an asterisk is entered,
then you need to use the Worksheet_Change macro.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = "*" Then
Target.EntireRow.Hidden = True
End If
End Sub

Does this work for you?

Kostis Vezerides
 
S

Sloth

Sorry for the late reply. A1 is the header of the column you are looking for
the asterisks in. If you are searching for asterisks in column C, then
change A1 to C1. Also, you might want to doublecheck that you are putting
the code under "ThisWorkbook" and not under any of the sheets or modules.
 
H

Hubitron2000

Hi, vezerid. I'm trying to do something similar to djarcadian. How exactly
does one use the Worksheet_Change macro?

My goal is to hide rows if they contain a blank in Column B and to unhide
them as soon as Column B becomes nonblank. The cells in Column B are formulas
which take their value from a different worksheet.

Suggestions?
 
V

vezerid

Hi Hubitron

What you are requesting is trickier, since the values change fro
formulas. The following event macro traps the Calculate event an
performs what you ask with Sheet3 (change as necessary in the code).

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim col As Range
r = Sheets("Sheet3").UsedRange.Rows.Count
Application.EnableEvents = False
For i = 1 To r
If Sheets("Sheet3").Range("B" & i).Value = "" Then
Sheets("Sheet3").Range("B" & i).EntireRow.Hidden = True
Else
Sheets("Sheet3").Range("B" & i).EntireRow.Hidden = False
End If
Next i
Application.EnableEvents = True
End Sub

There are times that you might curse such automation. If this is th
case you will have to delete this macro.

To install (and delete later):
Alt+F11 to go to the VBA editor
Ctrl+R to toggle display of the Project Manager
Select your workbook and double click the ThisWorkbook icon
Paste the code above.

HTH
Kostis Vezerides
 
H

Hubitron2000

Thanks a lot for the quick reply! It's getting there . . . the problem is:
every time I change a source cell, from which the column B cells take their
value, the macro runs all the way through and takes a long time. Can I speed
up the macro somehow (e.g., by restricting it to rows 5-204 and/or making it
run automatically only on the particular row whose corresponding source cell
has changed)?

I hope that makes sense . . .

Thanks again!
 
V

vezerid

One of the reasons I said you might curse is because it seems slow. To
tell you the truth I have little experience with this event's
procedures. A filtering causes recalculation and for some time I was in
infinite loops, while developing. The line:

r = Sheets("Sheet3").UsedRange.Rows.Count

is there exactly in order to speed up the calculation.
UsedRange.Rows.Count will return 204 if this is the highest row number
in which you have made changes. I did not have time to check what
exactly is going on, but it was slow on me as well. Try the following
version, in which I am temporarily suspending automatic calculation
while the loop is taking place.

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim col As Range
r = Sheets("Sheet3").UsedRange.Rows.Count
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
For i = 1 To r
If Sheets("Sheet3").Range("B" & i).Value = "" Then
Sheets("Sheet3").Range("B" & i).EntireRow.Hidden = True
Else
Sheets("Sheet3").Range("B" & i).EntireRow.Hidden = False
End If
Next i
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub

Let me know how this works. If I have time I will study the code in
more detail.

Note: If anything goes wrong and you have to terminate the macro before
it is over, calculation will likely remain manual. This will affect the
entire application, i.e. any workbook you open. To return to automatic
calculation more, Tools|Options|Calculation tab.

HTH
Kostis Vezerides
 
Top