miércoles, 9 de febrero de 2011

VBA: Formas de copiar rangos o celdas.

Con asiduidad me llegan preguntas sobre la manera de copiar rangos o celdas de un lugar a otro de nuestros Libros de trabajos empleando macros. Por este motivo expondré con un ejemplo sencillo alguna de las formas más habituales en las que podemos conseguir un copiado de esos rangos de origen a uno de destino.
Para añadir un extra, le incorporaré una condición de pegado que controle que sólo se puede efectuar dicho copiado si algunas celdas no están vacías.


Algunas propiedades que también usaré en este ejemplo son:
  • Application.CutCopyMode = False: con la que deshabilitaremos el modo Cortar y Copiar.

  • Application.ScreenUpdating = False: desactiva la actualización de pantalla. Realiza todos los procesos sin que tengan un reflejo sobre lo que vemos.

  • Application.ScreenUpdating = True: activa dicha actualización de pantalla.

Los códigos VBA de nuestra macro son:

Sub copiados()
Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

Set HojaOrigen = Sheets(1)
Set HojaDestino = Sheets(2)

'con el If compruebo las condiciones previas a la ejecución del copiado y pegado
If HojaOrigen.Cells(2, 1).Value <> Empty And _
HojaOrigen.Cells(3, 1).Value <> Empty Then
Application.ScreenUpdating = False

'una forma empleando el método .Paste, con dos parámetros incompatibles
'o bien definimos Destination o bien Link

HojaOrigen.Cells(2, 1).Copy
ActiveSheet.Paste HojaDestino.Range("A2")
'con Link realiza un Pegar vínculo
HojaOrigen.Cells(3, 1).Copy
HojaDestino.Range("A3").Activate
ActiveSheet.Paste link:=True
'Realizamos un Pegado especial, en este caso como Pegar valores y Pegar fórmulas
HojaOrigen.Cells(2, 2).Copy
HojaDestino.Cells(2, 2).PasteSpecial Paste:=xlValues
HojaOrigen.Cells(3, 2).Copy
HojaDestino.Cells(3, 2).PasteSpecial Paste:=xlFormulas
'Con el método .Copy podemos indicar dónde deseamos nos copie el rango seleccionado
'realiza un copiado exacto (con formatos, fórmulas, etc)

HojaOrigen.Cells(2, 3).Copy Destination:=HojaDestino.Cells(2, 3)
HojaOrigen.Cells(3, 3).Copy Destination:=HojaDestino.Cells(3, 3)
'También podemos vincular valores o fórmulas relacionando diferentes celdas.
HojaDestino.Range("D2").Value = HojaOrigen.Range("D2").Value
HojaDestino.Range("D3").Formula = HojaOrigen.Range("D3").Formula

Application.ScreenUpdating = True
Application.CutCopyMode = False
End If
Set
HojaDestino = Nothing
Set
HojaOrigen = Nothing
End Sub


La macro es muy sencilla, empleando las diferentes instrucciones seleccionamos distintas celdas de la Hoja1, y se van copiando en la Hoja2 en las celdas elegidas por nosotros.


Es importante observad las propiedades de cada orden dada, y cómo unas de ellas realizan copiados exactos (incluyendo formatos, fórmulas, etc) y otras sólo son copiados de los valores elegidos. Dependerá de nuestros requerimientos que usemos unas u otras.
En nuestro caso, tras ejecutar la macro, obtenemos el siguiente resultado en la Hoja2:

272 comentarios:

  1. Buenas Tardes
    Encontre esta pagina que se me hace super necesaria que exista, eh estado buscando durante semanas una solucion a mi problema y se los comento.
    Soy muy inexperto en el tema de visual basic en excel, hace tiempo tenia un macro que em ayudaba a hacer todo esto que pido pero perdi todos mis archivos de la maquina y aunque pude recuperar varios archivos este no pude,
    tengo dos archivos, en uno tengo cientos de miles de personas que se identifican con un numero y estan en la columna A
    y el otro es un archivo que cambia cada mes y actualiza algunos de los clientes, entonces tengo qu buscar en el archivo master todo los clientes que se actualizan que a veces son miles y lo tengo que hace uno por uno
    Entonces pido su apoyo para una macro que me busque todos los clientes que tengo en la columna A del archivo master, los busque en la columna A del archivo nuevo y si lo encuentra que pegue lo que tenga en la celda siguiente, osea de la columna B, lo pegue en la columna B del archivo master
    Si quieren les mando un pedazo del archivo
    saludos y muchisimas gracias

    ResponderEliminar
  2. Hola, buenos días,
    tal cual planteas el problema, efectivamente podríamos optar por una macro de búsqueda... aunque, basicamente lo que haría sería replicar la función BUSCARV, de tal forma que buscara, cada código de cliente del archivo master, sobre el archivo que cambia cada mes, y devolviera el dato de la columna B. Es cierto que si tienes 'cientos de miles' de datos, seguramente se ralentice el cálculo, y por eso optases por una macro.
    Envíame un pequeño ejemplo a
    excelforo@gmail.com
    Slds

    ResponderEliminar
  3. Hola, tengo un problema con este tema de copiar y pegar. A ver si me podeis echar una mano.
    Necesitaria saber como pegar celdas en otra hoja de una en una pero que las ordene de la forma que yo le diga, por ejemplo:

    pegar en la celda b1 si no tiene nada despues en la b2 si b1 esta ocupada, despues c1 si b2 esta ocupada, despues c2 si c1 esta ocupada, despues d1 si c2 esta ocupada....pero siempre empezando por b1.

    ResponderEliminar
    Respuestas
    1. Hola,
      necesitaríamos una macro que determine, en el orden dado (B1, B2, C1, C2, D1, D2... ¿hasta donde?) si estas celdas tienen algún valor, es decir, si no están vacías.
      Esto lo podríamos hacer con un IF celda <>"" THEN copiar
      La cuestión sería encontrar una regla que facilite el paso por cada una de esas celdas (B1, B2, C1, C2, D1, D2...); o si fueran pocas, hacerlo a mano en nuestra macro.
      Intentaré a lo largo de la semana dar una solución.
      Slds

      Eliminar
    2. Hola ExcelForo, gracias por tu interés, te explico mi caso en concreto por si ves otra solucion.
      Tengo unas estanterias programadas con los datos de todos los palets, entonces cuando llega un camion para cargar mediante botones mando los palets a la hoja "camion",es ahí donde quiero que los ordene.Te pego la programacion que uso actualmente que me las va pegando pero siempre hacia abajo, lo unico seria que en vez de hacia abajo lo haga en el orden que le diga, a fin de simular la carga del camión, y se vea de un solo vistazo. Solo necesito que pegue unas treita celdas cada vez que lo utilize. por lo que se podria hacer a mano.Cada palet son 3 celdas de datos y tengo un boton en cada palet con esta programación:

      Application.ScreenUpdating = False
      Range("D26:D28").Select
      Selection.Cut
      Sheets("Camion").Select
      ActiveSheet.Range("B1").Select
      Selection.End(xlDown).Select
      Selection.Offset(1).Select
      ActiveSheet.Paste
      Sheets("CALLE 12").Select
      With Selection.Interior
      .Pattern = xlSolid
      .PatternColorIndex = xlAutomatic
      .ThemeColor = xlThemeColorDark1
      .TintAndShade = 0
      .PatternTintAndShade = 0
      End With
      Range("P37").Select

      Eliminar
  4. Muy bueno, pero necesitaba arrastrar una celda con fórmula hacia la derecha, pero siendo esta formula una importardatosdinamicos me copia la fórmula exactamente igual y me devuelve el mismo valor, seguiré buscando.

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      lo que ocurre con la fórmula IMPORTARDATOSDINAMICOS es que apunta a los nombres de los campos, y no a referencias de celda, por lo que no es una fórmula que se puede arrastrar sencillamente...
      en todo caso podrías reemplzar los nombres de campos por referencias a celdas...
      o referirte a la celda tipo A1.
      Slds

      Eliminar
  5. se puede hacer un copy a un mensaje de un msgbox ya que tengo un libro que si hay err0s los va mostrando en mensajes pero la idea es que al final cree una hoja con todos errores que se mostraron

    ResponderEliminar
    Respuestas
    1. Hola Gamf,
      espero estés bien.
      Podrías ir agregando los mensajes de error en una Collection o quizá una Array, para luego, mostrarlos en la hoja de cálculo recorriendo todos los elementos de esa Collection o Array, esto es, todos los errores...
      Claro que no sé que tipo de errores hablas...
      Un cordial saludo

      Eliminar
    2. gracias por tu respuesta , pero como agrego el array o una colletion en mi codigo , te agrego el codigo para que me des ua idea :
      Sheets("A01").Select
      If Cells(10, 5) > 0 Or Cells(11, 5) > 0 Or Cells(10, 10) > 0 Or Cells(11, 10) > 0 Then
      MsgBox "REM 01: Revise si corresponde el CONTROL PRECONCEPCIONAL en edades extremas (10 a 14 años y 45 a 54 años) (Sección A, Filas 10 y 11)"
      Range("C10:C11").Select

      Eliminar
    3. Hola Gamf,
      veo que sigues bien.
      por lo que entiendo, para ir copiando a otro libro el texto msgbox deberías ir agregando en celdas contiguas el cuerpo del mensaje.
      Por ejemplo, copiar el texto en la celda A1:
      hacer previamente variable el cuerpo
      dim texto01 as string
      texto01="REM 01: Revise si corresponde el CONTROL PRECONCEPCIONAL en edades extremas (10 a 14 años y 45 a 54 años) (Sección A, Filas 10 y 11)"
      Cells(rows.count,"A").End(xlUp).value=texto01

      Cordiales saludos

      Eliminar
    4. gracias..pero como defino la hoja donde se va a copiar?

      Eliminar
    5. Sheets("NombreHoja").Cells(rows.count,"A").End(xlUp).value=texto01

      Eliminar
    6. GRACIAS POR TU AYUDA , PERO NO ME GUARDA EL MSGBOX CREO QUE ALGO NO ME VALIDA...LA IDEA ES QUE CUANDO SALGA EL MSGBOX LO COPIE DE INMEDIATO EL LA HOJA ERRORES

      Eliminar
    7. Gracias…!!!Ahora si me resulto me va copiando los errores en otra hoja el único problema es que solo me los copia en la celda A1 como lo puedo hacer para que siga en la celda A2 y así sucesivamente.

      Eliminar
    8. Hola gamf,
      debes incluir la instrucción
      Sheets("NombreHoja").Cells(rows.count,"A").End(xlUp).offset(1,0).value
      esto hará que cada vez se situe en la última fila vacía de la columna A.
      Slds

      Eliminar
    9. ok , gracias , esta la remplazo por la Sheets("NombreHoja").Cells(rows.count,"A").End(xlUp).value=texto01

      Eliminar
    10. ahora si me resulto todo !!!muchas gracias por las repuestas y las aclaraciones.

      Eliminar
  6. hola tengo problema con esto, resulta que ala hora de pegar el contenido en las celdas de la otra hoja lo pega 2 veces y no se como solucionarlooo porfaaa ayudaa

    ResponderEliminar
    Respuestas
    1. Hola Adriana,
      verifica que no has repetido el código de pegado o que no está incluido en algún bucle...
      Cualquier instrucción de copiado y pegado de las expuestas en la entrada, obviamente, sólo pega una vez lo copiado.
      Ya me comentas...
      Slds

      Eliminar
  7. HOLAA EFECTIVAMENTE TENIA REPETIDO EL CODIGO, AHORA MI PROBLEMA ES CON UN FILTRO AVANZADO TENGO ESTA LINEA DE CODIGO

    Range("A2").Select
    Columns("A:K").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "M1:N2"), CopyToRange:=Range("Q1:AA1"), Unique:=False
    Application.CutCopyMode = False Range("A2").Select Sheets("Factura").Activate

    SELECCIONO EL DATO A FILTRAR DE UN LIST BOX QUE ALMACENO EN L2, LOS CRITERIOS SON N° ORDEN Y PRODUCTOR, CUANDO SELECCIONO EL NUMERO DEL LIST BOX ME LO COPIA EN EL RANGO DE CRITERIOS M2 Y NO ME FILTRA EL NOMBRE DEL PRODUCTOR, POR LO CUAL NO SE PUEDEN FILTRAR LOS DEMAS DATOS, AL EJECUTARLO ME DICE ERROR EN EL METODO RANGE GLOBAL.
    ESPERO ME PUEDAN AYUDAR Y GRACIAS DE ANTEMANO.

    ResponderEliminar
    Respuestas
    1. Hola Adriana,
      desgraciadamente es bastante normal que al emplear un Filtro avanzado en nuestras macros devuelva algún tipo de problema.
      Empieza por asegurarte que en el rango de criterios coinciden los rótulos con los de la base de datos; después asegúrate del tipo de formato de esos valores (si son texto o número), y luego, modifica el código poniendo
      CopyToRange:=Range("Q1")

      Ya me cuentas
      Slds cordiales

      P.D.: Por favor, evita escribir en mayúsculas, esto equivale a gritar ;-)

      Eliminar
  8. opss siento lo de las mayusculas¡
    y pues el problema era que habia anexado columnas y esto hacia que dejara de funcionar el filtro no se a que se deba pero lo deje como antes e hice modificaciones en los rango y ya quedo, y agradesco de su ayencion y ayuda :) buen dia¡

    ResponderEliminar
  9. Buenas noches.
    Agradezco el espacio para poder resolver tantas consultas, lo mio muy corto. Mediante un formulario BVA quiero que la información ingresada se pegue hacia abajo (textbok 1-2-3) según indica el dato ingresado en el textbok4 (Ej: pegar hacia abajo como valor 20 veces la info del textbok 1-2-3) la cantidad de veces va a depender del valor ingresado.
    Muchas gracias amigos, Saludos!

    ResponderEliminar
    Respuestas
    1. Hola,
      bueno muchas gracias, siempre es agradable el reconocimiento del trabajo realizado, y saber que mi aporte personal sirve a los demás.

      Respecto a tu pregunta, supongo tendrás en tu Userform además de los 4 textbox un CommandButton que ejecute la acción. Por tanto, asociado a este CommandButton incluirías el siguiente código:

      Private Sub CommandButton1_Click()
      For i = 1 To TextBox2.Value
      Cells(i, "A").Value = TextBox1.Value
      Cells(i, "B").Value = TextBox2.Value
      Cells(i, "C").Value = TextBox3.Value
      Next i
      End Sub

      Espero te oriente en lo que quieres.
      Slds

      Eliminar
  10. Funciona de maravilla!!.
    Lo único que me faltaría seria que reconozca la ultima celda utilizada en la columna D después de la D1 a la D8 (están vacías) y poder pegar en esa columna la info del formulario.
    Como siempre muy agradecido
    Fernando.

    ResponderEliminar
  11. Ejemplo: desde D1 a i8 celdas vacías, luego celdas con información desde D9 a la i2550, me gustaría que los datos se ingresen a partir de la celda D2251 a i2251 (según textbok del formulario) hacia abajo. y así sucesivamente pegar la información reconociendo la ultima celda utilizada cada vez que se presione el CommandButton.

    ResponderEliminar
    Respuestas
    1. Hola Fernando,
      la forma de identificar la última celda libre de la columna D, sería:
      Cells(Rows.count,"D").End(xlUp).offset(1,0).Select

      De esta manera siempre trabajaras con la última celda de la columna D (o sucesivas).
      Slds

      Eliminar
  12. Muchas pero muchas gracias.

    El codigo final es:
    Private Sub CommandButton1_Click()
    For i = 1 To TextBox1.Value
    Cells(Rows.Count, "D").End(xlUp).Offset(1, 0).Value = TextBox2.Value
    Cells(Rows.Count, "E").End(xlUp).Offset(1, 0).Value = TextBox3.Value
    Cells(Rows.Count, "F").End(xlUp).Offset(1, 0).Value = TextBox4.Value
    Cells(Rows.Count, "G").End(xlUp).Offset(1, 0).Value = TextBox5.Value
    Cells(Rows.Count, "H").End(xlUp).Offset(1, 0).Value = TextBox6.Value
    Cells(Rows.Count, "I").End(xlUp).Offset(1, 0).Value = TextBox7.Value
    Next i
    End Sub

    Saludos!

    ResponderEliminar
  13. hola nuevamente, quisiera saber si alguien me podria ayudar con algo de php y mysql, si saben de algun foro porfavor ayuda¡

    ResponderEliminar
  14. Hola

    Una pregunta, si mientras se ejecuta el copy/paste de la macro el usuario copia otra cosa (en otro documento o notepad), ¿fallara la macro de excel copiando lo qu eh acopiado el usuario?

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola bizen99,
      bueno, es una pregunta muy buena.
      Realmente al hacer con macros un Copy, efectivamente llevas al Portapapeles lo copiado, por lo que en teoría, al realizar el pegado siguiente (paste) se pegaría la última selección copiada.
      Lo que planteas es una posibilidad, pero si eres más rápido que la macro realizando la acción de copiado, lo que inicialmente se me hace complicado.

      También es cierto que existen formas de copiar y pegar en macros que salvan llevar lo copiado al portapapeles, y por tanto eliminan esa remota posibilidad de intercalar otro 'copiado' en la ejecución de la macro. Por ejemplo, de las posibilidades expuestas en esta entrada del blog:
      'HojaOrigen.Cells(2, 3).Copy Destination:=HojaDestino.Cells(2, 3)'.

      Slds

      Eliminar
  15. hola agradezco infinitamente este foro de maravilla; tengo una necesidad de copiar multiples celdas de un formato y pegarlo a un libro y una hoja especifica externa; ejemplo, archivo 1) llamado "formato" ( celdas A9, D10,A25 D10)COPIARLAS Y PEGARLAS AUTOMATICAMENTE A archivo 2) EXTERNO llamado "CONCENTRADO MENSUAL" HOJA (ENERO) CELDAS: A1,B1,C1,D1).
    Ojal y mi peticion se pueda lograr, si es asi, seria mi mejor regalo del 2013. y de mi parte recibiras bendiciones por tu aporte...saludos

    ResponderEliminar
    Respuestas
    1. Hola Ezequiel,
      si claro es posible.
      Supongo tendrás claro cuál es la ruta del fichero destino, por que se hace necesari abrir y cerrar el libro destino.
      El código sería de este estilo:
      Sub macrocopiar()
      Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

      Set HojaOrigen = ActiveWorkbook.Sheets("Hoja1")

      Workbooks.Open "E:\excelforo\CopiarBorrar.xlsx"
      Set HojaDestino = Workbooks("CopiarBorrar.xlsx").Sheets("Hoja1")

      HojaDestino.Range("A9").Value = HojaOrigen.Range("A9").Value
      HojaDestino.Range("D10").Value = HojaOrigen.Range("D10").Value
      HojaDestino.Range("A25").Value = HojaOrigen.Range("A25").Value

      Workbooks("CopiarBorrar.xlsx").Close SaveChanges:=True
      Set HojaOrigen = Nothing
      Set HojaDestino = Nothing

      End Sub

      Espero te sirva.
      Slds

      Eliminar
  16. GRACIAS POR TU PRONTA RESPUESTA, TENGO 2 DUDAS:
    1.-ME PERDI, EN POSICIONAR LOS NOMBRES DE LOS ARCHIVOS NO SE EN DONDE PONER LOS NOMBRES:
    EL ARCHIVO ORIGEN SE LLAMA (INVOICE)
    EL ARCHIVO DESTINO SE LLAMA (CONCENTRADO)
    LA RUTA ES LA CORRECTA.

    2.-ES UNA FACTURA DE 3 HASTA 80 PARTIDAS. DE TAL FORMA QUE TENGO RANGOS FIJOS LOS PRIMEROS 5. Y LOS DEMAS 9 SERIAN VARIABLES DEPENDIENDO DE LAS PARTIDAS .(ESTO CORRESPONDE A LOS TOTALES DE LAS FACTURAS) QUISIERA MANDARTE O PUBLICAR LOS ARCHIVOS DE EJEMPLO PERO NO VEO LA FORMA. DE COMO HACERLO.

    MUCHAS GRACIAS POR TU VALIOSO TIEMPO, Y QUEDO EN ESPERA DE TUS COMENTARIOS.

    SALUDOS



    Sub macrocopiar()
    Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

    Set HojaOrigen = ActiveWorkbook.Sheets("Hoja1")


    Workbooks.Open "C:\Documents and Settings\sancheez\Desktop\project\CONCENTRADO.xlsx"
    Set HojaDestino = Workbooks("CopiarBorrar.xlsx").Sheets("Hoja1")

    HojaDestino.Range("A2").Value = HojaOrigen.Range("J9").Value
    HojaDestino.Range("B2").Value = HojaOrigen.Range("H8").Value
    HojaDestino.Range("C2").Value = HojaOrigen.Range("B8").Value
    HojaDestino.Range("D2").Value = HojaOrigen.Range("B9").Value
    HojaDestino.Range("E2").Value = HojaOrigen.Range("B10").Value
    HojaDestino.Range("F2").Value = HojaOrigen.Range("A15").Value
    HojaDestino.Range("G2").Value = HojaOrigen.Range("A16").Value
    HojaDestino.Range("H2").Value = HojaOrigen.Range("A19").Value
    HojaDestino.Range("I2").Value = HojaOrigen.Range("E19").Value
    HojaDestino.Range("J2").Value = HojaOrigen.Range("K19").Value
    HojaDestino.Range("K2").Value = HojaOrigen.Range("K20").Value
    HojaDestino.Range("L2").Value = HojaOrigen.Range("I22").Value
    HojaDestino.Range("M2").Value = HojaOrigen.Range("K22").Value
    HojaDestino.Range("N2").Value = HojaOrigen.Range("M22").Value

    Workbooks("CopiarBorrar.xlsx").Close SaveChanges:=True
    Set HojaOrigen = Nothing
    Set HojaDestino = Nothing


    End Sub

    ResponderEliminar
  17. ya voy un poco mejor.. pero cuando quiero copiar otra factura, no me respeta la anterior,borra el contenido, de tal manera que no hay avance... y por otro lado cuando modifique mas partidas se modificaria las celdas de origen.. habra alguna forma de que que esto sea factible.. por ejemplo 1 factura es de 3 partidas, otra puede ser de 20, y la siguiente podria ser de 80,y es algo que no se puede definir.. habra algo para ello? en espera de tu apoyo.. y MUCHAS GRACIAS POR TU TIEMPO, SALUDOS

    EZEQUIEL

    P,D, TE COPIO COMO QUEDO HASTA EL MOMENTO

    Sub macrocopiar()
    Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

    Set HojaOrigen = ActiveWorkbook.Sheets("Hoja1")


    Workbooks.Open "C:\Documents and Settings\sancheez\Desktop\project\CopiarBorrar.xls"
    Set HojaDestino = Workbooks("CopiarBorrar.xls").Sheets("Hoja1")

    HojaDestino.Range("A2").Value = HojaOrigen.Range("J9").Value
    HojaDestino.Range("B2").Value = HojaOrigen.Range("H8").Value
    HojaDestino.Range("C2").Value = HojaOrigen.Range("B8").Value
    HojaDestino.Range("D2").Value = HojaOrigen.Range("B9").Value
    HojaDestino.Range("E2").Value = HojaOrigen.Range("B10").Value
    HojaDestino.Range("F2").Value = HojaOrigen.Range("A15").Value
    HojaDestino.Range("G2").Value = HojaOrigen.Range("A16").Value
    HojaDestino.Range("H2").Value = HojaOrigen.Range("A19").Value
    HojaDestino.Range("I2").Value = HojaOrigen.Range("E19").Value
    HojaDestino.Range("J2").Value = HojaOrigen.Range("K19").Value
    HojaDestino.Range("K2").Value = HojaOrigen.Range("K20").Value
    HojaDestino.Range("L2").Value = HojaOrigen.Range("I22").Value
    HojaDestino.Range("M2").Value = HojaOrigen.Range("K22").Value
    HojaDestino.Range("N2").Value = HojaOrigen.Range("M22").Value

    Workbooks("CopiarBorrar.xls").Close SaveChanges:=True
    Set HojaOrigen = Nothing
    Set HojaDestino = Nothing


    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Ezequiel,
      para nombrar los archivos debes tener en cuenta que la macro está en el libro origen, en tu caso 'Invoice', por tanto la definición de variables sería:
      Dim HojaOrigen As Worksheet, HojaDestino As Worksheet
      Set HojaOrigen = ActiveWorkbook.Sheets("Hoja1")
      Workbooks.Open "E:\excelforo\Concentrado.xlsx"
      Set HojaDestino = Workbooks("Concentrado.xlsx").Sheets("Hoja1")

      ten cuidado con los nombres de las hojas (tanto origen como destino).

      Respecto a la finalidad de la macro, es la primera noticia que tiene relación con una factura y que debe respetar valores anteriores o que las celdas a copiar pueden ser variables.
      Es importante plantear los problemas adecuadamente desde el principio, ya que las soluciones pueden cambiar drásticamente...

      El ejemplo sencillo que te adjunté obviamente responde a lo que decías, esto es, lleva el valor de una celda a otra de otro libro, y siempre al mismo sitio, si debe llevarse a lugares variables y no responde a algo definible, dificilmente se podrá definir con macros... al fin y al cabo una macro es una estructura de programación que replica un proceso definido (más o menos complejo).

      Slds

      Eliminar
  18. PARA LA COMUNIDAD ANEXO LA SIGUIENTE PROGRAMACION. YA FUNCIONANDO.

    PRIMERO QUIERO AGRADECER INFINITAMENTE TODAS LAS ATENCIONES A "EXCEL FORO", QUE HAN HECHO DESDE ESTE MOMENTO MI JORNADA DE TRABAJO MAS PLACENTERA.

    PARA LOS NUEVOS USUARIOS SE TRATA DE LO SIGUIENTE; HACER UNA COPIA DE VARIOS DATOS ESPECIFICOS (PARA EFECTOS DE REPORTES ESTADISTICOS), HACIA UNA HOJA EXTERNA (CERRADA UBICADA EN UNA RUTA ESPECIFICA),SE TRATA DE UNA FACTURA QUE GENERO DIARIO; EL ENCABEZADO SIEMPRE SON LOS MISMOS DATOS,SOLO LOS TOTALES SERIAN LOS DATOS CAMBIANTES.Y CON BASE EN ELLO, QUEDO DE LA SIGUIENTE MANERA:

    Sub macrocopiar()
    Dim HojaOrigen As Worksheet
    Dim HojaDestino As Worksheet

    Dim carton_boxes As String
    Dim wood_palets As String
    Dim total_pzas As String
    Dim total_bultos As String
    Dim k_total As String
    Dim lbs As String
    Dim valor_agregado As String
    Dim total_component As String
    Dim grand_total As String

    Set HojaOrigen = ActiveWorkbook.Sheets("Factura_UPC")

    Workbooks.Open "C:\Documents and Settings\sancheez\Desktop\project\LISTO\CopiarBorrar.xls"
    Set HojaDestino = Workbooks("CopiarBorrar.xls").Sheets("Hoja1")

    'Buscamos la etiqueta TOTAL PCS. y guardamos su valor adjunto en la variable total_pzas
    'Asignamos los valores alas variables carton_boxes, wood_palets y total_bultos usando como referencia TOTAL PCS.
    For i = 2 To 65536
    If HojaOrigen.Cells(i, "B") = "TOTAL PCS." Then
    carton_boxes = HojaOrigen.Cells(i - 4, "A").Value
    wood_palets = HojaOrigen.Cells(i - 3, "A").Value
    total_pzas = HojaOrigen.Cells(i, "A").Value
    total_bultos = HojaOrigen.Cells(i, "E").Value

    Exit For
    End If
    Next i

    'Buscamos la etiqueta K.TOTAL y guardamos su valor adjunto en la variable k_total
    For k = 2 To 65536
    If HojaOrigen.Cells(k, "J") = "K.TOTAL" Then
    k_total = HojaOrigen.Cells(k, "K").Value
    lbs = HojaOrigen.Cells(k + 1, "K").Value
    valor_agregado = HojaOrigen.Cells(k + 3, "K").Value
    total_component = HojaOrigen.Cells(k + 3, "I").Value
    grand_total = HojaOrigen.Cells(k + 3, "M").Value

    Exit For
    End If
    Next k


    For j = 2 To 65536
    If HojaDestino.Cells(j, "A") = "" Then
    HojaDestino.Cells(j, "A").Value = HojaOrigen.Range("J9").Value
    HojaDestino.Cells(j, "B").Value = HojaOrigen.Range("H8").Value
    HojaDestino.Cells(j, "C").Value = HojaOrigen.Range("B8").Value
    HojaDestino.Cells(j, "D").Value = HojaOrigen.Range("B9").Value
    HojaDestino.Cells(j, "E").Value = HojaOrigen.Range("B10").Value
    HojaDestino.Cells(j, "F").Value = carton_boxes
    HojaDestino.Cells(j, "G").Value = wood_palets
    HojaDestino.Cells(j, "H").Value = total_pzas
    HojaDestino.Cells(j, "I").Value = total_bultos
    HojaDestino.Cells(j, "J").Value = k_total
    HojaDestino.Cells(j, "K").Value = lbs
    HojaDestino.Cells(j, "L").Value = total_component
    HojaDestino.Cells(j, "M").Value = valor_agregado
    HojaDestino.Cells(j, "N").Value = grand_total

    Exit For
    End If
    Next j

    Workbooks("CopiarBorrar.xls").Close SaveChanges:=True
    MsgBox ("Se genero con exito el reporte")

    Set HojaOrigen = Nothing
    Set HojaDestino = Nothing

    End Sub


    SALUDOS, Y GRACIAS POR SU APOYO A EXCEL FORO.
    P.D. SI NECESITAN LOS ARCHIVOS CON GUSTO LOS PROPORCIONO. SALUDOS

    ResponderEliminar
  19. Hola ,
    para poder copiar y pegar de un archivo a otro pero con una celda vacia de por medio como le hago ?
    tengo activado esta manera

    Range(Selection, Selection.End(xlToRight)).Select

    pero solo me copia hasta la columna T ya que la columna U esta vacia, pero quiero que me copie hasta la X

    como le hago,

    muy buen blog

    ResponderEliminar
    Respuestas
    1. Hola,
      bueno, tendrías que 'atacar' a la última columna con datos por la izquierda.
      Prueba con
      Set celda = Cells(Selection.Row, Cells(Selection.Row, Cells.Columns.Count).End(xlToLeft).Column)
      Range(Selection.Address & ":" & celda.Address).Select

      Espero te sirva.
      Slds

      Eliminar
  20. Me ha sido de gran ayuda. Gracias.

    ResponderEliminar
  21. Hola, por favor necesito ayuda con lo siguente: tengo un libro con 235 hojas de las cuales necesito extraer el valor de la celda L5 de cada hoja hacia otro libro en el cual tengo una hoja dedicada a un listado de varios items, pero necesito que ese valor de L5 se me actualice en la hoja de listado, he estado vinculando manualmente la celda L5 pero son muchos items, en la hoja listado debo vincular otros datos mas que mas o menos es la misma modalidad. Hacerlo manualmente uno por uno me representa muchisimo tiempo porque la informacion me cambia dia a dia.
    Gracias por la atención y ayuda.

    ResponderEliminar
    Respuestas
    1. Hola,
      aunque se podría hacer con alguna fórmula, efectivamente 235 hojas parecen demasiadas...
      Te propondría una macro que recorra las hojas (y la celda L5) del primer libro, las 235 o las que sean, por ejemplo:
      Sub recorrerHojas()
      For i = 1 To Worksheets.Count
      MsgBox Sheets(i).Range("L5").Value
      Next i
      End Sub

      Combinándolo con alguna forma de copiado en el libro destino (puedes leer algunas en este mismo post).
      No sé como se forma ese listado final, por lo que no puedo indicarte mucho más... pero suponiendo que quieras poner un valor debajo del otro en alguna hoja del libro destino, podrías emplear algo parecido a esto:
      Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = Sheets(i).Range("L5").Value
      dentro del bucle anterior, y definiendo el destino correctamente.

      Espero te sirva
      Slds

      Eliminar
  22. Buenas noches. He creado una excel para el seguimiento del flujo de caja de la empresa. En una de las hojas, contiene la información relativa a las cuentas bancarias. He creado una excel que me permitiese actualizar la cantidad que tengo en los bancos (escribiendolo a "manubrio") y la macro copia esos datos y los pega en una tabla diaria. Mi problema surge cuando al día siguiente, utilizo esa misma macro, copia los datos de "mañana" y los pega nuevamente en la celda del día anterior, perdiendo de esta manera los datos anteriores.

    Necesito que la macro me permitiese pegar la informacion seleccionada en un la columna siguiente correspondiente al dia.

    Más sencillo, copio celdas y me lo pega siempre en el mismo rango de celdas. NECESITO QUE CADA DÍA SEA LA COLUMNA SIGUIENTE. hoy en S55, mañana en T58....asi sucesivamente.

    La macro hace la misma operación pero 3 veces.



    Sub Macro1()
    '
    ' Macro1 Macro
    '
    ' Acceso directo: CTRL+k
    '
    Range("D51:D55").Select
    Selection.Copy
    Range("S51").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=6
    Range("D58:D62").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("S58").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=6
    Range("D65:D69").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("S65").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=-15
    End Sub


    Muchisimas gracias de antemano por sus gestiones y por su respuesta.


    Un saludo desde Estambul.

    De un "expatriado"....

    Carlos

    mi email: c.utrilla.guerrero@gmail.com

    ResponderEliminar
    Respuestas
    1. Hola Carlos,
      me parece que lo más sencillo sería que aplicaras el método final en tu macro para pegar siempre lo copiado en la última celda libre de la columna S sea cual sea S51, S58, S65 u otra...
      El código sería de este estilo

      Range(rango a copiar).Copy
      Range("S" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues

      Controlar el rango a copiar es lo que se me escapa en tus explicaciones...
      Espero te oriente lo suficiente.
      Un cordial saludo

      Eliminar
  23. Hola Ismael.

    Muchas gracias por contestarme. Aún me sigue sin funcionar.....el rango que quiero copiar va de D51:D55 y lo pego en U51:U55....y mañana en V51:V55....y pasado W51:W55.... :)

    Me sigue sin funcionar:

    Range("D51:D55").Select
    Selection.Copy
    Range("T51").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=6
    Range("D58:D62").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("T58").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=6
    Range("D65:D69").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("T65").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWindow.SmallScroll Down:=-15


    Range("S" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
    End Sub

    ResponderEliminar
  24. Sabes que pasa? que tengo fórmulas y números entonces, si a la macro le ordeno que me lo pegue en la primera fila libre, me lo pega abajo del todo....y a mi me interesa que pegue en horizontal....es decir a la derecha del rango U51:U55 está libre

    ResponderEliminar
    Respuestas
    1. Hola Carlos,
      bueno, entonces el sistema sería igual pero por columnas, en lugar de filas:
      Range(rango a copiar).Copy
      Cells(51, Columns.Count).End(xlToLeft).Offset(0, 1).PasteSpecial Paste:=xlPasteValues

      Irá 'corriendo' hacia la derecha en la última columna libre.

      La ideaes similar.
      Slds

      Eliminar
    2. TOMAAAAA YAA!!!! NO SABES LO FELIZ QUE ME HAS HECHO....no te haces la idea de lo que has conseguido.... :)

      Otra cuestion (intentaré ser muy conciso y solo comentandote lo que necesito a nivel excel)

      xej:

      A1 tengo una formula sencilla: (D2-D1)/D1

      Necesito que esa fórmula tb se actualice diariamente. Es decir que cada día cambia a la derecha: (E2-E1)/E1...el siguiente día con F...sig G....y asi sucesivamente. Así conseguiría el analisis de desviación de la estimación.

      Lo chungo es ¿cómo cambiar dicha fórmula cada día en la misma celda A1? vincularla con la formula hoy()???

      ya me dirás....

      si no te aclaras, te puedo mandar el archivo y me comentas mejoras....

      Muchas gracias de verdad....no sé como no me haces pagar por este servicio tan....desinteresado y a la vez interesado sin beneficio alguno para vos....

      Eliminar
    3. Hola Carlos,
      me alegra te sirviera la idea ;-)
      Respecto a la nueva cuestión, si sólo te interesa conocer el valor de esa fórmula podrías aplicar un métoso parecido al anterior para localizar esas celdas de la última columna.
      Tendrías algo simialr a esto:
      Range("A1").Value= (Cells(2, Columns.Count).End(xlToLeft).Value-Cells(1, Columns.Count).End(xlToLeft).Value)/Cells(1, Columns.Count).End(xlToLeft).Value

      Así cada vez que activaras tu macro cambiaría el dato de A1 por el correspondiente a la última columna con datos.

      Saludos!!

      Eliminar
    4. Para ser más exactos y hacerlo perfecto voy a explicarlo mejor:

      E43:E48 tengo metida la fórmulas (=(D43-S43)/D43); (D44-S44)/D44 ; =(D45-S45)/D45, =(D46-S46)/D46; =(D47-S47)/D47; =(D48-S48)/D48 (es decir, baja cada fila según la cta bancaria a estudiar)


      Resulta que en la columna de las D tengo los datos que se me actualizan con la anterior Macro con lo cual se me actualiza cada día.

      Lo que necesito es:

      Cada siguiente día, mantener la columna [D45:D47] en la fórmila pero cambiar las S.

      De esta forma quedaría para el día siguiente;
      Siempre en el mismo rango: E45:E48 . Las fórmulas:

      (=(D43-S43)/D43); (D44-T44)/D44 ; =(D45-T45)/D45, =(D46-T46)/D46; =(D47-T47)/D47; =(D48-T48)/D48

      AL siguiente día con U, siguiente con V etc, etc...

      Ya si me lo "apañas"....tendría que invitarme por lo menos a unas cervezas!!

      Un saludo,

      Carlos

      Eliminar
  25. Hola Carlos,
    yo iría a lo sencillo, ya que son sólo 5 fórmulas, y pondría un código similar al anterior. Y si he entendido bien sería (mantengo el valor de D y varía a la última columna T por U, por V, etc:
    Range("E43").Value= (Cells(43, "D").Value-Cells(43, Columns.Count).End(xlToLeft).Value)/Cells(43,"D").Value
    y así para los cuatro restantes...

    Pruébalo, y si no te va bien, envíamelo a
    excelforo@gamil.com

    Slds

    ResponderEliminar
  26. Hola Ismael
    Tengo una duda como haria para copiar un rango de celdas cada cierta cantidad de filas y hacerles un subtotal y al final totalizarlas.:

    ResponderEliminar
  27. Me exprese mal Disculpa lo que deseo es lo siguiente:
    tengo una hoja con un titulo de 2 filas (A1:J2) y una x cantidad de datos, en las columnas H,I,J tengo valores, quiero hacer un quiebre de pagina cada 24 filas que me sume por pagina, y se muestre el resultado, en la siguiente hoja que aparezca el mismo titulo y debajo del titulo el mismo importe de la hoja anterior y asi sucesivamente hasta obtener un total, Gracias por tu tiempo y ayuda.

    ResponderEliminar
    Respuestas
    1. Hola!,
      bueno, puedes echar un vistazo a esta entrada del blog:
      http://excelforo.blogspot.com.es/2011/09/anadir-un-suma-y-sigue-al-final-de-cada.html

      En tu caso, la fórmula sería:
      =ENTERO((FILA()-3)/20)
      a incluir en la columna K (desde K3)
      podrás ver un ejemplo de lo que quieres...
      Slds cordiales

      Eliminar
  28. Hola!
    Soy nueva en esto de Excel y macros y me gustaría saber cómo puedo hacer para copiar filas existentes en una Hoja1, hacia una Hoja2 la cual tiene un formato preestablecido, por lo que en el momento de pegar la información necesito saltarme algunas columnas en la Hoja2. Por ejemplo, copiar la información de la Hoja1 de las celdas A1,A2,A3,A4,A5,A6,A7,A8,A9... y pegarlas en la Hoja2 en A1, A2,(se salte A4,A5,A6,A7) y continue pegando A8, A9 ...

    Si existe una manera gráfica de hacerlo sería una excelente opción y si no pues de que manera podría realizarlo con una macro.

    Saludos!

    ResponderEliminar
    Respuestas
    1. Hola,
      lo malo de tu planteamiento es que probablemtne no exista un aregla fija para saltarse ciertas filas, a la hora de pegar en la hoja2 las celdas de la hoja1. Por lo que no te quedará más remedio que ir indicando los vínculos uno a uno o en todo caso ir arrastrando por tramos (de A1 a A2, de A8 a A13, etc).

      Con macros pasa algo similar, sin una regla no es posible automatizarlo, por lo que también habría que hacerlo de manera manual, siguiendo algunos de los métodos explicados en
      http://excelforo.blogspot.com.es/2011/02/vba-formas-de-copiar-rangos-o-celdas.html

      Lo siento
      Slds

      Eliminar
  29. necesito urgente ayuda tengo una hoja con información en donde necesito que el usuario seleccione marcando con X y a su vez deseleccione la opción bajo la siguiente función:
    If Target = "" Then
    Target = "X"
    Exit Sub
    End If
    If Target = "X" Then
    Target = ""
    Exit Sub
    End If
    pero necesito que esto se aplique solo desde la celda F4 hasta la celda AO2731 y no se como limitarlo, aclaro que no soy experta en Excel solo necesito los comando para limitar la función de seleccionar con X en las celdas que menciones, si alguien puede ayudarme por favor. Lucydgr@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola Lucy,
      ya te he contestado por G+, pero te copio aquí también el código:
      Sub macro1()
      For Each celda In Range("A1:B10")
      If celda.Value = "" Then
      celda.Value = "X"

      ElseIf celda.Value = "X" Then
      celda.Value = ""

      End If
      Next celda
      End Sub

      Slds

      Eliminar
  30. Hola Ismael:
    Felicidades por tu extraordinario foro, pero sobre todo por ser una extraordinaria persona que ayuda a los demás, ya estarás siendo recompensado por eso-
    Ojala puedas ayudarme:
    Tengo una lista de datos en la columna A, haz de cuenta una lista de un directorio de alumnos, por bloques (nombre, calle, colonia, ciudad, país, grado escolar), separado por renglones vacíos, no todos los bloques tienen la misma cantidad de información, y deseo poner en forma de base de datos de forma horizontal, o sea transponerla, me puedes ayudar con la macro por favor?

    ResponderEliminar
    Respuestas
    1. Hola Horacio,
      muchas gracias por tus palabras.. de verdad que se agradece escucharlas.

      Respecto a tu problema, no se si tienes toda la información e una misma columna con algún separador, si fuera el caso, lo primero sería aplicar la herramienta Texto en Columna para separar por campos la información.
      Para transponer información selecciona el rango original, lo copias y tras indicar la celda destino, seleccionas Pegar > Pegado especial > opción Transponer.
      Asi se convertirán en horizontal lo que fuera vertical y viceversa.

      Espero te resulte.
      Slds cordiales

      Eliminar
    2. Hola Ismael:
      Muchas gracias por tu pronta respuesta.
      Así es toda la información esta en una sola columna y la información esta en las filas hacia abajo, la instrucción que me das es correcta, lo inconveniente es que son 5,000 alumnos, grabe una pequeña macro pero no se como decirle que se siga con la información hacia abajo.

      Range(Selection, Selection.End(xlDown)).Select
      Selection.Copy
      Range("B4").Select
      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
      False, Transpose:=True
      Selection.End(xlToLeft).Select
      Selection.End(xlDown).Select
      Selection.End(xlDown).Select
      Range("A13").Select
      Range(Selection, Selection.End(xlDown)).Select
      Application.CutCopyMode = False
      Selection.Copy
      Range("B12").Select
      Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
      False, Transpose:=True
      End Sub

      El problema que tengo es que siempre me hace las celdas asignadas, ¿cómo le digo que continué con los siguientes bloques de información, algo así como ejecuta nuevamente pero el range ya no es ("B4"), es uno nuevo abajo que tiene datos pero se desconoce su celda, espero haberme explicado.

      De todas formas muchas gracias y te vuelvo a felicitar.

      Eliminar
    3. Hola Horacio!
      mejor envíame si puedes el fichero a
      excelforo@gmail.com
      necesito ver los datos y cómo están colocados para poder darte una respuesta...
      Slds

      Eliminar
  31. Hola Ismael, antes que nada enhorabuena por el blog y gracias por toda la ayuda que nos brindas a todos.Espero que me puedas ayudar, necesito que cada vez que pulse un botón pueda copiar y pegar a la vez los valores de 2 rangos de celdas de una misma hoja. Los rangos para copiar serían estos 2: primer rango para copiar sería Z597:AD597 y segundo rango Z600:AA600. Para pegarlos necesito que el primer rango copiado se pegue siempre en este rango L?:P? y el segundo rango copiado se pegue en este rango Q?:R? . A los números de la filas de los rangos para pegar observarás que le he puesto interrogación y es porque quiero que cada vez que haga click en el botón, primero copie ambos rangos que anteriormente he descrito y cuando vaya a pegar los 2 rangos copiados me detecte la primera fila que este vacia y desde esa fila pegue allí los 2 rangos copiados y así sucesivamente con las siguientes filas vacias.. La primera fila vacia en mi caso ahora mismo es fila 602, por tanto, se tendria que copiar los valores del primer rango Z597:AD597 y pegarlo en este otro rango L602:P602. El segundo rango a copiar sería Z600:AA600 y se pegaría a Q602:R602 y asi con filas vacias siguientes como 603,604,etc...

    ResponderEliminar
    Respuestas
    1. Hola Andrés,
      gracias por tus palabras.
      Prueba con este código:
      Sub COPIADOS()
      Set origen1 = Sheets("Hoja1").Range("Z597:AD597")
      Set origen2 = Sheets("Hoja1").Range("Z600:AA600")

      Set destino1 = Sheets("Hoja1").Range("L" & Rows.Count).End(xlUp).Offset(1, 0)
      Set destino2 = Sheets("Hoja1").Range("Q" & Rows.Count).End(xlUp).Offset(1, 0)

      origen1.Copy destino1
      origen2.Copy destino2
      End Sub

      y luego lo asocias a un botón.
      Espero te sirva
      Slds cordiales

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Gracias Ismael por tú ayuda y por tú tiempo, he probado el código y funciona correctamente!! .Lo único que para que me quede perfecto como yo deseo es que cada vez que copie y pegue nuevamente no me modifique las celdas pegadas de las filas anteriores. Las celdas que componen los rangos para copiar Z597:AD597 y Z600:AA600 son celdas que contienen una fórmula cada una, entonces el código para la macro del botón lo que hace es copiar y pegar la fórmula (que es correcto y me funciona dando el resultado) pero yo sólo quiero que me pegue el resultado de la fórmula y no la fórmula, de esta manera ya no me modificaría las celdas pegadas de filas anteriores al copiar y pegar en filas nuevas vacías.

      Ejemplo:

      En la celda Z597 contiene la fórmula =BUSCARV($Z$596;$Z$603:$AB$652;3;FALSO) y el resultado que aparece en celda Z597 proveniente de la formula es 10 , pues yo quiero que sólo me copie a la celda L602 el número 10 y no aparezca el resultado de la formula, es decir, sólo quiero que copie y pegue el valor numérico sin fórmula ¿Se podría hacer esto que deseo?

      Estas son todas las fórmulas que contienen las celdas de los 2 rangos:
      Rango 1 ---> Z597:AD597

      Z597 =BUSCARV($Z$596;$Z$603:$AB$652;3;FALSO)
      AA597 =BUSCARV($AA$596;$Z$603:$AB$652;3;FALSO)
      AB597 =BUSCARV($AB$596;$Z$603:$AB$652;3;FALSO)
      AC597 =BUSCARV($AC$596;$Z$603:$AB$652;3;FALSO)
      AD597 =BUSCARV($AD$596;$Z$603:$AB$652;3;FALSO)

      Rango 2 ---> Z600:AA600

      Z600 =BUSCARV($Z$599;$Z$657:$AB$667;3;FALSO)
      AA600 =BUSCARV($AA$599;$Z$657:$AB$667;3;FALSO)

      Saludos!

      Eliminar
    4. Hola Andrés,
      sólo sigue las indicaciones de este mismo Post, donde se explica cómo pegar como valores (.PasteSpecial), modificando las líneas de código que comenté en el correo anterior
      origen1.Copy destino1
      origen2.Copy destino2

      por
      origen1.Copy
      destino1.PasteSpecial Paste:=xlValues
      origen2.Copy
      destino2.PasteSpecial Paste:=xlValues


      Slds

      Eliminar
    5. Muchas gracias de verdad Ismael por todo!! Finalmente funciona como yo quiero. Saludos y buen trabajo!!

      Eliminar
  32. Gracias por el Tutorial, pero yo tengo un problema, tengo un archivo de excel con columnas numeradas del 1 al 31 del mes, y necesito copiar las primeras tres columnas que la info no cambia, y copiar las dos columnas siguientes, pero estas dos columnas van cambiando conforme el dia, por ejemplo hoy necesito copiar el dia 10 y 11, mañana el 11 y 12, y asi sucesivamente... espero me haya explicado bien y alguien pueda ayudarme...

    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola Jim,
      obviamente deberás trabajar con variables y no con rangos fijos a la hora de realziar los copiados.
      Bien sobre la hoja de cálculo o con algún control tendrás que indicar qué Dias (columnas) quieres copiar, para luego referirte a esa indicación y poder aplicar alguna de las formas de copiado explicado.
      Sin más datos no puedo concretar más.

      Slds cordiales

      Eliminar
  33. Muy buena pagina, me ha servido de mucho. Tengo una consulta, quisiera saber si es posible mediante una macro poder hacer una búsqueda en un libro de rangos por nombres, algo así como la función "buscarv", pero para nombres de rangos ya establecidos. Todos los diferentes rangos están en la columna "A". Esto mediante una una macro.

    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Fernando...
      todo es posible con macros, pero también en muchos casos empleando la funcionalidad estándar de Excel sobre la hoja de cálculo.
      Para trabajar sobre rangos podrías emplear la función INDIRECTO.

      Para emplear macros necesitaría saber exactamente la distribución de rangos con nombres y cómo realziar esa 'búsqueda'.

      Slds

      Eliminar
    2. Gracias por la pronta respuesta, ya vi la funcion INDIRECTO que me recomendaste, pero creo que no me va a resultar util en lo que requiero por lo que paso a explicarme mejor

      En la hoja1 tengo una serie de datos en la columna A con diferentes rangos con nombres por ej: A1:A10 (rango1), A20:A30 (rango2), etc...
      En la hoja2 necesito que al escribir en B2 "rango1", me regresa en C2:C11 los valores del rango A1:A10. Si escribo en B2 rango2 me regresa en C2:C11 los valores del rango A20:A30, y asi por el estilo.

      Enfatizo que lo que necesito es que me regrese todos los valores del rango al indicarle el nombre del mismo

      Es posible algo asi?

      Gracias de antemano por la atención a mi solicitud

      Eliminar
    3. Hola Fernando,
      pues sigo creyendo es posible con INDIRECTO.
      Tengo que suponer todos los rango son de igual tamaño, puesto que se deben devolver al rango C2:C11 (1 columna x 10 filas). Los rangos son A1:A10 (con Nombre defindio 'rango1'), A20:A29 ('rango2'), etc...
      en B2 despliegas los Nombres.
      Bien.
      Ahora seleccionas el rango de celdas destino C2:C11 y en la celda activa C2 escribes =INDIRECTO(B2) y presionas Ctrl+Mayusc+Enter (es decir, ejecutas matricialmente)...
      Listo, al cambiar B2 en C2:C11 veras los valores correspondientes a ese rango.

      si los rangos de origen (rango1, rango2, etc) fueran de diferente tamaño, simplemente selecciona el rango destino con el mayor tamaño C2:C50, repitiendo las acciones... a posteriori formatea condicionalmente para ocultar las celdas con error #N/A

      Slds cordiales

      Eliminar
    4. Muchas gracias por las respuestas, en verdad lo agradezco.
      Leyendo esta pagina he podido hacer un "frankenstein" de macro,y pues se las dejo por si alguien mas le puede servir:

      Sub CopiarRangos()
      Dim miRango As String
      miRango = Range("B2").Value
      Worksheets(1).Select
      Range(miRango).Select
      Selection.Copy
      Worksheets(2).Select
      ActiveSheet.Range("C2").Activate
      ActiveSheet.Paste link:=True
      End Sub

      Básicamente lo que hace es: en la hoja 2, en "C2", me regresa el rango cuyo nombre coloco en B2 de la misma hoja, si cambio el nombre y ejecuto la macro nuevamente, cambia el rango.

      Para lograr esto,inicialmente tiene que haber rangos con nombres en la hoja 1

      Esto rutina la he logrado gracias a los posts de arriba

      Gracias!!!

      Eliminar
  34. Ismael, buenas tardes.
    Nuevamente los paso a visitar por ser un excelente foro, mi consulta es la siguiente:
    tengo algunas celdas seleccionadas en la columna B (celdas variables) y quiero pegar un valor en las mismas celdas (filas) pero en la columna D, ejemplo: seleccionadas B4,B8,B12 y quiero pegar en D4,D8,D12
    He tratado de utilizar la funcion offset pero no logro ajustarla a lo que necesito.

    ResponderEliminar
    Respuestas
    1. Hola Fernando Enrique,
      que yo sepa no es posible realizar un pegado de rangos discontinuos guardando la 'relatividad', según planteas tu...
      Otra cosa es que puedas referenciar desde D4,D8 y D12 a sus celdas respectivas B4,B8 y B12.
      Como entiendo que no es lo que necesitas, tendría que ver tu hoja de cálculo, y cuáles son esos rangos, y probablemente realizar alguna macro que realice esa acción.
      Si quieres envíame el fichero par que le eche un vistazo a
      excelforo@gmail.com
      Slds cordiales

      Eliminar
  35. Hola Ismael, EXCELente blog, y de antemano gracias por la ayuda que nos proporcionas.

    Estoy realizando una macro, pero en este momento estoy atorado con una cuestión.

    Tengo datos en las columnas A hasta la L, en la primera fila tengo encabezados y a partir de la fila A2 a L2, hacía abajo, (aproximadamente 34 000 filas), datos.

    Los datos se filtran por la columna D. En la columna A tengo datos de fecha y hora, que quiero copiar para buscar este dato en otra hoja.
    Pero necesito desplazarme verticalmente sobre la columna A, celda por celda de forma recursiva. Esto es, copiar solo el dato filtrado en A(x) e ir a la hoja1, buscar dicho dato, regresar a la hoja2 con los datos filtrados y tomar ahora el dato de la celda siguiente A(y) y de nuevo ir a la hoja2 y buscar el siguiente dato y así sucesivamente hasta terminar con el último dato visible de la columna A.

    Se que tengo que utilizar “SpecialCells(xlCellTypeVisible)”, pero todo intento que he realizado me copia toda la línea y solo quiero la celda A(n).

    Espero me puedas orientar y decirme como hacer lo que necesito.
    De ante mano gracias por todo el apoyo que me puedas dar. Gracias.

    ResponderEliminar
    Respuestas
    1. Muchas gracias, me alegra que te haya podido servir alguna vez mis explicaciones.

      Respecto a tu cuestión, no me queda claro si una vez filtrado los datos por valores de la columna D, copias el campo 'columna'(fechas) sólo, o luego de tu copiado en otra hoja vuelves a por los demás datos del mismo registro, o el resto de datos (una vez pegado los datos de fechas) los buscas en otro lugar....

      Lo primero que te diría, en todo caso, es que puedes conseguir lo mismo empleando el filtro avanzado (sin macros.. o con macros).
      También podrías sólo con macros recorrer el rango D2:D34000 determinando que valores cumplen la condición del filtro, y sólo llevarte aquellas Fechas de la columna A que en D sí verifiquen...

      Mi recomendación, si he entendido correctamente, sería aplica filtros avanzados (copiando datos en otra hoja destino).

      Espero te sirva algo de lo comentado.
      Slds cordiales

      Eliminar
  36. Estimados, necesito ayuda para crear una macro en Excel 2010, que copie un rango de celdas de un archivo a otro, y cuando vuelva a correr la macro que solo copie los datos desde la última copia. Además, que los pegue a continuación de los datos que tengo incorporado en la hoja de destino

    ResponderEliminar
    Respuestas
    1. Hola,
      entiendo que el problema lo tienes al copiar la última fila y pegarlo a continuación del último pegado.
      Si es así deberías usar, por ejemplo, el método .End para seleccionar el rango correcto.
      Puedes ver un ejemplo de este método en
      http://excelforo.blogspot.com.es/2011/09/vba-macro-para-rellenar-celdas-en.html
      o también
      http://excelforo.blogspot.com.es/2011/09/vba-como-insertar-filas-el-metod-insert.html

      Espero te sirva.
      Slds

      Eliminar
  37. Hola buen dia, estoy iniciando a ver consultas sql y quisiera saber si las puedo utilizar dentro del mismo Excel tomando una la "hoja1" como la base de datos ?

    ResponderEliminar
    Respuestas
    1. Hola,
      que yo sepa Excel no admite SQL para trabajar de manera interna... si he visto alguna vez emplearlo dentro de procedimientos de VBA para acceder a base de datos externas (que si reconozcan tal lenguaje-como Access, por ejemplo).

      Para trabajar dentro de Excel deberás emplear bien el estándar de la hoja de cálculo (fórmulas, funciones, etc), bien programación VBA o tal vez, depende de tu estructura de datos el complemento PowerPivot (si trabajas con Excel 2010 o 2013).

      slds

      Eliminar
  38. hola Ismael! Muchas gracias por todas las aportaciones que has hecho a través de este foro, te dejo una duda esperando que me puedas ayudar, tengo un archivo con determinado numero de hojas y quiero que me copie solo un rango de datos (variable) a una hoja dentro del mismo archivo, estoy intentando hacer una macro basada en un tutorial que me encontré utilizando un formulario para solo capturar el rango de celdas y darle copiar pero de una manera u otra no logro hacerlo funcionar, cabe señalar que soy principiante en esto de las macros y no estoy del todo familiarizada con el lenguaje vba... te dejo una copia del lenguaje del formulario original para ver si me puedes ayudar a modificarlo...
    Muchas gracias!
    Private Sub cmdcopiar_Click()
    Dim hoja1origen As String
    Dim hoja2origen As String
    Dim hoja3origen As String
    Dim hoja4origen As String
    Dim hoja5origen As String
    Dim hoja6origen As String
    Dim hoja7origen As String
    Dim hoja8origen As String
    Dim hoja9origen As String
    Dim hoja10origen As String
    Dim hoja11origen As String
    Dim hoja12origen As String
    Dim hoja13origen As String
    Dim hoja14origen As String
    Dim hoja15origen As String
    Dim hoja16origen As String
    Dim filaorigen As Double
    Dim columnaorigen As Double
    Dim filadestino As Double
    Dim columnadestino As Double
    Dim hojaorigen As String
    Dim hojadestino As String
    Dim valorcelda As String




    hoja1origen = optorigen1.Value
    hoja2origen = optorigen2.Value
    hoja3origen = optorigen3.Value
    hoja4origen = optorigen4.Value
    hoja5origen = optorigen5.Value
    hoja6origen = optorigen6.Value
    hoja7origen = optorigen7.Value
    hoja8origen = optorigen8.Value
    hoja9origen = optorigen9.Value
    hoja10origen = optorigen10.Value
    hoja11origen = optorigen11.Value
    hoja12origen = optorigen12.Value
    hoja13origen = optorigen13.Value
    hoja14origen = optorigen14.Value
    hoja15origen = optorigen15.Value
    hoja16origen = optorigen16.Value

    hoja1destino = optdestino1.Value

    filaorigen = txtfilaorigen.Value
    columnaorigen = txtcolumnaorigen.Value

    filadestino = txtfiladestino.Value
    columnadestino = txtcolumnadestino.Value

    If hoja1origen = "Verdadero" Then
    hojaorigen = "01"

    ElseIf hoja2origen = "Verdadero" Then
    hojaorigen = "02"

    ElseIf hoja3origen = "Verdadero" Then
    hojaorigen = "03"

    ElseIf hoja4origen = "Verdadero" Then
    hojaorigen = "04"

    ElseIf hoja5origen = "Verdadero" Then
    hojaorigen = "05"

    ElseIf hoja6origen = "Verdadero" Then
    hojaorigen = "06"

    ElseIf hoja7origen = "Verdadero" Then
    hojaorigen = "07"

    ElseIf hoja8origen = "Verdadero" Then
    hojaorigen = "08"

    ElseIf hoja9origen = "Verdadero" Then
    hojaorigen = "09"

    ElseIf hoja10origen = "Verdadero" Then
    hojaorigen = "10"

    ElseIf hoja11origen = "Verdadero" Then
    hojaorigen = "11"

    ElseIf hoja12origen = "Verdadero" Then
    hojaorigen = "12"

    ElseIf hoja13origen = "Verdadero" Then
    hojaorigen = "13"

    ElseIf hoja14origen = "Verdadero" Then
    hojaorigen = "14"

    ElseIf hoja15origen = "Verdadero" Then
    hojaorigen = "15"

    ElseIf hoja16origen = "Verdadero" Then
    hojaorigen = "16"

    End If

    If hoja1destino = "Verdadero" Then
    hojadestino = "17"

    End If

    Sheets(hojaorigen).Select
    valorcelda = Cells(filaorigen, columnaorigen)
    Sheets(hojadestino).Select
    Cells(filadestino, columnadestino) = valorcelda


    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Luz,
      mejor envíame el ejemplo a
      excelforo@gmail.com
      para que pueda comprobar el formulario que indicas,y qué quieres copiar y pegar dónde.
      Un saludo

      Eliminar
  39. Hola Ismael buenas noches.

    Tengo un macro "registrar" que me copia ciertas celdas de la hoja 1 a la hoja 2.

    Y quiero hacer otro que borre los datos registrados por el macro "registrar" en caso de que haya ingresado mal un dato y lo haya registrado..

    Espero me haya dado a entender.

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Alejandro,
      parece que esta opción sólo podría añadirse como control al final de tu primera macro 'registrar', que desahaga la acción de pegado última...
      El problema de hacerlo a posteriori sería identificar qué registros fueros copiados y pegados en la última ejecución.. pero si fuera identificables por fecha o algún otro campo, podrías hacer un bucle o búsqueda que recorra los registros destino (donde hayas pegado) y los elimine... normalmente, al intentar eliminar, es preferible comenzar eliminando filas desde abajo, esto es, por ejemplo, con un loop for i=100 to 1 step -1

      Espero te oriente en algo.
      Saludos cordiales

      Eliminar
  40. Ismael, buenas tardes, te agradezco que tengas este foro, nos ayuda mucho. Tengo una pregunta:
    Tengo seleccionado un rango de celdas, y necesito una macro que para cada celda seleccionada me haga las funciones de "F2+ENTER"
    Espero contar con tu valiosa ayuda

    ResponderEliminar
    Respuestas
    1. Muchas gracias Fernando,
      yo probaría primero con:
      Sub Macro2()
      Dim rngCell As Range
      For Each rngCell In Range("B1:B6") '.SpecialCells(xlCellTypeFormulas)
      rngCell.Calculate
      Next rngCell
      End Sub

      si no te funciona podrías probar con
      Sub test()
      For Each celda In Range("B1:B6")
      celda.Select
      SendKeys "{F2}+{ENTER}", True
      Next celda
      End Sub

      La segunda en general el método SendKeys no es muy recomendable...
      Espero alguna te sirva.
      Saludos

      Eliminar
  41. Hola Ismael: necesito copiar un rango desde una hoja a otra, con macros en Excel. El copiar y pegar un rango cualquiera, lo se hacer, estoy perdido en lo siguiente: 1° todas las celdas tienen formulas, pero me interesan solo las filas que están mostrando valores, las demás aparecen vacías, por lo tanto en el rango de A1:D5000, a lo mas tengo 100 filas con valores y las demás vacías (pero con formulas).
    Necesito hacer dos cosas: copiar y pegar solo las celdas con valores, no pegar las vacías ni con formulas. además todas las filas vacías entre medio del rango que no las pegue en la hoja destino, asi me quedarían juntas todas las filas que me interesa, como para hacer un resumen. Gracias por tu tiempo. Francisco J.

    ResponderEliminar
  42. Hola Ismael, esta es la base de macros que uso para copiar, pero como podría modificarla para hacer lo que necesito que escribi arriba:
    ---------------------------------------------------
    Sub copiar_rango()
    'Detiene la actualización de la pantalla para que no se vea la ejecución de la macro
    Application.ScreenUpdating = False
    Sheets("Cartola Banco").Select
    Range("G1:M5000").Select
    Selection.Copy
    Sheets("Resumen Banco").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets("Cartola Banco").Select
    Range("A1").Select
    'Guarda el archivo excel
    ActiveWorkbook.Save
    'Vuelve a activar la actualización de la pantalla
    Application.ScreenUpdating = True
    End Sub
    ---------------------
    Gracias. Francisco J.

    ResponderEliminar
    Respuestas
    1. Hola Francisco,
      yo iría a lo fácil, y aplicaría un filtro sobre el rango sólo mostrando las celdas NO vacías, luego seleccionaría el resultado y lo copiaría y pegaría en el destino.

      El criterio, dentro de la macro, para conseguir discriminar las celdas vacías es:
      Criteria1:="<>"

      Espero te oriente.
      Un cordial saludo

      Eliminar
  43. Hola a todos y gracias de antemano. Tengo esta duda:

    Copio un rango de varias celdas y lo pego en otra ubicación, pero no todo, sólo las fórmulas o los formatos y no veo la manera de evitar que en el lugar de destino, todo el rango quede seleccionado.

    Si alguien lo utilizó en su día, en el vba del Office 95 esta macro funcionaba correctamente, sin dejar resaltada toda el área copiada, pero en versiones posteriores...

    Sea ésta, por ejemplo:

    Sheets("Hoja1").Range("C3:E7").Copy
    Sheets("Hoja2").Range("C10").PasteSpecial xlPasteFormulas
    Application.CutCopyMode = False

    ResponderEliminar
    Respuestas
    1. Hola Fito,
      bastaría con que acabaras tu macro indicándole qué quieres tener seleccionado o activo, por ejemplo:
      Sheets("Hoja1").Range("A1").Select

      Saludos

      Eliminar
    2. Hola Ismael, gracias, pero no es eso. Me explico:

      Lo que dices es cierto, claro, pero si las hojas de origen y destino no son la misma estaríamos obligados a seleccionar previamente la hoja de destino. Y no.

      Claro, podríamos evitar esa selección si ponemos “Application.ScreenUpdating = False” pero esto solo evita que veamos la hoja de destino, no que se seleccione el rango de pegado completo; y volvemos a la cuestión de origen. Descartado. No entiendo como versiones posteriores al vba del Office 95 (v7) tienen este retraso.

      Va, a los efectos de pegar fórmulas, la solución que se me ocurre pasa por hacer un bucle por ejemplo como éste (envía las fórmulas de A1:A2 de la hoja 1 al rango B1:B2 de la hoja 2):

      For MiFila = 1 To 2
      Sheets("HOJA2").Cells("B" & MiFila).Formula = _
      Sheets("HOJA1").Cells("A" & MiFila).Formula
      Next

      Esto no es estrictamente un pegado, sólo envía las mismas fórmulas, con sus referencias idénticas, a otra hoja del libro; pero bueno…

      Pero si quieres vamos más allá, ¿cómo harías la copia de los formatos de ese mismo rango? Imposible (de momento). Sólo podrías programar el formato deseado en las celdas de destino, ¿verdad? Y mal vamos si para hacer estas sencillas operaciones hemos de recurrir a estos métodos, ¿no te parece?

      Eliminar
    3. Ya, ya, no es "Cells" sino "Range"...

      Eliminar
    4. Hola Fito,
      por experiencia te diré que con Excel (y sus macros) no te queda otra que adaptarte o morir... te puedes cabrear con que tal o cual cosa en otra versión se podía y ahora no.. pero no te llevará a ningún sitio.
      No creo Microsoft vaya a cambiar sus programaciones.

      Respecto a tu última cuestión copiar y pegar formatos y fórmulas, se haría como toda la vida, por ejemplo con:
      Sheets("Hoja1").Range("C3:E7").Copy
      With Sheets("Hoja2").Range("C10")
      .PasteSpecial Paste:=xlPasteFormulas
      .PasteSpecial Paste:=xlPasteFormats
      End With

      o con el .Paste a secas de siempre.

      Lo que no entiendo es el motivo o la importancia de dejar 'seleccionado' tras el pegado el rango destino... si lo hicieras manualmente se quedaría igual; y no creo te afecte para procesos posteriores...

      Saludos

      Eliminar
    5. Ya, no hay más narices.
      Hombre, es una cuestión de presentación, de estética si quieres; o no solo eso, porque cuando uno acceda a esa página de destino deberá "desseleccionar" el rango de pegado. Y no es lo suyo...
      No obstante sigue existiendo una última opción, que es es programar que en el acceso a esa hoja se seleccione automáticamente una sola celda. Y me temo que va a ser la que nos quede.
      Saludos!

      Eliminar
  44. ;-)
    efectivamente... hay que jugar con las cartas que tenemos.
    Un saludo

    ResponderEliminar
  45. Hola Ismael, agradezco tu respuesta, pero la verdad que necesitaba con una macro ese resultado, porque necesito que otros menos apegados con la computación pudieran usar los archivos. Al final ensamblando macros de varios sitios, armé esto, y funciona solo que el Excel se cuelga mientras el proceso termina, se demora en esas 4000 filas máximo 1 minuto, abra otra forma mas liviana de hacerlo con macros ? ... gracias. Ismael.

    Sub Eliminar_filas_vacias()
    Application.ScreenUpdating = False
    Sheets("Resumen Banco").Select
    [A1].Select
    For i = 1 To 4000
    If ActiveCell = "" Or IsNull(ActiveCell) Then
    Selection.EntireRow.Delete
    '
    If ActiveCell = "" Or IsNull(ActiveCell) Then
    celda = ActiveCell.Address
    Selection.End(xlToRight).Select
    '
    If ActiveCell = "" Or IsNull(ActiveCell) Then
    Selection.End(xlToLeft).Select
    If ActiveCell.Row <> 1 Then Range(celda).Offset(-1, 0).Select
    '
    End If
    End If
    End If
    ActiveCell.Offset(1, 0).Select
    Next
    Application.ScreenUpdating = True
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      no termino de ver dónde empleas el bucle...
      veo que repitas 4000 veces un proceso, con diferentes condicionales (bastantes parecidos entre ellos).
      Plantea completo tu problema y quizá pueda encontrar una solución más rápida...
      Saludos cordiales

      Eliminar
  46. Hola Ismael !! Soy de Argentina y tengo el mismo apellido que vos !!! jaja. Me gustaría hacerte una consulta sobre una macro en planilla. A dónde te puedo escribir ?
    Muchas gracias.
    Alejandro.

    ResponderEliminar
    Respuestas
    1. Hola Alejandro.. lo bueno abunda jaja...
      puedes preguntar a través de los comentarios o bien mandarme un email a
      excelforo@gmail.com

      Un cordial saludo

      Eliminar
  47. Hola Excelforo, una consulta cuando activo la macro y estoy en la hoja destino me salta un error que es el siguiente de color amarrillo: HojaDestino.Range("A3").Activate
    pero cuando estoy en la hoja origen no me salta el error, como se debe corregir ese error.
    gracias Ismael

    ResponderEliminar
    Respuestas
    1. Hola!
      podría ser que el Libro de trabajo destino no tuviera 'Hojadestino (Hoja 2)'...
      También es recomendable, para facilitar el trabajo al Editor y a la macro, identificar el libro destino
      WorkBook("LibroDestino").HojaDestino.Select
      Range("A3").Activate

      normalmente para Activar algo debe estar dentro de la selección...

      Saludos

      Eliminar
  48. Buenas... tengo la sigiente macro, pero necesito que las celdas seleccionadas las copie y pegue como valores, o que borre las formulas de las celdas seleccionadas
    Sub Prueba()

    Sheets("50X3").Select
    Dim rngSeleccion As Excel.Range
    Sheets(Array("50X3", "D100", "P120")).Select
    Sheets("50X3").Activate

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      para pegar como valores puedes emplear lo que se indica en el Post, algo de este estilo:
      'Realizamos un Pegado especial, en este caso como Pegar valores y Pegar fórmulas
      HojaOrigen.Cells(2, 2).Copy
      HojaDestino.Cells(2, 2).PasteSpecial Paste:=xlValues

      Ojo, ten cuidado con el Array que has definido, parece que estás mezclando el nombre de la hoja con referencias a celdas...
      Saludos

      Eliminar
  49. Hola
    lo que pasa es que estoy seleccionando un mismo rango en varias hojas al tiempo, pero deseo quitarle las formulas a las celdas seleccionadas , o copiar y pegar hay mismo como valores, pero los valores en cada hoja son diferentes?

    ResponderEliminar
    Respuestas
    1. Hola
      podrías pasar una macro que convierta en valor todo lo que contuviera una fórmula:
      Sub Valor()
      For Each rngcell In Selection
      If rngcell.HasFormula Then
      rngcell.Value = rngcell.Value
      End If
      Next rngcell
      End Sub

      Saludos

      Eliminar
  50. Hola , gracias de antemano me funciono perfecto pero solo en la primera hora y no tomas las otras 2 hojas seleccionadas

    ResponderEliminar
    Respuestas
    1. Hola,
      si claro, la macro era una sugerencia, no una solución, para que vieras un proceso de cómo convertir en valor una fórmula previa (sobre un rango seleccionado).
      Para recorrer varias hojas, puedes aplicar un bucle superior al anterior detallado del tipo
      For Each sh In Workbooks("Libro1.xlsm").Windows(1).SelectedSheets
      For Each rngcell In sh.Range("C2,D5,E4")
      If rngcell.HasFormula Then
      rngcell.Value = rngcell.Value
      End If
      Next rngcell
      Next

      Saludos

      Eliminar
  51. Hola Ismael, primero que nada te felicito por la página me ha sido de mucha utilidad. Bueno mi consulta es la siguiente: Tengo un macros que me copia los datos de una hoja a otra pero lo que quiero es que la hoja de destino sea variable, es decir, que seleccione la hoja guiándose del nombre que yo especifico en una celda de la hoja de origen. (Los nombres de las hojas son 1,2,3...31)Gracias de antemano, aquí te dejo el código:

    Sub REGISTRADOR()
    '
    ' REGISTRADOR Macro
    ' Registra las ordenes de análisis de acuerdo a la fecha indicada en la celda H12 de la hoja Registro de Muestras
    '
    ' Keyboard Shortcut: Ctrl+r
    '
    Range("D5,D7,D9,D11,D13,D15,D17,D19,D21").Select
    Range("D21").Activate
    Selection.Copy
    Sheets("1").Select
    Range("B3").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(1, 0).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True
    Sheets("Registro de Muestras").Select
    Application.CutCopyMode = False
    Range("D23").Select
    Selection.Copy
    Sheets("1").Select
    Range("B3").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(0, 9).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Sheets("Registro de Muestras").Select
    Application.CutCopyMode = False
    ActiveCell.Offset(-14, 3).Range("A1:Q1").Select
    Selection.Copy
    Sheets("1").Select
    ActiveWindow.SmallScroll ToRight:=-2
    ActiveCell.Offset(-2, -9).Range("A1").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(0, 10).Range("A1").Select
    ActiveSheet.Paste
    Sheets("Registro de Muestras").Select
    Application.CutCopyMode = False
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    Range("D5,D7,D9,D11,D13,D15,D17,D19,D21,G9:W9").Select
    Range("G9").Activate
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    Selection.ClearContents
    Range("D5").Select
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Anthony,
      aplicando los explicado en el post, podrías aplicar algo así, suponiendo en A1 el nombre de la hoja destino

      Sub copiados()
      Dim HojaOrigen As Worksheet, HojaDestino As Worksheet
      Dim nombrehoja As String
      nombrehoja = Range("A1").Value

      Set HojaOrigen = Sheets(1)
      Set HojaDestino = Sheets(nombrehoja)


      HojaOrigen.Cells(2, 3).Copy Destination:=HojaDestino.Cells(2, 3)
      HojaOrigen.Cells(3, 3).Copy Destination:=HojaDestino.Cells(3, 3)


      Set HojaDestino = Nothing
      Set HojaOrigen = Nothing
      End Sub

      como ves la clave está en negrita.. decides que celda recoge el nombre de la hoja destino, y luego se incluye en la programación.
      Un saludo

      Eliminar
    2. Muchas gracias Ismael, lo había intentado antes pero cometí un error al declarar el tipo de variable, ahora la macros corre a la perfección :)

      Eliminar
  52. Tengo un archivo y quiero copiar de una hoja a otra y no puedo



    Sub macrocopiar()
    Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

    Set HojaOrigen = ActiveWorkbook.Sheets("MAESTRO DE CALCULO")
    Set HojaDestino = activeWorkbooks.Sheets("DATA DE PLANILLAS")

    HojaDestino.Range("A2").Value = HojaOrigen.Range("E5").Value
    HojaDestino.Range("B2").Value = HojaOrigen.Range("H23").Value
    HojaDestino.Range("C2").Value = HojaOrigen.Range("H55").Value

    Set HojaOrigen = Nothing
    Set HojaDestino = Nothing

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Dario,
      cualquiera de las formas expuestas en el post funciona correctamente...
      asegúrate los Nombres de las hojas existen exactamente como indicas

      Slds

      Eliminar
  53. Tengo una consulta y ojala que me puedan ayudar, les cuento


    Tengo 2 libros en excel 2010 el primero se llama "informacion" en el cual tengo la informacion de los clientes ingresados con su detalle en una tabla comun y corriente, el segundo libro se llama "ordenes de trabajo" en el cual es un documento con informacion del cliente pero en relacion a el trabajo que quiera realizar el cliente.

    Lo que quiero es en el primer libro llenar la informacion normalmente pero en el segundo libro ingresar el numero de serie del cliente y automaticamente me llene los campo que tienen relacion con ese cliente.

    Ojala me puedan ayudar amigos, me seria de gran ayuda para continuar con mis estudios.

    Estare atento a sus comentarios.

    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Alan,
      lo que buscas es la función BUSCARV, que realice la búsqueda del 'número de serie' (celda en libro 'ordenes de trabajo') en la matriz de búsqueda de la tabla del libro 'información'..
      No importa que estén en diferentes libros.. aunque para que funcionen sin problemas, es recomendable estén ambos abiertos...
      Quizá te ayude este link:
      http://excelforo.blogspot.com.es/2009/06/funciones-de-busqueda-buscarv-y-buscarh.html

      Sin más detalles de en qué posiciones se encuentran los campos en cada tabla no puedo ser más preciso...

      Un saludo

      Eliminar
  54. Hola necesito ayuda, os comento:

    Todos los meses desde estadística me entregan una tabla de excell con muchísimos valores. Esta tabla cambia mes a mes y puede tener mas o menos filas, necesito copiar solo ciertas ubicaciones ya definidas en otra tabla por ejemplo valor de Málaga y tienda1, Málaga y tienda 5 y que esta se actualice mes a mes con estos valores, el resto de valores (Malaga 2, Malaga3...) no los necesito. En definitiva se trata de extraer solo ciertos valores de una tabla enorme cuando coincida ciudad y nombre en otra hoja.

    ¿Alguien me puede ayudar?

    ResponderEliminar
    Respuestas
    1. Hola Raúl,
      te diría que lo más sencillo sería aplicar un Filtro Avanzado sobre esa tabla que te proporcionan, aplicando unos criterios sobre los campos (Ciudad y Tienda).
      Esto sería lo más eficiente... la otra forma es construir un bucle o loop (con FOR...NEXT, por ejemplo) que recorra cada registro de ese fichero que te proporcionan, para identificar cuál/cuáles cumplen esas dos condiciones (Málaga-tienda1, etc), para en ese caso llevártelo a la hoja correspondiente.. pero esto se puede eternizar si son muchos registros.

      Te recomendaría lo ejecutaras empleando los filtros.

      Saludos

      Eliminar
    2. Lo estoy intentando pero no lo veo, ¿te puedo enviar un pequeño ejemplo?

      Eliminar
    3. si, claro...
      envíame lo que tengas, y la duda, a
      excelforo@gmail.com

      Saludos

      Eliminar
  55. Estimado necesito de su ayuda.
    Tengo un libro en el que almaceno informacion diariamente. Necesito filtrar los datos por fechas (de la hoja1), y sumar.si cada grupo de productos.
    Ejemplo
    Codigo Producto Unidad Peso Fecha
    1 A 1 5 01/09/14
    2 B 1 3 01/09/14
    1 A 2 10 02/09/14
    1 A 1 4 03/09/14
    Quiero ingresar en alguna o algunas celdas la o las fechas, y luego observar el subtotal de unidades y peso para cada codigo en ese lapso de tiempo.

    Muchisimas gracias, y excelente el foro!!!

    ResponderEliminar
    Respuestas
    1. Hola Juan,
      podrías aplicar la función SUMAR.SI.CONJUNTO, para referenciarlo a dos celdas (donde incluir las fechas del intervalo de estudio); podría tener esta forma:
      =SUMAR.SI.CONJUNTO(Unidades;Codigo;"A";Fecha;">="&celdaFecha1;Fecha;"<="&celdaFecha2)

      Saludos

      Eliminar
    2. Gracias por tu respuesta. Voy a intentarlo como recomiendas, aunque quizás me haya quedado corto en la consulta: el rango de datos es dinámico, ya que diariamente se ingresan "n" cantidad de filas debajo del nombre de datos, por lo que utilice "desref" como fórmula para incrementar el rango, y no hacer un rango permanente demasiado extenso. Por otra parte es por esto que quisiera extraer o copiar los datos "filtrados". Desde ya muchas gracias por tu tiempo. Saludos

      Eliminar
    3. Si es necesario te envío un archivo ejemplo, nuevamente gracias.

      Eliminar
    4. Hola Juan,
      para trabajar con un rango dinámico te recomendaría convirtieras tu origen de datos en Tabla, y luego aplicar la fórmula comentada sobre los campos correspondientes... así conseguirías olvidarte de rangos estáticos.

      Saludos

      Eliminar
    5. Muchas gracias. En realidad necesito ambas cuestiones, tanto filtro avanzado como suma condicional. Voy a intentar con la modificación del origen de datos a tabla. Saludos cordiales

      Eliminar
  56. Estimado, me podrias apoyar, tengo un codigo de un filtro avanzado, en donde pego en otra hoja los datos del filtro, lo que ocupo es que solo se peguen los valores, sin formatos, ya que cada que ejecuto el filtro avanzado debo debo de quitar los bordes de las celdas (ya que la base de ventas tiene bordes)

    Sub Filtro()
    Range("ventas").AdvancedFilter Action:=xlFilterCopy, criteriarange:=Range( _
    "B7:g9"), copytorange:=Range("B24:O24"), unique:=False
    End Sub

    Muchas gracias por tu ayuda, y si tienes ejemplos de opciones de filtros avanzados sería genial!

    Gracias y saludos desde México!

    ResponderEliminar
    Respuestas
    1. Hola Eduardo,
      efectivamente, el filtro avanzado tiene esa peculiaridad, y es que copia el rango resultante del filtro, por lo que arrastra el formato..

      Las posibilidades para salvar esta cuestión son varias. Una primera sería modificar el formato del rango con tu macro antes de la línea de filtro, y volver a dejarlo como estaba tras la línea de código de tu filtro.
      Otra opción, aplicar un autofiltro estándar sobre 'Ventas' y luego copiar lo y pegarlo de manera especial como valores o sin formato.
      Una más, aplicar algún tipo de bucle (por ejemplo, for...next) que recorra los registros de 'ventas' y aquellos que verifiquen las condiciones o criterios que tu hayas definido, llevarlo al rango destino...

      La última sería la menos eficiente.. pero también la más flexible.
      Espero te oriente alguna de las ideas.

      Saludos

      Eliminar
    2. Sí igual lo sigo adecuando, pero te quise consultar por si había opción dentro del mismo filtro...

      Gracias Ismael, saludos!

      Eliminar
  57. Hola, Ismael.
    Muchas gracias de antemano por todo lo que nos enseñas desde este foro y por tu dedicación, que sin duda te llevará bastante tiempo.
    Quisiera consultarte si hay alguna forma de desactivar la brocha del formato desde código.
    Me explico: en una hoja con casillas bloqueadas y otras no, he desactivado el pegado con el CutCopyMode = False y también la aplicación directa de formato a las casillas no bloqueadas, pero sí se puede cambiar el formato pegando el de una casilla a otra con la brocha de formato.
    A ver si hay suerte y se puede desactivar.
    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Zarko, y gracias a ti por tus palabras...

      le he dado algunas vueltas a lo que comentas, para poder desactivar la aplicación de formato desde la 'brocha de formato', pero no creo sea posible.

      Quizá modificando el código de la Cinta de Opciones se pudiera hacer 'desaparecer' el botón de la brocha... pero es algo demasiado complejo y sobretodo, delicado.

      Siento no haberte podido ayudar.
      un saludo

      Eliminar
  58. Buen día, Ismael.
    Te comentaré que, en realidad, ya lo tenía "solucionado" con un parche o chapucilla, como quieras.
    En la subrutina "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" hago que compruebe el formato de cada casilla y, si no es el que especifico en "IF", aplica ese formato especificado, de manera que, nada más pegar con la brocha otro formato diferente, se vuelve al anterior.
    Es un poco trabajoso poner todo el código para ello, pero una vez hecho, funciona de maravilla, ya que los chinos que hay dentro de los ordenadores son tan rápidos que lo hacen en la mitad de medio milisegundo.
    Comento esto por si le viene bien a alguien.
    Saludos.
    (Te contesto con un comentario nuevo, porque le doy a "Responder" y no me hace nada. No sé si hago algo mal)

    ResponderEliminar
  59. Cordial saludo, estoy construyendo una hoja en la cual debo arrastar una formula un numero determinado de veces de acuerdo a un valor que tengo en otra columna por ejemplo si el valor de la columna es 4 debo arrastarla 4 celdas a la derecha y si es 13 seria 13 veces a la derecha, si en la celda siguiente es decir la 14 debe realizar una operacion, es posible realizar esto en excel? gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Hermes james,
      para algo tan dinámico se debería implementar una macro, que con un bucle (tipo for next, por ejemplo) recorriéramos la columna con las numeraciones (4,13, etc), de tal forma que para cada registro copiáramos y pegáramos tantas veces como nos indique el valor de esa celda, agregando al final la operación...

      Al ser algo tan específico se hace necesario ver la distribución y estructura de la hoja...

      Si quieres envíame la plantilla a
      excelforo@gmail.com
      y le echo un vistazo

      Saludos

      Eliminar
  60. Hola. Gracias por los aportes, quisiera saber si puedes ayudarme con este problema:

    Tengo una tabla dinamica que actualizo todos los meses y sobre la cual genero los informes de acuerdo al filtro definido usando la opcion "mostrar paginas de filtros de informe", esta opcion me genera cantidades de hojas con distintos nombres. Ahora bien, en otra hoja tengo unas formulas que deseo copiar y pegar en cada una de esas hojas que se generan por la opcion de tabla dinamica. Como puedo hacer esto a traves de una macro sin que se vuelva super largo y tedioso??

    Mi idea era que podia crear la macro de manera que vaya a la hoja origen, copie las formulas y luego definir el destino como la hoja activa para poder ejecutarla en cada una de las pestañas sin tener que cambiar el codigo de la macro para definir los destinos...

    Agradezco si me puedes ayudar con este codigo, seria super util para lo que estoy haciendo.

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Ingrid,
      supongo estarás hablando de la creación de muchas hojas...
      podrías crear un bucle que recorra las hojas nuevas (un for..next), y para cada uno de esas hojas realizar el copiado de fórmulas desde la hoja Origen y pegado en esas hojas que estas recorriendo... probablemente un método .Copy sirviera, teniendo como variable 'destination' las hojas recorridas...

      Espero haberte dado la idea.
      Saludos

      Eliminar
  61. Hola estimado amigo de Excel Foro:
    Tengo dos archivos que importan info de tablas en SQL, y que se actualizan cada vez que son abiertos. El objetivo es verificar si hay uno u otro o, incluso, ambos archivos abierto,y realice ciertas tareas dependiendo el resultado; sin embargo si ambos archivos están abiertos, la macro no reconoce este evento y por ende no manda un mensaje y los vuelve a abrir, si hay uno cerrado, no cierra el archivo abierto, para volverlos a abrir y actualizarlos; ¿podrá alguien ayudarme para ver que pudiera estar mal declarado en estos Si Y?

    Agradecido desde ya y quedo atento a sus comentarios.

    Sub wCW_0_0_CheckMagicFiles()

    If IsFileOpen("File1") = False _
    And IsFileOpen("File2") _
    = True Then
    Workbooks("File2").Close SaveChanges:=False
    Call AbreyActualizaAmbosArchivos

    ElseIf IsFileOpen("File1") = True _
    And IsFileOpen("File2") _
    = False Then
    Workbooks("File1").Close SaveChanges:=False
    Call AbreyActualizaAmbosArchivos

    ElseIf IsFileOpen("File1") = False _
    And IsFileOpen("File2") = False Then
    Call AbreyActualizaAmbosArchivos

    Else
    MsgBox("Archivos Actualizables Abiertos")
    Exit Sub

    End If

    End Sub


    Para que quede más claro lo que hace la macro AbreyActualizaAmbosArchivos, es Abrir estos archivos y actualizarlos nuevamente mediante la orden Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False que es más efectiva que RefreshAll, por si acaso les sirve este tip.

    Saludos:

    ResponderEliminar
    Respuestas
    1. Hola Milton,
      pues no parece haya nada mal/incorrecto en las estructuras IF/ELSEIF, lo que me hace pensar que el fallo esté en la fución IsFileOpen.. quizá no está reconociendo bien las rutas o nombres del fichero y siempre devuelva False...

      Poco más puedo indicarte.
      Espero haberte dado una idea.
      Saludos

      Eliminar
    2. Estimado Profesor: primero que nada agradecer enormemente sus prontos comentarios. También supuse que podría ser la ruta, pero después de verificar y probar, descarté este evento.
      Aprovecho la ocasión de agradecer a nombre de todos quienes nos gusta y ocupamos excel y sus inmensas posibilidades, el que usted comparta su experiencia y sabiduría con nosotros, sin mediar lucro, sólo por, lo que podría llamar, vocación de servicio.
      Saludos desde Chile.

      Eliminar
  62. Buenos días, me gustaría que me ayudase con un problema. ¿ Cómo puedo mediante una macro de excel 2003 pegar a un fichero varios datos de diferentes empresas, las cuales se identifican por diferente ID, y que al abrir el fichero dichas empresas solo vean sus datos sin necesidad de ver la información de las otras empresas, y al hacerlo que se haga de una sola vez, en vez de ir copiando una empresa a una con sus respectivos datos en diferentes hojas? Gracias, un saludo.

    ResponderEliminar
  63. Hola buenas tardes, no soy muy experto en el manejo de excel tengo un nivel promedio, quiero preguntar si es posible seleccionar unos datos de excel, y esos mismos datos ubicarlos en un documento en word, es decir como exportarlos pero que queden ubicados en unos campos exactos en el documento. lo que pasa es que tengo unos datos en un archivo de excel (Nombre,Cedula, direccion, y otros), y necesito generar constancias en word, pero no quiero estar digitando dato por dato, sino seleccionar el grupo de datos y exportarlos hacia el documento en los espacios designados, es algo como combinar correspondencia, pero no llamar la información desde word, sino enviarlos desde excel. no se si me hice entender...quiero saber si se puede hacer y como hacerlo. Muchas Gracias por su ayuda.

    ResponderEliminar
    Respuestas
    1. Hola Luis,
      sin duda la mejor opción es la de combinar correspondencia desde Word,
      desde Excel podrías copiar y pegar las celdas vinculandolas (no quedaría igual), y por supuesto luego incorporarlo mediante macros... lo que siempre es mas complejo, especialmente al interactuar con otra aplicación.

      Saludos

      Eliminar
  64. buenos dias ismael, mi problema es q debo extraer un dato mensual desde otro libro ejemplo: si es enero q me traiga enero, pero si es febrero que me traiga la suma de enero y febrero y asi sucesivamente, el codigo me quedo asi:



    Sub calculoEnergiaMesSelect()
    Call openData
    'MsgBox "un calculo por msg"
    Call seleccionarMesCalculo
    End Sub

    Sub openData()
    Dim caminobook As String
    caminobook = "D:\Mis documentos\diegoF\datosenergia.xlsx" 'ubicacion del libro

    On Error GoTo ERROR_DISCO

    Workbooks.Open caminobook
    Exit Sub

    ERROR_DISCO:
    If Err.Number = 1004 Then
    caminobook = MsgBox("vas por buen camino, aceptar", vbOKOnly + vbInformation, "Mensaje especial")

    End If
    End Sub

    Sub seleccionarMesCalculo()
    Dim mesbuscar As String
    Dim datoEnergia As Double
    mesbuscar = InputBox("Digite el mismo mes seleccionado en la lista (tenga en cuenta las mayusculas),ej: Dec.", _
    "Busqueda- MES")

    Dim nombreHojaDatoAbuscarMes As String
    Dim ws As Worksheet

    Dim wscal As Worksheet
    Dim cellDatoFinal As String
    cellDatoFinal = "E2"

    nombreHojaDatoAbuscarMes = "meseshoja"
    Set ws = Workbooks("datosenergia.xlsx").Worksheets(nombreHojaDatoAbuscarMes)
    Set wscal = Workbooks("calculoenergia.xlsm").Worksheets("hoja1")

    Dim valueToMes As Long
    Dim valueTotal As Double
    Dim index As Long
    Dim maxMes As Long

    Select Case mesbuscar
    Case "dic"
    maxMes = 1
    Case "ene"
    maxMes = 2
    Case "feb"
    maxMes = 3
    Case "mar"
    maxMes = 4
    Case "abr"
    maxMes = 5
    Case "may"
    maxMes = 6
    Case "jun"
    maxMes = 7
    Case "jul"
    maxMes = 8
    Case "ago"
    maxMes = 9
    Case "sep"
    maxMes = 10
    Case "oct"
    maxMes = 11
    Case "nov"
    maxMes = 12
    End Select

    'maxMes = 5

    For index = 1 To (maxMes + 1)
    If IsNumeric(ws.Cells(2, 2).Value) Then

    valueTotal = ws.Cells(2, 2).Value + valueTotal
    End If
    Next

    wscal.Activate

    wscal.Range(cellDatoFinal).Value = valueTotal


    End Sub

    el problema es que en la celda de destino debe aparecerme el calculo y si la selecciono debe aparecerme la procedencia del dato, no puedo modificar ni el libro de llegada ni el de salida

    ResponderEliminar
  65. Saludos, no sé si por aca puedo hacer la consulta, bueno soy novato en esto y me está gastando mucho tiempo esta macro que pretendo utilizar:
    Estoy tratando de hacer un sistema de formularios en los cuales los datos se ingresan por medio de texbox y comobox.
    Mi problema es el siguiente:
    Qiusiera que la macro tomara dos celdas o (dos textbox del formulario) de una hoja(Nombres y apellidos, columnas H y G) , los concatene, los copie en otra celda, pero los datos deben ser pegados en 6 celdas unidas ("merged").
    He tratado de todo, pero siempre me presenta error.
    Mi idea es concatenar, copiar en una celda, digamos (de la otra hoja), C2 y luego unir las 5 celdas contiguas,
    bueno para no extenderme mucho dejo unas imagenes de lo que quiero.
    [url=http://postimg.org/image/a7394mmsb/][img]http://s25.postimg.org/a7394mmsb/pregunta_concatenar_y_pegar_01.png[/img][/url]

    [url=http://postimg.org/image/j3e18kdej/][img]http://s25.postimg.org/j3e18kdej/pregunta_concatenar_y_pegar_01a.png[/img][/url]

    [url=http://postimg.org/image/vs8bs8jiz/][img]http://s25.postimg.org/vs8bs8jiz/pregunta_concatenar_y_pegar_02.png[/img][/url]
    esta es mi macro, pero creo que NamesFull esta mal declarada, la he puesto como String y tampoco va.
    Ante todo le agradezco estos sitios nos ayudan mucho a los legos,
    Suerte y gracias

    ResponderEliminar
  66. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  67. Lo siento, olvidé la macro:


    Sub copiar_Deudores()
    Dim NamesFull As Range
    Dim Origen As Worksheets, Final As Worksheets
    Set Origen = ThisWorkbook.Sheets("Contabilidad General")
    Set Final = ThisWorkbook.Sheets("Hoja 3")

    NamesFull = ThisWorkbook.Sheets("Contabilidad General").Range("G8").Value & "" & ThisWorkbook.Sheets("Contabilidad General").Range("H8").Value
    If Origen.Range("G8") <> Empty And _
    Origen.Range("H8") <> Empty Then
    Application.ScreenUpdating = False

    NamesFull.Copy
    ActiveSheet.Paste Final.Range("C2")
    Final.Range("C2").Activate
    Range("C2:H2").Select
    Selection.Merge

    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    End If
    Set HojaDestino = Nothing
    Set HojaOrigen = Nothing
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      diría que NamesFull debería ser String,
      por otro lado, en lugar de copiar y pegar, podrías sencillamente, tras combinar:
      Final.Range("C2").Activate
      Range("C2:H2").Select
      Selection.Merge
      'llevar el dato concatenado a la celda 'combinada
      Final.Range("C2").value=NamesFull

      con eso sería suficiente.

      Espero te oriente.
      Un saludo

      Eliminar
  68. Gracias, esa última parte es la que no me "cuadraba", es decir, no podía relacionar. muy agradecido, hasta la proxima.

    ResponderEliminar
    Respuestas
    1. Le comento que me daba error "No coincidian los tipos"
      y era por
      Dim NamesFull As Range
      Dim Origen As Worksheet"S", Final As Worksheet"S"
      Set Origen = ThisWorkbook.Sheets("Contabilidad General")
      Set Final = ThisWorkbook.Sheets("Hoja 3"),
      Les quité la "S" y de una funcionó la macro, probaré mis anteriores macros a ver si sí funcionan.
      Pdata: Mis diculpas; no sé como editar mis respuestas y corregirlas, para que queden en un solo comentario.

      Eliminar
    2. ;-)
      sin problemas... (creo no se puede).
      Un saludo

      Eliminar
  69. Hola Ismael, te molesto porque quisiera saber cómo puedo dar un nombre a un rango en VBA, si desconozco el tamaño del rango, ya que éste lo seleccionaré desde A1 y luego con Shift+Ctrl+flecha abajo y Shift+Ctrl+flecha derecha. Muchas gracias por tu tiempo.! Gerardo

    ResponderEliminar
    Respuestas
    1. Hola Gerardo,
      podrías emplear para definir el rango la propiedad asociada a Range .CurrentRegion... sería algo así:
      Range("A1").CurrentRegion

      Un cordial saludo

      Eliminar
  70. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  71. Hola a todos, quiero comentaros un problema que me trae de cabeza y va relacionado con este tema, vereis, tengo una serie de datos en una columna (columna C) separados por páginas como se muestra en esta imagen:

    http://i58.tinypic.com/2s8jmdy.png

    esta imagen pertenece a un archivo ejemplo donde tengo 6 paginas iguales (Con los mismos valores) que esta (excepto el botón que se ve, solo está en la primera)

    bien, mi intención es crear una macro que copie entera la columna C a la hoja 2 agrupando las columnas de datos según la páginas ocupadas de la hoja 1, aquí lo enseño en la imagen:

    http://i59.tinypic.com/52ytt1.jpg

    Aquí se ve la hoja 2, en la hoja están copiadas las columnas C de cada una de las páginas, (hoja2.columna D datos de la página 1, hoja2.columna E datos de la página 2...)

    y los "titulos de la tabla (del 1 al 6) hacen referencia a los numeros de la paginas ocupadas en la hoja 1.

    no se si me he expresado con claridad. pero creo que las imagenes hablan por si solas.

    Ante todo, muchas gracias por vuestra ayuda y tiempo

    Un saludo

    ResponderEliminar
    Respuestas
    1. Hola Daniel,
      por lo que comentas, al hablar de páginas, hablas de páginas de impresión dentro de una hoja. Si es así lo primero sería identificar los rangos a copiar.. quizá convirtiendo en Tablas cada rango.
      El siguiente paso sería recorrer con un bucle de algún tipo (for..next) cada rango e ir copiándolo uno a continuación del otro.. haciendo variable la rango de pegado...
      Intentaré escribir algún ejemplo de cómo recorrer y trabajar las diferentes tablas dentro de una hoja.
      Saludos

      Eliminar
    2. hola, gracias por responder, estuve pensando en lo de las tablas y bucles, y creo que se me ha ocurrido algo,

      ¿seriá posible recorrer la columna C y al detectar la celda con el valor
      "Nº Veces" sumar en 1 la dirección de la columna?

      gracias por tu tiempo

      Eliminar
    3. si, se puede recorrer la columna C con un bucle, y luego evaluar el valor de cada celda
      for each celda in rango("C1:C100")
      if celda.value="Nº veces" then
      '..... sumar la direccion o lo que sea
      end if
      next celda

      Saludos

      Eliminar
  72. perdona por tardar en responder, me ha funcionado a las mil maravillas, muchas gracias por tu ayuda

    ResponderEliminar
  73. Buenos días:

    Estaba buscando una macro y me parece muy interesante lo que han discutido y planteado. Tengo el siguiente problema. Me gustaría una Macro que ejecute a través de un botón para que me copie la información de las celdas K2, K1, G8, O1, W273 de una hoja llamada "Fto. Cot. Reactivos" y la pegue en una hoja llamada "F.Técnica". Hay que tener en cuenta que esta última es una lista y la información (hasta el momento) se ha venido enlistando a medida que las celdas están desocupadas. Lo anterior sugiere que no deseo pegar la información en una ubicación determinada, sino que se vaya enlistandose a medida que se oprima en botón "copiar".

    Siendo así, las próximas celdas donde desearía que se pegara la información en el mismo orden en que lo relacioné son: B620, D620, F620, J620, P620. No se si se necesite pero D620, F620, j620 y p620 son celdas convinadas.

    Si es posible resolverlo agradezco inmensamente la colaboración y felicito mucho al desarrollador por su talento. Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Sebastián,
      lo primero decirte que deberíamos evitar el uso de celdas combinadas...
      Entiendo que el lugar de destino es variable, va creciendo (filas 260, y luego 261, etc.)
      Si es así, la técnica que buscas sería algo de este estilo:
      sub proceso()
      uFila=sheets("F.Técnica").range("B"&rows.count).end(xlup).row+1

      sheets("Fto. Cot. Reactivos").range("K2").copy destination:=sheets("F.Técnica").range("B"&uFila)

      end sub

      y similar para las cinco celdas...

      Espero haberte comprendido
      Un saludo

      Eliminar
  74. Ismael, buenas tardes:

    Si señor, algo así es lo que se necesita pero con las siguientes características:

    1. Que pueda activar la macro con un botón, me imagino debe decir algo parecido a Commandbutton_click().
    2. Que me copie los datos de las celdas especificadas de la hoja "Fto. Cot. Reactivos" (K2, K1, G8, O1, W273) TODOS AL TIEMPO y los pegue en determinadas ubicaciones de COLUMNA (más no de fila, pues debe buscar la fila que este disponible) en la hoja "F. Técnica" en las celdas B620, D620, F620, J620, P620 respectivamente cada dato.

    La idea es que se ejecute todo con un click. Mil Gracias.

    ResponderEliminar
    Respuestas
    1. Sebastian,
      sólo debes repetir para las cinco celdas el mismo código, cambiando la celda copiada y el destino.
      Para asociarlo a un botón (control de formulario) en la hoja de cálculo sólo inserta un botón y asígnale la macro creada.
      http://excelforo.blogspot.com.es/2009/09/boton-con-macro-en-excel-2007.html
      Saludos

      Eliminar
  75. Ismael, buenos dias:


    Ya lo probe y funciona perfectamente. Muchísimas gracias por la disposición, la ayuda y compartir el conocimiento. Bendiciones.

    ResponderEliminar
  76. Ismael que pena. Cómo le digo que pegue como valores a esa fórmula:

    sheets("Fto. Cot. Reactivos").range("K2").copy destination:=sheets("F.Técnica").range("B"&uFila)

    Saludos.

    ResponderEliminar
    Respuestas
    1. En este mismo post, entre los códigos mostrado tienes el que necesitas para pegar como valores.
      un saludo!!

      Eliminar
  77. Si claro, obviamente fue lo primero que hice despues de darme cuenta que si tengo los valores de una formulación en una celda no me los copiaba. Hice esto:

    Sub proceso()

    uFila = Sheets("Hoja2").Range("a" & Rows.Count).End(xlUp).Row + 1

    Sheets("Hoja1").Range("a5").Copy Destination.PasteSpecial = xlValues = Sheets("Hoja2").Range("a" & uFila)

    End Sub

    Pero no me da resultado, la pregunta era sobre una explicación más especifica por favor.

    ResponderEliminar
  78. Por favor ayuda, no c como hacer para que copie y pegue como valores. Ya intenté lo que me pareció más lógico y no funciono, me pide que depure.

    ResponderEliminar
    Respuestas
    1. solo tienes que replicar lo que aparece en el post:
      HojaOrigen.Cells(2, 2).Copy
      HojaDestino.Cells(2, 2).PasteSpecial Paste:=xlValues

      En tu caso, te lo doy hecho:
      uFila = Sheets("Hoja2").Range("a" & Rows.Count).End(xlUp).Row + 1
      Sheets("Hoja1").Range("a5").Copy
      Sheets("Hoja2").Range("a" & uFila).PasteSpecial Paste:=xlValues

      Slds

      Eliminar
  79. Muchas Gracias Ismael, ahora si funciona perfecto. Saludos.

    ResponderEliminar
  80. Muy buenos días, tengo el sigiuente problema con una macro en VBA:

    Sub SepararTexto()

    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
    :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
    True
    End Sub

    Esta macro es utilizada para separar un texto. Este texto que se separa, se separa en 4 columnas. En este caso, se aplica la macro en la celda C3, para que se separe en las 4 columnas desde la celda B3 a la E3.

    El problema es que una vez que aplico la macro en la celda C4, esta me reemplaza nuevamente el texto separado en las celdas B3 a E3.

    ¿Me podrían ayudar a resolver este problema?

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Germán,
      fíjate que en tu macro el destino es siempre el mismo:
      Destination:=Range("B1")
      por lo que cada vez ejecutes esa macro llevará el resultado de la 'separación' a esa celda.

      En lugar de lanzar la macro cada vez por cada celda, simplemente selecciona el conjunto de datos (parece en tu caso columna C3:C4) y ejecuta la macro

      la otra posibilidad es hacer variable, por ejemplo:
      Sub SepararTexto()

      Selection.TextToColumns Destination:=Range("B" & Selection.Row), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
      Semicolon:=False, Comma:=False, Space:=True, Other:=False, _
      FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
      TrailingMinusNumbers:=True
      End Sub

      Saludos

      Eliminar
    2. Hola Ismael,

      Si me imaginaba que el problema era el destino, pero no tenía idea de como solucionarlo. Con el código que me sugirió ya resolví el problema. Muchísimas gracias.

      Saludos y que tenga un excelente día.

      Eliminar

  81. buenas noches me urge resolver la siguiente situación espero me puedan ayudar.

    En la hoja 1 Celda B25 tendré un valor vairable que ira de 115, 215, 315, hasta 1215

    Ese valor debe de ser buscado en 4 hojas, en las cuales se encontrara el valor (en las cuatro hojas estara el valor, es decir en la hoja 2 en la celda A1 estará 115 en la B1 estará 215 así hasta la celda L1 el valor 1215 estos valores estarán en la hoja 2, hoja 3 hoja 4 y hoja 5. una vez que lo encuentra debe de copiar toda la columna y en ese mismo sitio ponerla como valor.

    Gracias por su atención y apoyo, saludos.

    ResponderEliminar
    Respuestas
    1. Hola Mario,
      para esto necesitarías un procedimiento Sub (macros) que recorra con un loop las diferentes hojas buscando el valor variable (Hoja1!B25), para una vez localizado, haga el copiado y pegado como valores de esa columna.

      Por favor, lee las normas de uso del blog.
      Un cordial saludo

      Eliminar
  82. hola que tal, buenas noches a todos, de antemano muchas gracias Sr. Ismael es un placer conocer a tan distinguida persona que realiza un trabajo tan bueno como el suyo a ayuda a tanta gente, le agradezco, es para realizar una consulta de lo siguiente, soy principiante en este tema y necesitamos una base de datos con macros, ya intente muchas formas pero la verad no he sabido bien como emplear toda esta excelente informacion el punto es el siguiente tengo un libro que se llama destino en este libro tengo un encabezado por celda de la celda A1 hasta la celda U1 y en la primera celda dice solicitud (A1), tipo (B1), fecha (C1), razon social (D1), etc., en este caso quiero copiar la informacion que se encuentran en celdas especificas de otro libro que viene enumerado por ejemplo: 6521.xls, 6522.xls, etc. asi sucesivamente, la informacion que requiero de estos libros se encuentran en la celdas D10 y que iria en el libro destino en la celda A2 abajo de solicitud, y el siguiente dato seria la celda E22 e iria abajo de la celda de tipo del libro destino, etc., cabe mencionar que todos los libros origen tienen la informacion en las mismas celdas no cambian las celdas solo la informacion que contiene la misma, la verdad soy pesimo para expresarme de antemano gracias y esperaria me pudiera auxiliar en esta parte ya llevo un mes tratando de crear esta macros y no he podido, se me a complicado mucho, gracias

    ResponderEliminar
    Respuestas
    1. Hola giovanni,
      gracias por tus palabras.
      Creo haber entendido que requieres, mediante macros, traer a un Libro de trabajo los valores de unas celdas de un os libros diferentes, de los que conoces la ruta y el nombre, ya que están en el Libro Destino..
      Si esa así, tendrás que emplear el método Open y Close del WorkBook para
      1-abrir esos libros 6521.xls, 6522.xls, etc.,
      2-copiar y pegar lso datos de un libro al Destino
      3-cerrar los libros 6521.xls, 6522.xls...

      En todo caso, para una solución personalizada, mejor lee las Normas de uso del blog.

      Un cordial saludo

      Eliminar
  83. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  84. Hola Ismael,
    Tengo una consulta, he realizado una macro para que envie datos de un rango de hoja a otra hoja. Pero quiere pasar solo un valor especifico de ese rango. Ej si tengo cuatro valores en ese rango con diferente numereacion , quiero solo pasar solo un valor especifico, en este caso seria el 2. Aqui te adjunto mi macro .

    Dim vector() As String
    ' hora am:
    Z = -1

    With Hoja1
    For i = 2 To 12

    Z = Z + 1


    ReDim Preserve vector(Z)
    vector(Z) = .Cells(i, 13)

    Next
    End With

    For i = 0 To Z

    With Hoja2
    '
    '
    For j = 2 To 12

    If Cells(j, 13).Value = 2 Then

    Cells(i + 15, 13) = vector(i)

    End If
    Next




    .Cells(i + 2, 14) = vector(i)


    End With
    Next


    Slds y gracias de antemano

    ResponderEliminar
    Respuestas
    1. A priori no veo necesario generar las matrices, seguramente se me escape algo,
      quizá algo más sencillo para recorrer el rango de análisis
      For Each celda In Range("M2:M12")
      If celda.Value = 2 Then
      'secuencia de pegado al destino de la hoja2
      End If
      Next celda

      No termino de ver claro qué quieres pegar a la hoja 2, pero creo que un condicional más sencillo es el camino.
      Saludos

      Eliminar
  85. Hola Buenos dias, tengo un problema estoy utilizando estas instrucciones para cortar y pegar valores en columnas diferentes
    Range("B4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Cut Destination:=Range("K4")
    Me funcionaba de maravilla pero hay una columna que me presenta problemas solo me corta los 2 primeros valores de esa columna y es lo que pega los demas valores no los toma.
    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola José Carlos,
      al emplear el Modo final (.end(xldown)) el rangto seleccionado está condicionado por las celdas con datos hacia abajo que hubiera.. siempre que haya una continuidad de celdas...
      Esto es, se interrumpe cuando haya una celda vacía.. quizá sea ese el caso.

      Suele ser mejor hacerlo a la inversa, esto es:
      ultfila=range("B"&rows.count).end(xlup).row
      Range("B4:B"&ultfila).Cut Destination:=Range("K4")

      Saludos

      Eliminar
  86. hola
    tengo un problema al copiar una formula de una hoja del libro a otra hoja, la formula la pego sin problemas pero lo que ocurre es que no soy capaz de que mantenga las referencia a las celdas de calculo de la hoja de origen, la formula se pega haciendo refrencia a las celdas de la hoja de destino.

    espero tu sapiencia, un saludo

    ResponderEliminar
    Respuestas
    1. Hola,
      no termino de comprenderlo..
      pero en todo caso, si quieres copiar literalmente la ruta del origen, siempre podrías copiar desde dentro de la barra de fórmulas toda la función (incluido el =), y luego pegarlo en la celda destino que quisieras...
      Saludos

      Eliminar
  87. Hola, por favor necesito una explicación para un trabajo en excel que estoy haciendo.
    Tengo una celda a la cual se le coloca manualmente números entre 1 y 500.
    Al colocarle un numero a esa celda, cambian resultados de otras 12 celdas dispuestas en una misma fila.
    Lo que necesito es crear en la misma hoja una macro que copie los resultados de las 12 celdas y lo pegue uno abajo del otro, para los 500 cambios. ¿es posible hacer esto?

    ResponderEliminar
    Respuestas
    1. Hola Miangelo,
      no bastaría simplemente copiar y pegar las fórmulas de esa fila a las otras 500???
      Slds

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.