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:
Los códigos VBA de nuestra macro son:
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:
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:
Buenas Tardes
ResponderEliminarEncontre 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
Hola, buenos días,
ResponderEliminartal 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
Hola, tengo un problema con este tema de copiar y pegar. A ver si me podeis echar una mano.
ResponderEliminarNecesitaria 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.
Hola,
Eliminarnecesitarí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
Hola ExcelForo, gracias por tu interés, te explico mi caso en concreto por si ves otra solucion.
EliminarTengo 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
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.
ResponderEliminarGracias
Hola,
Eliminarlo 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
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
ResponderEliminarHola Gamf,
Eliminarespero 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
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 :
EliminarSheets("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
Hola Gamf,
Eliminarveo 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
gracias..pero como defino la hoja donde se va a copiar?
EliminarSheets("NombreHoja").Cells(rows.count,"A").End(xlUp).value=texto01
EliminarGRACIAS 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
EliminarGracias…!!!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.
EliminarHola gamf,
Eliminardebes 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
ok , gracias , esta la remplazo por la Sheets("NombreHoja").Cells(rows.count,"A").End(xlUp).value=texto01
Eliminarahora si me resulto todo !!!muchas gracias por las repuestas y las aclaraciones.
EliminarPerfecto!!!
EliminarUn atento saludo
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
ResponderEliminarHola Adriana,
Eliminarverifica 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
HOLAA EFECTIVAMENTE TENIA REPETIDO EL CODIGO, AHORA MI PROBLEMA ES CON UN FILTRO AVANZADO TENGO ESTA LINEA DE CODIGO
ResponderEliminarRange("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.
Hola Adriana,
Eliminardesgraciadamente 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 ;-)
opss siento lo de las mayusculas¡
ResponderEliminary 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¡
Me alegro Adriana!!
Eliminarmuchas gracias y un saludo!!
Buenas noches.
ResponderEliminarAgradezco 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!
Hola,
Eliminarbueno 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
Funciona de maravilla!!.
ResponderEliminarLo ú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.
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.
ResponderEliminarHola Fernando,
Eliminarla 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
Muchas pero muchas gracias.
ResponderEliminarEl 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!
Me alegro!!!
Eliminarmuchas gracias por colgarlo.
Un saludo!
hola nuevamente, quisiera saber si alguien me podria ayudar con algo de php y mysql, si saben de algun foro porfavor ayuda¡
ResponderEliminarHola,
Eliminarlo siento, sólo de Excel.
:-(
Slds
Hola
ResponderEliminarUna 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
Hola bizen99,
Eliminarbueno, 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
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).
ResponderEliminarOjal 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
Hola Ezequiel,
Eliminarsi 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
GRACIAS POR TU PRONTA RESPUESTA, TENGO 2 DUDAS:
ResponderEliminar1.-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
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
ResponderEliminarEZEQUIEL
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
Hola Ezequiel,
Eliminarpara 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
PARA LA COMUNIDAD ANEXO LA SIGUIENTE PROGRAMACION. YA FUNCIONANDO.
ResponderEliminarPRIMERO 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
Muchas gracias por compartirlo.
EliminarSlds!!
Hola ,
ResponderEliminarpara 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
Hola,
Eliminarbueno, 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
Me ha sido de gran ayuda. Gracias.
ResponderEliminarHola, 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.
ResponderEliminarGracias por la atención y ayuda.
Hola,
Eliminaraunque 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
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.
ResponderEliminarNecesito 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
Hola Carlos,
Eliminarme 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
Hola Ismael.
ResponderEliminarMuchas 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
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
ResponderEliminarHola Carlos,
Eliminarbueno, 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
TOMAAAAA YAA!!!! NO SABES LO FELIZ QUE ME HAS HECHO....no te haces la idea de lo que has conseguido.... :)
EliminarOtra 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....
Hola Carlos,
Eliminarme 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!!
Para ser más exactos y hacerlo perfecto voy a explicarlo mejor:
EliminarE43: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
Hola Carlos,
ResponderEliminaryo 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
Hola Ismael
ResponderEliminarTengo una duda como haria para copiar un rango de celdas cada cierta cantidad de filas y hacerles un subtotal y al final totalizarlas.:
Me exprese mal Disculpa lo que deseo es lo siguiente:
ResponderEliminartengo 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.
Hola!,
Eliminarbueno, 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
Hola!
ResponderEliminarSoy 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!
Hola,
Eliminarlo 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
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:
ResponderEliminarIf 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
Hola Lucy,
Eliminarya 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
Hola Ismael:
ResponderEliminarFelicidades 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?
Hola Horacio,
Eliminarmuchas 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
Hola Ismael:
EliminarMuchas 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.
Hola Horacio!
Eliminarmejor 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
ok, gracias
ResponderEliminarHola 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...
ResponderEliminarHola Andrés,
Eliminargracias 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
Este comentario ha sido eliminado por el autor.
EliminarGracias 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.
EliminarEjemplo:
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!
Hola Andrés,
Eliminarsó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
Muchas gracias de verdad Ismael por todo!! Finalmente funciona como yo quiero. Saludos y buen trabajo!!
EliminarGracias 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...
ResponderEliminarGracias!
Hola Jim,
Eliminarobviamente 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
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.
ResponderEliminarGracias de antemano
Hola Fernando...
Eliminartodo 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
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
EliminarEn 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
Hola Fernando,
Eliminarpues 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
Muchas gracias por las respuestas, en verdad lo agradezco.
EliminarLeyendo 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!!!
:-)
Eliminarsldos cordiales
Ismael, buenas tardes.
ResponderEliminarNuevamente 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.
Hola Fernando Enrique,
Eliminarque 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
Hola Ismael, EXCELente blog, y de antemano gracias por la ayuda que nos proporcionas.
ResponderEliminarEstoy 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.
Muchas gracias, me alegra que te haya podido servir alguna vez mis explicaciones.
EliminarRespecto 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
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
ResponderEliminarHola,
Eliminarentiendo 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
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 ?
ResponderEliminarHola,
Eliminarque 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
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...
ResponderEliminarMuchas 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
Hola Luz,
Eliminarmejor 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
Hola Ismael buenas noches.
ResponderEliminarTengo 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
Hola Alejandro,
Eliminarparece 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
Ismael, buenas tardes, te agradezco que tengas este foro, nos ayuda mucho. Tengo una pregunta:
ResponderEliminarTengo 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
Muchas gracias Fernando,
Eliminaryo 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
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).
ResponderEliminarNecesito 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.
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:
ResponderEliminar---------------------------------------------------
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.
Hola Francisco,
Eliminaryo 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
Hola a todos y gracias de antemano. Tengo esta duda:
ResponderEliminarCopio 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
Hola Fito,
Eliminarbastaría con que acabaras tu macro indicándole qué quieres tener seleccionado o activo, por ejemplo:
Sheets("Hoja1").Range("A1").Select
Saludos
Hola Ismael, gracias, pero no es eso. Me explico:
EliminarLo 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?
Ya, ya, no es "Cells" sino "Range"...
EliminarHola Fito,
Eliminarpor 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
Ya, no hay más narices.
EliminarHombre, 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!
;-)
ResponderEliminarefectivamente... hay que jugar con las cartas que tenemos.
Un saludo
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.
ResponderEliminarSub 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
Hola,
Eliminarno 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
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 ?
ResponderEliminarMuchas gracias.
Alejandro.
Hola Alejandro.. lo bueno abunda jaja...
Eliminarpuedes preguntar a través de los comentarios o bien mandarme un email a
excelforo@gmail.com
Un cordial saludo
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
ResponderEliminarpero cuando estoy en la hoja origen no me salta el error, como se debe corregir ese error.
gracias Ismael
Hola!
Eliminarpodrí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
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
ResponderEliminarSub Prueba()
Sheets("50X3").Select
Dim rngSeleccion As Excel.Range
Sheets(Array("50X3", "D100", "P120")).Select
Sheets("50X3").Activate
End Sub
Hola,
Eliminarpara 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
Hola
ResponderEliminarlo 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?
Hola
Eliminarpodrí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
Hola , gracias de antemano me funciono perfecto pero solo en la primera hora y no tomas las otras 2 hojas seleccionadas
ResponderEliminarHola,
Eliminarsi 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
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:
ResponderEliminarSub 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
Hola Anthony,
Eliminaraplicando 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
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;-)
EliminarUn saludo
Tengo un archivo y quiero copiar de una hoja a otra y no puedo
ResponderEliminarSub 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
Hola Dario,
Eliminarcualquiera de las formas expuestas en el post funciona correctamente...
asegúrate los Nombres de las hojas existen exactamente como indicas
Slds
Tengo una consulta y ojala que me puedan ayudar, les cuento
ResponderEliminarTengo 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
Hola Alan,
Eliminarlo 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
Hola necesito ayuda, os comento:
ResponderEliminarTodos 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?
Hola Raúl,
Eliminarte 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
Lo estoy intentando pero no lo veo, ¿te puedo enviar un pequeño ejemplo?
Eliminarsi, claro...
Eliminarenvíame lo que tengas, y la duda, a
excelforo@gmail.com
Saludos
Estimado necesito de su ayuda.
ResponderEliminarTengo 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!!!
Hola Juan,
Eliminarpodrí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
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
EliminarSi es necesario te envío un archivo ejemplo, nuevamente gracias.
EliminarHola Juan,
Eliminarpara 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
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
EliminarEstimado, 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)
ResponderEliminarSub 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!
Hola Eduardo,
Eliminarefectivamente, 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
Sí igual lo sigo adecuando, pero te quise consultar por si había opción dentro del mismo filtro...
EliminarGracias Ismael, saludos!
Hola, Ismael.
ResponderEliminarMuchas 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.
Hola Zarko, y gracias a ti por tus palabras...
Eliminarle 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
Buen día, Ismael.
ResponderEliminarTe 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)
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
ResponderEliminarHola Hermes james,
Eliminarpara 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
Hola. Gracias por los aportes, quisiera saber si puedes ayudarme con este problema:
ResponderEliminarTengo 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
Hola Ingrid,
Eliminarsupongo 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
Hola estimado amigo de Excel Foro:
ResponderEliminarTengo 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:
Hola Milton,
Eliminarpues 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
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.
EliminarAprovecho 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.
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.
ResponderEliminarHola natalia,
Eliminarya te conteste por email
Saludos
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.
ResponderEliminarHola Luis,
Eliminarsin 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
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:
ResponderEliminarSub 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
muchas gracias por su atencion!!!
EliminarHola Diego,
Eliminarcreo que lo explicado aquí te servirá para lo que necesitas
http://excelforo.blogspot.com.es/2014/01/vba-una-funcion-personalizada-de.html
Espero te oriente.
Un cordial saludo
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:
ResponderEliminarEstoy 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
Este comentario ha sido eliminado por el autor.
ResponderEliminarLo siento, olvidé la macro:
ResponderEliminarSub 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
Hola,
Eliminardirí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
Gracias, esa última parte es la que no me "cuadraba", es decir, no podía relacionar. muy agradecido, hasta la proxima.
ResponderEliminarLe comento que me daba error "No coincidian los tipos"
Eliminary 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.
;-)
Eliminarsin problemas... (creo no se puede).
Un saludo
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
ResponderEliminarHola Gerardo,
Eliminarpodrías emplear para definir el rango la propiedad asociada a Range .CurrentRegion... sería algo así:
Range("A1").CurrentRegion
Un cordial saludo
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola 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:
ResponderEliminarhttp://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
Hola Daniel,
Eliminarpor 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
hola, gracias por responder, estuve pensando en lo de las tablas y bucles, y creo que se me ha ocurrido algo,
Eliminar¿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
si, se puede recorrer la columna C con un bucle, y luego evaluar el valor de cada celda
Eliminarfor each celda in rango("C1:C100")
if celda.value="Nº veces" then
'..... sumar la direccion o lo que sea
end if
next celda
Saludos
perdona por tardar en responder, me ha funcionado a las mil maravillas, muchas gracias por tu ayuda
ResponderEliminarBuenos días:
ResponderEliminarEstaba 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.
Hola Sebastián,
Eliminarlo 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
Ismael, buenas tardes:
ResponderEliminarSi 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.
Sebastian,
Eliminarsó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
Ismael, buenos dias:
ResponderEliminarYa lo probe y funciona perfectamente. Muchísimas gracias por la disposición, la ayuda y compartir el conocimiento. Bendiciones.
Ismael que pena. Cómo le digo que pegue como valores a esa fórmula:
ResponderEliminarsheets("Fto. Cot. Reactivos").range("K2").copy destination:=sheets("F.Técnica").range("B"&uFila)
Saludos.
En este mismo post, entre los códigos mostrado tienes el que necesitas para pegar como valores.
Eliminarun saludo!!
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:
ResponderEliminarSub 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.
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.
ResponderEliminarsolo tienes que replicar lo que aparece en el post:
EliminarHojaOrigen.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
Muchas Gracias Ismael, ahora si funciona perfecto. Saludos.
ResponderEliminarMuy buenos días, tengo el sigiuente problema con una macro en VBA:
ResponderEliminarSub 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.
Hola Germán,
Eliminarfí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
Hola Ismael,
EliminarSi 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.
ResponderEliminarbuenas 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.
Hola Mario,
Eliminarpara 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
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
ResponderEliminarHola giovanni,
Eliminargracias 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
ok, gracias.
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola Ismael,
ResponderEliminarTengo 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
A priori no veo necesario generar las matrices, seguramente se me escape algo,
Eliminarquizá 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
Hola Buenos dias, tengo un problema estoy utilizando estas instrucciones para cortar y pegar valores en columnas diferentes
ResponderEliminarRange("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!
Hola José Carlos,
Eliminaral 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
hola
ResponderEliminartengo 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
Hola,
Eliminarno 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
Hola, por favor necesito una explicación para un trabajo en excel que estoy haciendo.
ResponderEliminarTengo 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?
Hola Miangelo,
Eliminarno bastaría simplemente copiar y pegar las fórmulas de esa fila a las otras 500???
Slds