Macro para copiar y borrar de una exportación de datos

Se necesita que copie solo el código, que pueden ser 5, 7 o 9 caracteres, en la columna A, dentro de cada grupo. Separado por filas vacías:

Ejem. Códigos:

6220001 Conservación edificios e instalaciones

6220002 Conservación mobiliario y enseres

6220003 Reparaciones varias general

6220004 Reparaciones automóviles

6220051 Reparación y acondicionamiento

Una vez copiados, dentro de cada grupo, tiene que:

  • Convertir los números en número para que se puedan hacer cálculos.
  • Eliminar la fila de donde se ha tomado el código
  • eliminar las filas vacías

- eliminar las filas donde en la columna C, aparece el código ZZZ001

Si se necesita, os puedo enviar un fichero para que sea más claro.

1 Respuesta

Respuesta
1

.09.03.17

Buenas tardes, Carlos

Aquí te comparto la siguiente rutina que desarrollé para lograr lo que solicitabas.

Accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:

Sub Depura()
'---- Variables modificables ----
'=== Carlos, modifica estos datos de acuerdo a tu proyecto:
        PrimCelda = "A7" 'Celda donde está el primer registro a depurar
        ClavElim = "ZZZ001" 'clave para eliminar la línea
        ColClave = "C" 'Columna donde está la clave para eliminar la línea
'---- fin Variables
'
'---- inicio de rutina:
'  
Application.ScreenUpdating = False
PrimFila = Range(PrimCelda).Row
LaColu = Range(PrimCelda).Column
UltFila = Range(Left(PrimCelda, 1) & Rows.Count).End(xlUp).Row
remanentes = UltFila - PrimFila + 1
cont = 0
For LaFila = UltFila To PrimFila Step -1
    If IsEmpty(Cells(LaFila, LaColu)) Or Range(ColClave & LaFila).Value = ClavElim Then
        Cells(LaFila, LaColu).EntireRow.Delete
        cont = cont + 1
    Else
        ElNumero = ""  
        REGISTRO = Cells(LaFila, LaColu).Value
        For Posi = 1 To Len(REGISTRO)
            Caract = Mid(REGISTRO, Posi, 1)
            If IsNumeric(Caract) Then
                ElNumero = ElNumero & Caract
            Else
                Exit For
            End If
        Next
        Cells(LaFila, LaColu).Value = Val(ElNumero)
    End If
Next
remanentes = remanentes - cont
ElMensaje = IIf(remanentes = 0, "NO QUEDARON NUMEROS OPERABLES" & Chr(10), _
"Quedaron " & remanentes & " número" & IIf(remanentes > 1, "s", "") & Chr(10) & "eliminando " & cont _
& " línea" & IIf(cont > 1, "s", "") & Chr(10) & " un listado de " & UltFila - PrimFila + 1 & " lineas")  
TipoMens = IIf(remanentes = 0, vbCritical, vbInformation)
ElTitulo = IIf(remanentes = 0, "NO QUEDARON NUMEROS", "TERMINADO!")
Application.ScreenUpdating = True
MsgBox ElMensaje, TipoMens, ElTitulo
End Sub

Nota que, al principio del código, hay unas variables para que lo adaptes a tu archivo, en caso de que necesites modificarlas.

IMPORTANTE: Siendo que la rutina elimina líneas, te recomiendo que la pruebes sobre una copia de tu planilla y revises si hizo el proceso como esperas que lo haga.

.

He copiado y adaptado la macro

No termina de borrar todas las filas en blanco

Además me está copiando el mismo código en todos los bloques

Si lo prefieres te podría enviar la hoja Excel para que lo puedas ver mejor

Muchas gracias.

.

Buenos días, Carlos

Es curioso porque todas las pruebas que hice funcionaron correctamente.

Asegúrate de que las variables iniciales tengan los valores correctos.

Por otra parte, la instrucción

If IsEmpty(Cells(LaFila, LaColu))

es la que maneja si una fila debe eliminarse.

Ahora bien, si la celda que está en la fila a eliminar en la columna A (o la que le hubieras indicado en la variable) tuviese un espacio o un caracter que no se ve, para la rutina no estará vacía y, por lo tanto, no la eliminará.

Por si ese fuese el caso, reemplaza esa línea por la siguiente:

If IsEmpty(Trim(Cells(LaFila, LaColu))) Or Len(Trim(Cells(LaFila, LaColu))) = 0 Or Range(ColClave & LaFila).Value = ClavElim Then

Si, aún así, no te funcionase, puedes enviarme el archivo a:

.

Tines razón, al importarlo va incluyendo un punto en cada celda de la fila en blanco.

No pone bien el código a cada grupo, pone a todos el mismo código

Con los números importados, no puedo hacer cálculos, se puede solucionar ?

Te he enviado un correo a la dirección indicada

Por si acaso lo he puesto mal, por favor, si te es posible, confirma que los has recibido.

Un abrazo

.

Buenas, Carlos

Efectivamente recibí tu archivo y ya te envié una solución que responde a lo que vi allá.

Convengamos que difiere de lo que solicitabas en este mensaje.

Espero que sea lo que esperabas.

Un abrazo

Fer

.

Hola Fer.

Primeramente, mis disculpas si me he explicado mal.

Al igual que en la rutina que me enviaste necesito que respete los decimales ya que tengo que hacer posteriormente cálculos y sin los decimales no voy a poder hacer comprobaciones ni cuadrar importes.

Por lo que te pido el favor, si te fuera posible revisar la macro para que salgan.

Muchísimas gracias y perdona si me expliqué mal.

.

Hola, Carlos

Imagino que estás haciendo las pruebas con el segundo archivo que te envié ayer.

Desde luego que tiene que respetar los decimales y, en ese sentido fueron las modificaciones que le hice al procedimiento original.

En todo caso, ayudaría que me comentes cuál es la Configuración Regional de tu equipo.

Concretamente cuál es tu separador de miles y cual es el separador que usas para decimales.

Saludos

Fer

.

Fer, esta es la configuración:

Te la escribo manualmente, porque no sé como incluir un pantallazo

Cualquier otra cosa, me dices.

Símbolo decimal: “,”

Número de dígitos decimales “2”

Símbolo de separación de miles “.”

Número de dígitos en grupo “123.456.789”

Símbolo de signo negativo “-“

Formato de número negativo “-1,1”

Mostrar ceros a la izquierda “0,7”

Separador de listas “;”

Sistema de medida “métrico”

Dígitos estándar 0123456789

Usar dígitos nativos   “nunca”

.

Buenas, Carlos

Acabo de enviarte una versión de la rutina adaptada a tu configuración regional.

Muy buen fin de semana

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas