ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   SpecialCells Method selects valid records (https://www.excelbanter.com/excel-programming/296909-specialcells-method-selects-valid-records.html)

ms

SpecialCells Method selects valid records
 
This procedure is used to delete any records where a negative sign exists
anywhere in a value in the D column. It works fine with multiple records, but
if there is only one record in the file, with or without a negative sign in the
file being formatted, the record is deleted.
If I change the SpecialCells Method to r.SpecialCells(xlCellTypeAllValidation)
it doesn't delete the one record but also does not remove records where the
negative sign exists when multiple records exist.

Here is a sample file with 2 records. One has a negative sign, the other does
not and therefore should not be deleted.
A,1111111111,042804,030171,13174.20
A,1111111111,041904,030221-,4243.30

How can I change this to work in both situations?


Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D2"), .Range("D" & _
Rows.Count).End(xlUp))
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
On Error Resume Next
'Extra variable is to prevent specialcells method from returning
error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End With
End Sub


Thanks,

Tom Ogilvy

SpecialCells Method selects valid records
 
Using autofilter is clever, but it always treats the top row in the range as
the header row and it will always be visible.

Also, it will always delete it.

So is row2 a header line or a record. You claim it works with multiple
rows, but I suspect you are always deleteing row 2 regardless of whether it
contains a negative or not.

Assuming row 1 is the header line I would use

Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D1"), .Range("D" & _
Rows.Count).End(xlUp))
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
' step down to row 2
set r = r.offset(1,0).Resize(r.rows.count - 1)
On Error Resume Next
'Extra variable is to prevent specialcells method from returning
error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End With
End Sub

--
Regards,
Tom Ogilvy

"ms" wrote in message
...
This procedure is used to delete any records where a negative sign exists
anywhere in a value in the D column. It works fine with multiple records,

but
if there is only one record in the file, with or without a negative sign

in the
file being formatted, the record is deleted.
If I change the SpecialCells Method to

r.SpecialCells(xlCellTypeAllValidation)
it doesn't delete the one record but also does not remove records where

the
negative sign exists when multiple records exist.

Here is a sample file with 2 records. One has a negative sign, the other

does
not and therefore should not be deleted.
A,1111111111,042804,030171,13174.20
A,1111111111,041904,030221-,4243.30

How can I change this to work in both situations?


Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D2"), .Range("D" & _
Rows.Count).End(xlUp))
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
On Error Resume Next
'Extra variable is to prevent specialcells method from returning
error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End With
End Sub


Thanks,




ms

SpecialCells Method selects valid records
 
Thank you again Tom.
I did have to make a small change or two.
I had to move the "On Error Resume Next" above the r.Offset line to prevent the
1004 error. And the range had to start at "D2" rather than D1. All the valid
lines are rolled up into row 1 so nothing happens.
I tested it with one record and with several and it seems to work. I will test
it further.

Have a good weekend.
Mark


Tom Ogilvy wrote:

Using autofilter is clever, but it always treats the top row in the range as
the header row and it will always be visible.

Also, it will always delete it.

So is row2 a header line or a record. You claim it works with multiple
rows, but I suspect you are always deleteing row 2 regardless of whether it
contains a negative or not.

Assuming row 1 is the header line I would use

Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D1"), .Range("D" & _
Rows.Count).End(xlUp))
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
' step down to row 2
set r = r.offset(1,0).Resize(r.rows.count - 1)
On Error Resume Next
'Extra variable is to prevent specialcells method from returning
error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End With
End Sub


Tom Ogilvy

SpecialCells Method selects valid records
 
I guess I misread/misunderstood the problem you were having.

Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D2"), .Range("D" & _
Rows.Count).End(xlUp))
if r(1).Row = 2 and r.rows.count = 1 then
if instr(r,"-") then _
r.EntireRow.Delete
elseif r(1).Row = 1 then
Exit sub
else
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
' step down to row 2
set r = r.offset(1,0).Resize(r.rows.count - 1)
On Error Resume Next
'Extra variable is to prevent specialcells method from returning
'error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End if
End With
End Sub


--
Regards,
Tom Ogilvy

"ms" wrote in message
...
Thank you again Tom.
I did have to make a small change or two.
I had to move the "On Error Resume Next" above the r.Offset line to

prevent the
1004 error. And the range had to start at "D2" rather than D1. All the

valid
lines are rolled up into row 1 so nothing happens.
I tested it with one record and with several and it seems to work. I will

test
it further.

Have a good weekend.
Mark


Tom Ogilvy wrote:

Using autofilter is clever, but it always treats the top row in the

range as
the header row and it will always be visible.

Also, it will always delete it.

So is row2 a header line or a record. You claim it works with multiple
rows, but I suspect you are always deleteing row 2 regardless of whether

it
contains a negative or not.

Assuming row 1 is the header line I would use

Sub CleanCancelledChks()
Dim r As Range
Dim r1 As Range
With ActiveSheet
Set r = .Range(.Range("D1"), .Range("D" & _
Rows.Count).End(xlUp))
.Columns("D:D").AutoFilter Field:=1, Criteria1:="=*-*"
' step down to row 2
set r = r.offset(1,0).Resize(r.rows.count - 1)
On Error Resume Next
'Extra variable is to prevent specialcells method from

returning
error1004 when no negative values(ie. cancelled chks) exist.
Set r1 = Nothing
Set r1 = r.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilterMode = False
If Not r1 Is Nothing Then _
r1.EntireRow.Delete
End With
End Sub





All times are GMT +1. The time now is 06:58 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com