for Each.. .next

08/10/2008 - 23:55 por Manny_90 | Informe spam
Hice una grabacion para eliminar un renglon si una celda tiene cierto nombre,
el ejercicio lo hice con FOR EACH ...NEXT, per no orra todos los renglones
que tienen ese nombre, y a la mitad del caro me sale un mensaje "Code
execution has been interrupted".

Me podrian ayudar a revizar si hice mal en el codigo.. gracias..


Sub unoddd()
Dim Uuno As Range
Dim celda As Range
Range("E2").Select
Set Uuno = Range(ActiveCell, ActiveCell.End(xlDown))
uno = "GE MULTILIN - 316 - 00059870"
dos = "SONITROL CORPORATION - 492 - 00140000"
tres = "WHITE RODGERS - 538 - 00199100"
For Each celda In Uuno
If celda = uno Or celda = dos Or celda = tres Then
celda.EntireRow.Delete
End If
Next celda
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/10/2008 - 07:30 | Informe spam
hola, !

Hice una grabacion para eliminar un renglon si una celda tiene cierto nombre
el ejercicio lo hice con FOR EACH ...NEXT, per no orra todos los renglones que tienen ese nombre
y a la mitad del caro me sale un mensaje "Code execution has been interrupted".
Me podrian ayudar a revizar si hice mal en el codigo...



el codigo que expones funciona bien (y no se aprecia alguna causa del error que mencionas) ;)
pero... este tipo de eliminacion de filas es mejor si lo haces de manera diferente (p.e.)

"en reversa"...

Sub Eliminar()
Dim Fila As Integer, Uno As String, Dos As String, Tres As String
Uno = "GE MULTILIN - 316 - 00059870"
Dos = "SONITROL CORPORATION - 492 - 00140000"
Tres = "WHITE RODGERS - 538 - 00199100"
For Fila = Range("e65536").End(xlUp).Row To 2 Step -1
Select Case Range("e" & Fila)
Case Uno, Dos, Tres
Range("e" & Fila).EntireRow.Delete
End Select
Next
End Sub

o mejor aun, en lugar de "ir eliminando FILA POR FILA"... elimina todas en un solo paso
(siempre y cuando NO se llegue a "acumular" mas de 2048 rangos no-contiguos o areas)...

Sub Eliminar_2()
Dim Fila As Integer, Uno As String, Dos As String, Tres As String, Elimina As Range
Uno = "GE MULTILIN - 316 - 00059870"
Dos = "SONITROL CORPORATION - 492 - 00140000"
Tres = "WHITE RODGERS - 538 - 00199100"
For Fila = 2 To Range("e65536").End(xlUp).Row
With Range("e" & Fila)
If .Value = Uno Or .Value = Dos Or .Value = Tres Then _
Set Elimina = Union(IIf(Elimina Is Nothing, Range("e" & Fila), Elimina), Range("e" & Fila))
End With
Next
If Not Elimina Is Nothing Then Elimina.EntireRow.Delete: Set Elimina = Nothing
End Sub

saludos,
hector.
Respuesta Responder a este mensaje
#2 Manny_90
09/10/2008 - 21:34 | Informe spam
Ok. GrACIAS.

Pero.

Sabes, el codigo que hice yo si borra las columnas, pero no todas, si llega
a una celda que es igual a las que yo especifique , la borra pero salta de
renglon, es decir, salta de dos en dos para borrar las lineas (si los datos
estan sorteados). cuando termina el macro quedan celdas con la informacion
que yo especifique que borrara.

Sabes porque???
Gracias








"Héctor Miguel" wrote:

hola, !

> Hice una grabacion para eliminar un renglon si una celda tiene cierto nombre
> el ejercicio lo hice con FOR EACH ...NEXT, per no orra todos los renglones que tienen ese nombre
> y a la mitad del caro me sale un mensaje "Code execution has been interrupted".
> Me podrian ayudar a revizar si hice mal en el codigo...

el codigo que expones funciona bien (y no se aprecia alguna causa del error que mencionas) ;)
pero... este tipo de eliminacion de filas es mejor si lo haces de manera diferente (p.e.)

"en reversa"...

Sub Eliminar()
Dim Fila As Integer, Uno As String, Dos As String, Tres As String
Uno = "GE MULTILIN - 316 - 00059870"
Dos = "SONITROL CORPORATION - 492 - 00140000"
Tres = "WHITE RODGERS - 538 - 00199100"
For Fila = Range("e65536").End(xlUp).Row To 2 Step -1
Select Case Range("e" & Fila)
Case Uno, Dos, Tres
Range("e" & Fila).EntireRow.Delete
End Select
Next
End Sub

o mejor aun, en lugar de "ir eliminando FILA POR FILA"... elimina todas en un solo paso
(siempre y cuando NO se llegue a "acumular" mas de 2048 rangos no-contiguos o areas)...

Sub Eliminar_2()
Dim Fila As Integer, Uno As String, Dos As String, Tres As String, Elimina As Range
Uno = "GE MULTILIN - 316 - 00059870"
Dos = "SONITROL CORPORATION - 492 - 00140000"
Tres = "WHITE RODGERS - 538 - 00199100"
For Fila = 2 To Range("e65536").End(xlUp).Row
With Range("e" & Fila)
If .Value = Uno Or .Value = Dos Or .Value = Tres Then _
Set Elimina = Union(IIf(Elimina Is Nothing, Range("e" & Fila), Elimina), Range("e" & Fila))
End With
Next
If Not Elimina Is Nothing Then Elimina.EntireRow.Delete: Set Elimina = Nothing
End Sub

saludos,
hector.



Respuesta Responder a este mensaje
#3 Ivan
09/10/2008 - 22:31 | Informe spam
hola, disculpa que me meta, pero solo por aliviarle un poco de 'curro'
a Hector

... borra las columnas, pero no todas, si llega
a una celda que es igual a las que yo especifique , la borra pero salta de
renglon,
Sabes porque???



si no me equivoco, porque, a la hora de eliminar rangos mediante un
bucle For, este debe ser 'descendente' (fijate en el 1er ej. de
Hector, que el bucle se realiza desde la ultima fila hacia arriba
<Step -1>), pues sino te ocurre lo que comentas =>

.-> eliminas la fila que cumple la condicion,

.-> pero automaticamente al eliminarla las siguientes se desplazan una
fila hacia aarriba,

.-> con lo que el bucle, que simplemente sigue su curso, pasa a la
siguiente fila,

.-> que ahora sera la que 'antes' estaba dos filas mas abajo,

.-> y deja sin evaluar la que 'antes' era la siguiente fila y que
'ahora' ocupa el lugar de la eliminada.

bueno, creo que con el trabalenguas que me ha salido lo mismo va a
seguir siendo necesario el 'concurso' de Hector, ... pero esperemos
que te aclare algo

un saludo
Ivan
Respuesta Responder a este mensaje
#4 Manny_90
09/10/2008 - 23:56 | Informe spam
Exelente...

Gracias..





"Ivan" wrote:


hola, disculpa que me meta, pero solo por aliviarle un poco de 'curro'
a Hector

>... borra las columnas, pero no todas, si llega
> a una celda que es igual a las que yo especifique , la borra pero salta de
> renglon,
> Sabes porque???

si no me equivoco, porque, a la hora de eliminar rangos mediante un
bucle For, este debe ser 'descendente' (fijate en el 1er ej. de
Hector, que el bucle se realiza desde la ultima fila hacia arriba
<Step -1>), pues sino te ocurre lo que comentas =>

..-> eliminas la fila que cumple la condicion,

..-> pero automaticamente al eliminarla las siguientes se desplazan una
fila hacia aarriba,

..-> con lo que el bucle, que simplemente sigue su curso, pasa a la
siguiente fila,

..-> que ahora sera la que 'antes' estaba dos filas mas abajo,

..-> y deja sin evaluar la que 'antes' era la siguiente fila y que
'ahora' ocupa el lugar de la eliminada.

bueno, creo que con el trabalenguas que me ha salido lo mismo va a
seguir siendo necesario el 'concurso' de Hector, ... pero esperemos
que te aclare algo

un saludo
Ivan

Respuesta Responder a este mensaje
#5 Ivan
10/10/2008 - 00:42 | Informe spam
:-D me alegro que te haya aclarado algo, pero =>

Exelente...



para EXCELente el 2º ej. de Hector, una variante mas de sus
'maravillas' con las areas [en este caso :-)))] que nunca dejan de
sorprenderme ...

un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida