ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   How do you delete a row in a macro? (https://www.excelbanter.com/excel-programming/304789-how-do-you-delete-row-macro.html)

Robert[_16_]

How do you delete a row in a macro?
 
Hi everyone,

I'm trying to figure out how to delete an rows that
don't contain data that I want to keep. I wrote the
following macro but something is preventing me from
deleting the row... no errors occur and I don't know why
the selected rows are not being deleted. Does someone
know why this is happening?


Private Sub CommandButton1_Click()
Dim s(3) As String
Dim sLen(3) As Long
Dim i As Integer
Dim count As Integer
Dim ToBeDele() As String

s(0) = "...a"
s(1) = "...b
s(2) = " JOURNAL"
s(3) = "...c"

For i = 0 To 3 Step 1
sLen(i) = Len(s(i))
Next i

Sheets("GL20990 (2)").Activate
count = 1
For Each c In Worksheets("GL20990 (2)").Range("A1:A17")

b = False
For i = 0 To 3 Step 1
If Left(CStr(c.Value), sLen(i)) = s(i) Then
b = True
Exit For
End If
Next i

If Not b Then
If count = 1 Then
l = 0
Else: l = UBound(ToBeDele) + 1
End If
ReDim Preserve ToBeDele(l)
ToBeDele(l) = "A" & CStr(count)
End If
count = count + 1
Next c

'HERE IS MY PROBLEM! Why can't I delete the row?
For i = UBound(ToBeDele) To 0 Step -1
Set c = Range(CStr(ToBeDele(i)))
c.EntireRow.Delete
Next i

End Sub

Greg Wilson[_4_]

How do you delete a row in a macro?
 
I suggest the below simplification. However, note that
there is an apparent quirk with Excel: There seems to be a
difference between text with leading periods in a VBE code
module versus a worksheet cell. When I copied the text
with leading periods (e.g. "...a") from the code module
and pasted it to the worksheet my code worked. However,
when I typed it directly into the worksheet cells it
didn't - i.e. It's not recognized as the same. You'll have
to resolve this yourself.

As far as your code is concerned, when the above was taken
into account, it worked for me except that the loop at the
end that deletes the rows individually causes a
referencing error. When you delete rows individually then
the cell addresses change after each deletion. Then when
you go to delete the next row, the address you have stored
in the ToBeDele array is no longer valid. That's why I use
the non-contiguous DelRng variable and delete them all at
once to avoid this complication. Your code did delete rows
for me, just not the correct ones.

'Suggested simplified code:-
Private Sub CommandButton1_Click()
Dim i As Integer
Dim DelRng As Range
Dim C As Range, b As Boolean
Dim Arr As Variant

Arr = Array("...a", "...b", "...c", "JOURNAL")
For Each C In Worksheets("GL20990 (2)").Range("A1:A17")
b = False
For i = 0 To 3
If Trim(C) = Arr(i) Then b = True
Next
If Not b Then
If DelRng Is Nothing Then _
Set DelRng = C Else Set DelRng = Union(DelRng, C)
End If
Next C
DelRng.EntireRow.Delete
End Sub

Regards,
Greg


-----Original Message-----
Hi everyone,

I'm trying to figure out how to delete an rows that
don't contain data that I want to keep. I wrote the
following macro but something is preventing me from
deleting the row... no errors occur and I don't know why
the selected rows are not being deleted. Does someone
know why this is happening?


Private Sub CommandButton1_Click()
Dim s(3) As String
Dim sLen(3) As Long
Dim i As Integer
Dim count As Integer
Dim ToBeDele() As String

s(0) = "...a"
s(1) = "...b
s(2) = " JOURNAL"
s(3) = "...c"

For i = 0 To 3 Step 1
sLen(i) = Len(s(i))
Next i

Sheets("GL20990 (2)").Activate
count = 1
For Each c In Worksheets("GL20990 (2)").Range

("A1:A17")

b = False
For i = 0 To 3 Step 1
If Left(CStr(c.Value), sLen(i)) = s(i) Then
b = True
Exit For
End If
Next i

If Not b Then
If count = 1 Then
l = 0
Else: l = UBound(ToBeDele) + 1
End If
ReDim Preserve ToBeDele(l)
ToBeDele(l) = "A" & CStr(count)
End If
count = count + 1
Next c

'HERE IS MY PROBLEM! Why can't I delete the row?
For i = UBound(ToBeDele) To 0 Step -1
Set c = Range(CStr(ToBeDele(i)))
c.EntireRow.Delete
Next i

End Sub
.


Greg Wilson[_4_]

How do you delete a row in a macro?
 
Correction to my post:

Robert,
I was too hasty in my statement that your code doesn't
delete the correct rows. I overlooked the fact that it
loops in reverse order which is another means of avoiding
the referencing errors. I just ran it again and it worked.
I'm not sure what I did wrong to get it to fail during
testing. In short, the only problem seems to be the
leading period issue.

Regards,
Greg



-----Original Message-----
I suggest the below simplification. However, note that
there is an apparent quirk with Excel: There seems to be

a
difference between text with leading periods in a VBE

code
module versus a worksheet cell. When I copied the text
with leading periods (e.g. "...a") from the code module
and pasted it to the worksheet my code worked. However,
when I typed it directly into the worksheet cells it
didn't - i.e. It's not recognized as the same. You'll

have
to resolve this yourself.

As far as your code is concerned, when the above was

taken
into account, it worked for me except that the loop at

the
end that deletes the rows individually causes a
referencing error. When you delete rows individually then
the cell addresses change after each deletion. Then when
you go to delete the next row, the address you have

stored
in the ToBeDele array is no longer valid. That's why I

use
the non-contiguous DelRng variable and delete them all at
once to avoid this complication. Your code did delete

rows
for me, just not the correct ones.

'Suggested simplified code:-
Private Sub CommandButton1_Click()
Dim i As Integer
Dim DelRng As Range
Dim C As Range, b As Boolean
Dim Arr As Variant

Arr = Array("...a", "...b", "...c", "JOURNAL")
For Each C In Worksheets("GL20990 (2)").Range("A1:A17")
b = False
For i = 0 To 3
If Trim(C) = Arr(i) Then b = True
Next
If Not b Then
If DelRng Is Nothing Then _
Set DelRng = C Else Set DelRng = Union(DelRng, C)
End If
Next C
DelRng.EntireRow.Delete
End Sub

Regards,
Greg


-----Original Message-----
Hi everyone,

I'm trying to figure out how to delete an rows that
don't contain data that I want to keep. I wrote the
following macro but something is preventing me from
deleting the row... no errors occur and I don't know why
the selected rows are not being deleted. Does someone
know why this is happening?


Private Sub CommandButton1_Click()
Dim s(3) As String
Dim sLen(3) As Long
Dim i As Integer
Dim count As Integer
Dim ToBeDele() As String

s(0) = "...a"
s(1) = "...b
s(2) = " JOURNAL"
s(3) = "...c"

For i = 0 To 3 Step 1
sLen(i) = Len(s(i))
Next i

Sheets("GL20990 (2)").Activate
count = 1
For Each c In Worksheets("GL20990 (2)").Range

("A1:A17")

b = False
For i = 0 To 3 Step 1
If Left(CStr(c.Value), sLen(i)) = s(i) Then
b = True
Exit For
End If
Next i

If Not b Then
If count = 1 Then
l = 0
Else: l = UBound(ToBeDele) + 1
End If
ReDim Preserve ToBeDele(l)
ToBeDele(l) = "A" & CStr(count)
End If
count = count + 1
Next c

'HERE IS MY PROBLEM! Why can't I delete the row?
For i = UBound(ToBeDele) To 0 Step -1
Set c = Range(CStr(ToBeDele(i)))
c.EntireRow.Delete
Next i

End Sub
.

.



All times are GMT +1. The time now is 05:26 PM.

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