Criterio macro analizar ultima fila activa y a partir de allí borrar filas en blanco hacia abajo

Tengo el siguiente macro en excel:

Sub Cargar_Asiento()
Dim NRO_ASIENTO
' CONSISTENCIA DE LA CARGA
If Range("H50") = "Asiento Correcto" Then
' COPIANDO CARGA DE DATOS DE ASIENTO
Range("A10:H47").Select
Selection.Copy
' UBICARSE AL FINAL DE LA BASE DE ASIENTOS
Range("A25000").Select
Selection.End(xlUp).Select
Selection.Offset(1, 0).Select
'PEGAR DATOS ASIENTOS
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
'INICIO
Application.CutCopyMode = False
Range("C10").Select
'MENSAJE INDICANDO NUMERO DE ASIENTO
NRO_ASIENTO = Range("B10").Value
MsgBox ("Se ha contabilizado el asiento número " & NRO_ASIENTO)
'NUMERAR ASIENTO
Range("B10").Value = NRO_ASIENTO + 1
'LIMPIAR CARGA DE ASIENTO
Range("A10,C10:C47,E10,F10:F47,G10:H47").Select
Selection.ClearContents
Range("C10").Select
Else
MsgBox ("Existen errores en la carga del asiento, por favor verificar")
End If
End Sub

El problema que presento es que cuando voy y reviso al final de la hoja si se ha pegado bien el asiento, esta correcto, pero entonces me deja un montón de filas vacías luego del ultimo asiento que la macro pega, que me produce un descontrol cuando vuelvo a ejecutar la macro pegándome el asiento mucho mas abajo porque existen muchas filas activas luego del ultimo asiento que pego, entonces tengo que eliminar manualmente todas esas filas activas para que la macro funcione bien.

Lo que necesito es al final de la macro que me pueda eliminar todas esas filas activas debajo del ultimo asiento que la macro pego, para que cuando vuelva a ejecutar la macro me la pegue justo después del ultimo asiento que cargue.

Espero explicarme bien. =)

1 respuesta

Respuesta
1

A veces la instrucción Selection.End(xlUp).Select suele dar este tipo de pegas. Vamos a solucionar este problema. Lo que vamos a hacer es recorrer la columna A hasta la primera fila que no tenga datos. Dicho esto te escribo una alternativa:

Option Explicit
Sub Cargar_Asiento()
' CONSTANTE DE LA COLUMNA DONDE TENGO QUE PEGAR LOS DATOS

' SI HUBIERA FILAS VACIAS ENTRE MEDIAS, CAMBIA EL VALOR DE LA CTE.

' POR LA PRIMERA CELDA QUE TENGA DATOS
Const celda = "A1"
Dim NRO_ASIENTO
Dim i As Long, r As Long, c As Long
' CONSISTENCIA DE LA CARGA
If Range("H50") = "Asiento Correcto" Then
' COPIANDO CARGA DE DATOS DE ASIENTO
Range("A10:H47").Select
Selection.Copy
' INICIAR VARIABLES
Range(celda).Select
r = ActiveCell.Row
c = ActiveCell.Column
i = 0
' UBICARSE EN LA ULTIMA FILA CON DATOS
Do While Cells(r + i, c).Value <> ""
i = i + 1
Loop

Range(r + i, c).Select
'PEGAR DATOS ASIENTOS
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
'INICIO
Application.CutCopyMode = False
Range("C10").Select
'MENSAJE INDICANDO NUMERO DE ASIENTO
NRO_ASIENTO = Range("B10").Value
MsgBox ("Se ha contabilizado el asiento número " & NRO_ASIENTO)
'NUMERAR ASIENTO
Range("B10").Value = NRO_ASIENTO + 1
'LIMPIAR CARGA DE ASIENTO
Range("A10,C10:C47,E10,F10:F47,G10:H47").Select
Selection.ClearContents
Range("C10").Select
Else
MsgBox ("Existen errores en la carga del asiento, por favor verificar")
End If
End Sub

Ya me contarás.

Hola experto, me sale un error de depuración marcando la sentencia

Range(r + i, c).Select

a que se deberá este error? como podría facilitarte mi archivo de excel para que observaras la estructura??

Perdona por el "gazapo". Es:

Cells (r + i, c).Select

experto funciona excelente, pero si quisiera agregarle a la macro que me deje una linea entre cada asiento como haría? porque asi me queda todo pegado. Gracias =)

Te escribo el código con las modificaciones:

Option Explicit
Sub Cargar_Asiento()
' CONSTANTE DE LA COLUMNA DONDE TENGO QUE PEGAR LOS DATOS
' SI HUBIERA FILAS VACÍAS ENTRE MEDIAS, CAMBIA EL VALOR DE LA CTE.
' POR LA PRIMERA CELDA QUE TENGA DATOS
Const celda = "A1"
Dim encontrado As Boolean
Dim NRO_ASIENTO
Dim i As Long, j As Long, r As Long, c As Long
' CONSISTENCIA DE LA CARGA
If Range("H50") = "Asiento Correcto" Then
' COPIANDO CARGA DE DATOS DE ASIENTO
Range("A1:A15").Select
Selection.Copy
' INICIAR VARIABLES
encontrado = False
Range(celda).Select
r = ActiveCell.Row
c = ActiveCell.Column
i = 0
j = 0
' UBICARSE EN LA ULTIMA FILA CON DATOS Y DEJAR UNA FILA EN BLANCO
Do Until Cells(r + i, c).Value = "" And encontrado = True
If Cells(r + i, c).Value = "" Then
If Cells(r + i + 1, c).Value <> "" Then
i = i + 1
Else:
j = r + i + 1
encontrado = True
End If
Else: i = i + 1
End If
Loop
Cells(j, c).Select
'PEGAR DATOS ASIENTOS
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
'INICIO
Application.CutCopyMode = False
Range("C10").Select
'MENSAJE INDICANDO NUMERO DE ASIENTO
NRO_ASIENTO = Range("B10").Value
MsgBox ("Se ha contabilizado el asiento número " & NRO_ASIENTO)
'NUMERAR ASIENTO
Range("B10").Value = NRO_ASIENTO + 1
'LIMPIAR CARGA DE ASIENTO
Range("A10,C10:C47,E10,F10:F47,G10:H47").Select
Selection.ClearContents
Range("C10").Select
Else
MsgBox ("Existen errores en la carga del asiento, por favor verificar")
End If
End Sub

Si te das cuenta, he añadido una variable boolena para comprobar la fila siguiente, otra variable para la segunda fila en blanco y he modificado el tipo de bucle.

Ya me dirás como te funciona.

Excelentísimo experto, funciona a la perfección, eres un genius, mil gracias por ayudar a las personas que no sabemos y nos vamos iniciando en el mundo de excel =)..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas