Macro en vb de Excel- si el rango está vacío me copia

Hice una macro en el excel (soy muy principiante), la macro consiste en que me filtre por unos valores predefinidos en la tabla, pudiendo estar esos valores o no, para después pegarlo en otra tabla de otra hoja.

Me hace los filtros correctos y me los pega bien cuando está el valor, pero en el momento que ese valor no existe en la tabla, me pega lo anterior a la celda que dije que me pagase si había valor. Cuando son tres o cuatro valores me funciona, pero si pongo más deja de funcionar. Esté sería el código

Sub Copiado_pegado()
Dim rng As Range
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=4, Criteria1:= _
"5501"
'oculto columnas
'Hoja1.ListObjects("Tabla111").ListColumns(2, 3, 4).DataBodyRange.Select

' descombino las celdas del titulo
Range("C9:M9").UnMerge

'oculto las dos columnas que no tengo que trasladar
Range("D:E").Select
Selection.EntireColumn.Hidden = True
' copiado y pegado 5501

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada 5501"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B54")
End If

Application.CutCopyMode = False

'copiado y pegado a la 5502
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=4, Criteria1:= _
"5502"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada 5502"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B159")
End If
Application.CutCopyMode = False

'copiado y pegado a la 5503
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=4, Criteria1:= _
"5503"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada 5503"
Else
Sheets("Hoja2").Select
rng.Copy Destination:=Range("B264")
Application.CutCopyMode = False
End If

'copiado y pegado a la 5506
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=4, Criteria1:= _
"5506"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada 5506"
Else
Sheets("Hoja2").Select
rng.Copy Destination:=Range("B369")
Application.CutCopyMode = False
End If

'copiado y pegado a la 5507
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=4, Criteria1:= _
"5507"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B474")
End If
Application.CutCopyMode = False

'copiado y pegado a la 5508
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=3, Criteria1:= _
"5508"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B580")
End If
Application.CutCopyMode = False

'copiado y pegado a la 5514
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=3, Criteria1:= _
"5514"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B685")
End If
Application.CutCopyMode = False

'copiado y pegado a la 5517
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=3, Criteria1:= _
"5517"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B790")
End If
Application.CutCopyMode = False

'copiado y pegado a la 5519
Sheets("Pagare Exportar").Select
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=3, Criteria1:= _
"5519"

With ActiveSheet.ListObjects("Tabla111").DataBodyRange
On Error Resume Next
Set rng = .Resize(.Rows.Count, .Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With

If rng Is Nothing Then
MsgBox "No hay nada"
Else
Sheets("Hoja2").Select

rng.Copy Destination:=Range("B960")
End If
Application.CutCopyMode = False

Sheets("Pagare Exportar").Select
'muestro columna oculta
Columns("D:E").Select
Selection.EntireColumn.Hidden = False
ActiveSheet.ListObjects("Tabla111").Range.AutoFilter Field:=3
'combinar celdas y centrar
'combino las celdas del titulo
Range("C9:M9").Merge
'centro
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
End With
End Sub

Seguro que el código puede ser más corto e incluso esté mal algo, pero soy muy principiante y estoy empezando ¿Me podría ayudar alguien

1 Respuesta

Respuesta
2

Prueba con la siguiente macro.

Puse 2 arreglos, uno para los valores a filtrar y otro para las celdas destino.

Sub Copiado_pegado()
'Por Dante Amor
  Dim rng As Range, f As Range
  Dim sh1 As Worksheet
  Dim tbl As ListObject
  Dim ar1 As Variant, ar2
  Dim i As Long
  '
  Application.ScreenUpdating = False
  '
  Set sh1 = Sheets("Pagare Exportar")
  Set tbl = Sheets("Pagare Exportar").ListObjects("Tabla111")
  '
  Ar1 = Array("5501", "5502", "5503", "5506", "5507", "5508", "5514", "5517", "5519") 'valores a filtra
 ar2 = Array("B54", "B159", "B264", "B369", "B474", "B580", "B685", "B790", "B960") 'celda destino
  '
  sh1.Range("C9:M9").UnMerge
  sh1.Range("D:E").EntireColumn.Hidden = True
  '
  For i = 0 To UBound(ar1)
    tbl.Range.AutoFilter
    Set f = tbl.DataBodyRange.Columns(4).Find(ar1(i), , xlFormulas, xlWhole)
    If Not f Is Nothing Then
      tbl.Range.AutoFilter Field:=4, Criteria1:=ar1(i)
      tbl.DataBodyRange.Copy Sheets("Hoja2").Range(ar2(i))
    End If
  Next
  '
  sh1.Range("C9:M9").Merge
  sh1.Range("D:E").EntireColumn.Hidden = False
  With sh1.Range("C9:M9")
    .Merge
    .HorizontalAlignment = xlGeneral
    .VerticalAlignment = xlCenter
    .WrapText = False
    .Orientation = 0
    .AddIndent = False
    .IndentLevel = 0
    .ShrinkToFit = False
    .ReadingOrder = xlContext
  End With
End Sub

.Comenta si tienes dudas. No olvides valorar la respuesta.

He copiado lo que pusiste y no me hace nada, sólo me quito los filtros pero no me pego nada en la hoja 2...

En los códigos 5501,5502...puede ser que no tenga en el cuerpo esos códigos. En unos meses tendré unos códigos de esos, otros o todos. Esos códigos son todas las posibilidades que hay.

Gracias por tú respuesta

Según tu macro los códigos están en la columna 4.

Puedes compartir tu archivo en googledrive o envíame tu archivo a mi correo para revisar en dónde tienes exactamente los datos.

[email protected]

Utiliza la siguiente macro. La probé en el archivo que me enviaste y funciona!

Ajusté las celdas destino a la primera celda de la tabla:

ar2 = Array("B4", "B109", "B214", "B319") 'celda destino

Si esa no es la celda, entonces puedes ajustar la celda destino en esa línea de la macro.

Solamente puse 4 números de sociedad, pero con el ejemplo puedes completar los demás.

[No olvides valorar la respuesta]

Sub Copiado_pegado_DANTE_AMOR()
'Por Dante Amor
  Dim f As Range
  Dim sh1 As Worksheet
  Dim tbl As ListObject
  Dim ar1 As Variant, ar2
  Dim i As Long
  '
  Application.ScreenUpdating = False
  '
  Set sh1 = Sheets("Pagare Exportar")
  Set tbl = Sheets("Pagare Exportar").ListObjects("Tabla111")
  '
  ar1 = Array("5501", "5502", "5503", "5506") 'valores a filtra
  ar2 = Array("B4", "B109", "B214", "B319") 'celda destino
  '
  sh1.Range("C:D").EntireColumn.Hidden = True
  '
  For i = 0 To UBound(ar1)
    tbl.Range.AutoFilter
    Set f = tbl.DataBodyRange.Columns(3).Find(ar1(i), , xlValues, xlWhole)
    If Not f Is Nothing Then
      tbl.Range.AutoFilter Field:=3, Criteria1:=ar1(i)
      tbl.DataBodyRange.Copy Sheets("Hoja2").Range(ar2(i))
    End If
  Next
  '
  sh1.Range("C:D").EntireColumn.Hidden = False
End Sub

Copia y pega lo que hay contenido y lo que no hay no pega. Pero...

la columna C estaba filtrado por “ok” y oculta, el filtrado se quita y se pone visible. Puse el filtro pero se quita después de la ejecución.

Tenia que copiar las celdas de contenido F:I y copia las columnas E:I

Imagino que eso tiene que ir si cumple la condición.

gracias por todo

Te recomiendo quitar las tablas y dejar los datos en rango de celdas. Es muy complicado trabajar con tablas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas