Tengo una pequeña rutina en VBA que a mi modo de entender, muestra un comportamiento anomalo en Excel, aunque dejo la puerte abierta a una posible explicacion.
En el ejemplo que incluyo se puede verificar facilmente.
Sobre una Hoja tengo las celdas ocupadas desde A1 hasta A10.
La macro va a recorrer las 10 primeras filas y en el caso de que sea la fila 5, debe borrar la linea y subir el resto de las celdas hacia arriba.
Para ello la he rellenado de color verde para que se vea facilmente.
Pues bien:
Cuando es la linea 1, todo bien. Pone en la celda B1 la frase "No borrada" y sigue.
En la linea 2 hace lo mismo... Y asi en la tercera y en la cuarta.
Pero al llegar la linea 5, selecciona "equivocadamente" la linea 6 en lugar de la 5, a pesar de que el contador de lineas, nFila tiene el valor 5. Y claro elimina la linea seleccionada que es la 6, y pone en la celda B5 la frase "Borrada". Es facil hacer este analisis ejecutando la macro, paso a paso con F8.
Es decir, siguiento el contador de nFila, encuentro que el programa selecciona en este orden de filas: 1,2,3,4,6,7,8,9,10
Da un salto del 4 al 6... para mi inexplicable...
Obvio que en este progtrama de ejemplo que incluyo, no deja de ser anecdotico. Pero he llegado a esto porque en un programa de mayor envergadura, he detectado esa situacion... inexplicable para mi, y sin poder encontrar la solucion, claro esta.
Sub Prueba()
Dim nFila As Integer
nFila = 1
Do While nFila < 11
Rows(nFila & "," & nFila).Select
If nFila = 5 Then
Selection.Delete Shift:=xlUp
Cells(nFila, 2).Value = "Borrada"
Else
Cells(nFila, 2).Value = "No Borrada"
End If
nFila = nFila + 1
Loop
End Sub
Alguien sabe el por que?
Envio comofichero adjunto, la Hoja con el macro.
Saludos cordiales
Jose Luis
Adjunto | Tamaño |
---|---|
prueba_curiosa.xlsm | 16.5 KB |
Es que estás seleccionando mal la fila. Si pones un punto de interrupción y vas viendo paso a paso verás que las filas que seleccionas son la 11, 22, 33, 44... la fila que estás borrando es la 55.
Prueba a seleccionar la fila con :
cells(nFila, 1).entirerow.select
Me gusta más, es más claro. No obstante, tu construcción también es correcta, pero has cometido un pequeño error que es lo que lo estropea todo. Cuando seleccionas una fila con Rows, pones dos argumentos que son fila inicial y fila final, pero no se separan con coma, sino con dos puntos. Tu macro también funciona perfectamente con:
Rows(nFila & ":" & nFila).Select
Ten en cuenta que tal y como tienes el código, va a escribir "borrada" en la fila que no has borrado (primero la borras, luego escribes). Por lo tanto, verás "Esta debe quedarse" 9 veces y "No borrada" o "Borrada" un total de 10 veces. Si le das la vuelta, primero escribes "Borrada" y luego borras no tendrás problemas.
Un saludo
Hola Cron:
Muchas gracias, (otra vez mas...) por tu ayuda, comenario y leccion.
He probado, claro esta, haciendo el cambio que me sugieres, y CIERTO... funciona correctamente.
Hombre... Ya me parecia a mi que seria poco menos que imposible que eso fuera un simple "bug" del Excel... :) :) :)
La explicacion era mucho mas prosaica: el defecto de la sintaxis al poner una coma en lugar de dos puntos...
Con la de vueltas que le he estado dando al programa con ese fallo... Al final tuve que cambiar montones de lineas para conseguir hacer lo que queria, pero claro, se quedo sin resolver el tema del por que salia ese fallo...
Hasta ahora. Gracias Cron, como digo, una vez mas.
Cuidate... por la cuenta que me tiene para una proxima oportunidad...
Saludos cordiales.
Jose Luis