Borrar datos de celdas y subir datos posteriores
Existe la posibilidad de crear una macro que me elimine los datos de unas celdas sin eliminar la fila, ¿y qué los datos que se encuentran en las siguientes filas suban?.
2 Respuestas
.28.03.17
Buenas tardes, Diana
Tendría que saber, yo, en qué condiciones quieres que se produzca esa eliminación.
La siguiente instrucción elimina la selección de celdas que tengas subiendo lo que tuvieras abajo
Accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:
Sub DeleCelda() Selection.Delete Shift:=xlUp End Sub
Eventualmente, podrías asignarle un atajo de teclado a esta macro de forma tal que puedas utilizarla más fácilmente en cada celda.
Para lo del atajo, haz:
Coméntame si mi solución resuelve lo que necesitabas -y, en tal caso, agradeceré que califiques mi contribución- o escribeme de nuevo aquí, si necesitas más apoyo con esto.
Un abrazo
Fernando
.
Fernando buenas tardes, efectivamente la macro me sirvió, muchísimas gracias. Pero, y sonara tonto lo que voy a decir, mi idea de no eliminar las filas es para que el diseño de una factura en la que estoy trabajando no se dañe, al ejecutar la macro me va subiendo las filas tal como quería, pero mi factura de 24 filas (con formato: color y formulas) va disminuyendo y pues se me daña el diseño de la factura, .ante eso se puede hacer algo?. Gracias.
.
Hola, Diana
Por eso era necesaria más información.
La siguiente rutina hace lo que solicitas, sobre la celda seleccionada, sin afectar fórmulas ni formatos.
Dado que es una rutina que borra datos, haz la prueba sobre una copia de tu hoja.
Reemplaza la rutina anterior por esta:
Sub ElimVacio() vuelve = ActiveCell.Address Do ActiveCell.Value = ActiveCell.Offset(1).Value ActiveCell.Offset(1).Select Loop While Not IsEmpty(ActiveCell.Value) ActiveCell.ClearContents Range(vuelve).Select End Sub
Espero que sea l que necesitabas.
Saludos
Fer
.
Hola Fernando, gracias, esta nueva rutina me respeta el formato de color y las fórmulas, perfecto, pero como tu mismo me recalcas falta información, no se si quieras ver el archivo, mi factura tiene varias columnas, CÓDIGO, DESCRIPCIÓN, VALOR UNITARIO, CANTIDAD, DESCUENTO, IMPORTE, mediante un formulario ingreso el código de producto en la columna CÓDIGO, las columnas DESCRIPCIÓN y VALOR UNITARIO tienen una fórmula que me llama de una base de datos el nombre y valor del producto cuando se ingresa el codigo; el mismo formulario me permite ingresar la CANTIDAD y el DESCUENTO, una fórmula me da el IMPORTE. Al ingresar esta nueva rutina elimina el producto y asumo que es por ser la primera columna (la primera celda que selecciono), así que se cambian DESCRIPCIÓN y VALOR UNITARIO, pero las columnas CANTIDAD Y DESCUENTO no se eliminan, se suben los datos de las celdas pero CANTIDAD y DESCUENTO quedan fijas. Soy un poco complicada para expresarme, si hay una posibilidad podría enviarte el archivo. Mil gracias.
.
Hola, de nuevo
Y así es como se va acomplejando la rutina.
Esta variante hace subir el código, la cantidad y el descuento en tu factura:
Sub ElimVacio() '---- Variables modificables ---- '=== DIANA, modifica estos datos de acuerdo a tu proyecto: ColCod = 0 'Columna de código ColCant = 3 'Columna de Cantidad ColDesc = 4 'Columna de Descuento '---- fin Variables ' '---- inicio de rutina: ' StatCalc = Application.Calculation Application.Calculation = xlCalculationManual LaFila = 0 With ActiveCell Do LaColu = ColCod rwe = .Cells(LaFila + 1, LaColu).Value .Offset(LaFila, LaColu).Value = .Offset(LaFila + 1, LaColu).Value ' LaColu = ColCant .Offset(LaFila, LaColu).Value = .Offset(LaFila + 1, LaColu).Value ' LaColu = ColDesc .Offset(LaFila, LaColu).Value = .Offset(LaFila + 1, LaColu).Value LaFila = LaFila + 1 Loop While Not IsEmpty(.Offset(LaFila, LaColu).Value) .Offset(LaFila, LaColu).ClearContents End With ActiveSheet.Calculate Application.Calculation = StatCalc End Sub
Al inicio del código verás que puedes indicarle dónde están las celdas a colocar arriba con relación a la columna del código.
Ese valor lo tomas de la posición relativa que tengan en tu formulario.
Por ejemplo:
Como verás, puede ser que esté en otras columnas pero bastará que le indiques en esas tres variables el número de columna relativa. Desde luego, no es necesario que esos números estén en la hoja. Los coloqué como ejemplo solamente.
Si, aún así, tuvieras inconvenientes en lograrlo puedes enviarme tu archivo a:
Pero confío en que podrás hacerlo por tu misma.
Saludos!
Fernando
.
¡Gracias! Que bello... yo solo inicie con la incógnita de si se podría hacer algo que imaginaba en mi base de datos, y tu lo hiciste realidad, en verdad no entiendo la rutina, y como siempre me pondré a estudiarla, pero muchas muchas gracias. Y creo que voy a molestarte seguido, tengo varios vacíos en mi proyecto y no dudaré en consultarte, muchísimas gracias, excelente!.
.
Un placer ayudarte, Diana
Básicamente la rutina inicia colocando el libro en recalculo manual (y al final lo devuelve al estado que tuviera cuando inició) para que no recalcule cada fórmula con los cambios que hace la rutina hasta que finaliza.
Luego toma los datos de la línea siguiente y lo pone en la actual hasta que encuentra un vacío en la lista de códigos, luego hace lo mismo para las otras dos columnas que le indiques.
Eventualmente, podría repetirse en otras columnas repitiendo el par:
LaColu = Col??? 'OTRA COLUMNA QUE LE INDIQUES . Offset(LaFila, LaColu).Value = .Offset(LaFila + 1, LaColu).Value
Desde luego, puedes consultarme de nuevo y pondré igual empeño en ayudarte si me fuere posible.
Beso
Fer
.
- Compartir respuesta
Supongo que si eliminas la fila, las fórmulas tendrán problemas.
Utiliza la siguiente macro. Primero selecciona una celda de la fila que quieres "borrar sus datos"
En la macro cambia la letra "B" por la columna que en tu hoja siempre tenga datos o siempre tenga fórmulas.
Sub Subir_Celdas() 'Por.Dante Amor fila = ActiveCell.Row u = Range("B" & Rows.Count).End(xlUp).Row Rows(fila + 1 & ":" & u).Copy Range("A" & fila) Rows(u).Clear End Sub
Lo que hace es copiar todo el bloque de filas de abajo de la fila seleccionada y lo pega sobre la fila seleccionada, digamos que con eso está "eliminando" los datos de la fila seleccionada. Al final, la última fila del bloque ha sido duplicada, es por eso que la macro borra los datos.
Avísame cualquier duda.
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
Gracias, pero esta macro me duplica todo: botones y otras celdas que están fuera de la factura en la misma fila y que tienen formato condicional.
¿De cuál columna a cuál columna quieres copiar?
Prueba con esta macro:
Sub Subir_Celdas() 'Por.Dante Amor fila = ActiveCell.Row u = Range("A" & Rows.Count).End(xlUp).Row Range("A" & fila + 1 & ":F" & u).Copy Range("A" & fila) Range("A" & u & ":F" & u).Clear 'Rows(fila + 1 & ":" & u).Copy Range("A" & fila) 'Rows(u).Clear End Sub
en esta línea, cambia la "A" por la columna que siempre tenga datos o fórmulas.
u = Range("A" & Rows.Count).End(xlUp).Row
Y en estas líneas, cambia la "A" y la "F" por las columnas que vas a copiar.
Range("A" & fila + 1 & ":F" & u).Copy Range("A" & fila) Range("A" & u & ":F" & u).Clear
Y para que los botones no se copien, selecciona tu botón o todos los botones, presiona botón derecho del mouse, sobre alguno de tus botones, en el menú que te aparece, selecciona Tamaño y propiedades. En la pestaña de propiedades, selecciona la opción "No mover, ni cambiar tamaño con celdas"
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
- Compartir respuesta