Tnego un libro Excel, con cinco hojas.
Los datos se introducen en la Hoja1. El resto de las Hojas, hacen procesos sobre estos datos de la Hoja1
A lo largo del tiempo, voy haciendo modificaciones en el libro, para mejorar o sencillamente para resulver pequeños fallos detectados en el diseño...
El usuario ha introducido ya sus datos en la Hoja1 y le envio la nueva version. Se encuentra con que debe "traspasar" los datos desde la version anterior y aunque es obvio que puede hacerse por el recurso de abrir los dos libros y copiar y pegar los datos desde la Hoja1 vieja a la Hoja1 nueva, ya que el formato de columnas, filas y celdas en general, es el mismo en las dos versiones.
Puedo, sin dificultad, utilizando la Application.GetOpenFilename... escoger el fichero donde estan los datos metidos, pero mi pregunta en concreto es: Se puede gestionar este traspaso de datos desde el libro nuevo, sin necesidad de abrir el libro viejo...?
La idea, es incluir un boton en alguna de las hojas del libro, y vincularlo al macro que pudiera hacer ese proceso... Agradeceria cualquier pista al respecto...
Para leer del libro viejo Excel tendrá que abrirlo, otra cosa es que se le muestre el proceso al usuario.
Prueba a crear un objeto workbook que se refiera al libro antiguo y con él das los pasos necesarios para traer la información al libro nuevo
Dim LibroAntiguo As Workbook
Set LibroAntiguo = Workbooks.Open(RutaAlArchivo) 'la ruta que obtienes con getopenfilename
With LibroAntiguo
'importas los datos que necesites
End With
LibroAntiguo.Close False 'cerramos sin guardar cambios
Set LibroAntiguo = Nothing
End Sub
si no quieres que el usuario vea el proceso puedes desactivar la actualización de la pantalla durante la macro
Application.ScreenUpdating=false 'al principio del proceso
------
Ya sé Excel, pero necesito más.
Muchas gracias Paco... una vez mas.
Voy a trabajar sobre la idea que me ofreces, y volvere a hacerme presente en el Foro, tanto si responde a mi planteamiento, como si encuentro alguna dificultad.
He querido responder pronto, porque preveo estar unos dias ocupado en otras cosas. En cuanto salga de ello, lo probare.
De todas maneras, tiene toda la pinta de que va a funcionar...
Gracias, Paco.
Saludos.
Una opción seria utilizar las viejas macrofucniones, un ejemplo.
Sub Obtener_Datos()
Application.ScreenUpdating = False
With Sheets("Hoja1")
'verificamos si hay datos en la hoja
'donde se almacenaran los resultados
datos = Application.CountA(.Range("A1:A11"))
'insertamos una linea para poder limpiar el rango
.Range("A1:D1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'si hay datos en la hoja donde se almacenaran los resultados
'los borramos para actualizarla
With .Range("A2:D11")
If datos > 0 Then .ClearContents
'definimos de que libro extraeremos los datos
ruta_libro = "C:\Users\Usuario\Desktop"
nombre_libro = "Libroprueba.xls"
nombre_hoja = "Hoja1"
'insertamos las formulas
.Formula = "='" & ruta_libro & "\[" & _
nombre_libro & "]" & nombre_hoja & "'!a1"
'dejamos solo los valores
.Value = .Value
End With
'recorremos el rango para eliminar ceros
For b = 1 To 4
With .Columns(b)
.AutoFilter Field:=1, Criteria1:="=0", Operator:=xlOr, Criteria2:="=00"
.SpecialCells(xlCellTypeVisible).ClearContents
End With
Next
'eliminamos la linea que habiamos inssertado
.Range("A1:D1").Delete Shift:=xlUp
End With
Application.ScreenUpdating = True
End Sub
Atte.
joshua
Te agradezco, Joshua, tu aportacion al tema.
Pero la verdad es que se me "escapan" muchas de las expresiones que utilizas, en las macro-funciones.
Es mas, me llega a confundir, algunas de las lineas como esta:
.AutoFilter Field:=1, Criteria1:="=0", Operator:=xlOr, Criteria2:="=00"
porque no entiendo el papel que desempeña lo del formato con un cero... con dos...
De todas maneras, no puedo menos que agradecerte que hayas querido aportar tu solucion al planteamiento que he hecho de los dos libros...
Saludos cordiales
Saludos.
No es complicado en el ambito vba de excel la terminologia que uilizo es la más comun y simple, pero bueno lo más sencillo para entender que es lo que hace una macro es utilizar un exit sub al final de una linea para detener la macro y ver que es lo que realizo en breve te adjuntare un ejemplo.
con respecto a la linea que indicas te amplio.
'recorremos el rango para eliminar ceros
'usamos un bucle para recorrer las columnas donde se insertaron las formulas
esto es para limpiarlas de ceros ya que si no existen datos se genera un cero en el
resultado.
For b = 1 To 4
'comando utilizado para no repetir una misma instrucción que en
'este caso seria Columns(b)
With .Columns(b)
'esta parte no es mas que un autofiltro simple que filtra los resultados con un cero o
'con doble cero
.AutoFilter Field:=1, Criteria1:="=0", Operator:=xlOr, Criteria2:="=00"
'con esta linea borramos solo las celdas visibles
.SpecialCells(xlCellTypeVisible).ClearContents
End With
Atte.
joshua
Existen otras opciones, aunque van a requerir "algunos" conocimientos de VBA (para entenderlo...)
Incluyo directamente los enlaces, porque copiar+pegar tanto texto sería criminal. Y porque, de todas formas, si la información a intercambiar reside en un libro sin macros, la forma más simple es hacerlo como indica Paco. Lo siguiente es para gente que tenga "mucho muchísimo" interés en probar y trastear.
http://www.trazex.com/2012/05/12/abrir-archivos-en-referencias-externas/
http://www.trazex.com/2012/05/03/intercambio-de-informaci%C3%B3n-con-otros-archivos-mediante-ado/
Con el primero, se podrían abrir libros con el mismo nombre (no sería la primera vez que me ocurra). Con lo del segundo, se pueden importar datos de un libro, sin necesidad de abrirlo (por tanto, sin que se ejecuten sus macros).
Un saludo
-----------------------------------------------------------------
www.TrazEX.com (soluciones sobre Excel)
Muchas gracias Enrique, por tu nueva aportacion.
Tnego que decir, que me has acercado al tema de ADO al que una vez me acerque... y sali "asustado" a la primera dificultad... No consegui ni compilar una macro con esas instrucciones, porque supongo que hay que disponer de algun complemento mas...
De todas maneras, te agradezco que estes atento en ayuda del que la solicita...
En mi caso, no me puedo quejar: sois tres buenos amigos, los que habeis respondido a mi llamada de ayuda.
Estoy peleando con el planteamiento de Paco, porque a pesar de que el planteamiento de la solucion es claro como el agua cristalina, me estoy liando con los "pequeños detalles". No controlo cuando esta activo un libro y cuandop esta activo el otro, porque despues de copiar el bloque desde uno de los ficheros, a la hora de pegarlo en el otro, me saltan errores por todas partes... Pero quiero seguir peleando... porque es la unica manera de llegar a aprender. Cada error que soluciono, una gran satisfaccion que me llevo...
De tu aportacion, amigo Joshua, te dire, que "ya voy entendiendo" un poco mas. Espero ese fichero de prueba que me anunciabas, para poder ver sobre un supuesto, el funcionamiento de cada instruccion. La sugerencia me ha parecido muy buena... para mi, que soy novato: eso de poner un End Sub al final de la linea que se desea y "ver" lo que ha pasado...
Pasito a pasito... Gracias a los tres.
Bueno, en vez de poner un "end sub", lo que puedes hacer es ejecutar la macro línea a línea con F8. Si lo que quieres ver está muy lejos, con poner delante de donde te interese un punto de detención (pinchas a la izquierda de la expresión y se pone un punto rojo), ejecutas con F5 y cuando llega al punto se detiene y puedes ver qué ha ocurrido. Si "sobrevuelas" con el ratón las variables, te aparece el valor que tienen en cada momento. Y a partir de ahí, con F8 vas avanzando línea a línea.
Hola Cron.
Gracias tambien a ti, por "meter la cuchara".
Sabes? Todo es bueno para el cocido... del aprendizaje.
He "descubierto" sobre todo la ayuda del "punto de detencion" al que he visto que se llega por distintos caminos, desde pinchar como tu sugieres en tu aporte, hasta ir al F9 para hacer lo mismo... Evivente... lo de pinchar, (lo pone o lo quita secuencialmente), mas comodo.
La tecla F8 para ir paso a paso, viene a ser otra manera de analizar el proceso que se esta ejecutando en la macro...
Joshua me habia sugerido poner Exit Sub (no End Sub como equivocadamente puse en mi respuesta anterior), y esta bien conocer diferentes opciones y hacer uso de la mejor en cada ocasion.
Sobrevolar las variables, esta tambien muy bien. Puede aclarar lo que esta ocurriendo... porque he visto que se puede sobrevolar una variable colocada mucho mas adelante en la macro, y se va actualizando en cada F8 que le afecta... Otra idea que va al puchero...
Gracias Cron.
Saludos.
Disculpa la tardanza, te adjunto el ejemplo que te habia prometido.
Coloca los dos libros en una misma carpeta, esto es porque estoy haciendo referencia a la ruta del Libro_destino con la siguiente línea.
ruta_libro = ActiveWorkbook.Path, pero se pueden colocar en carpetas diferentes cambiando el ActiveWorkbook.Path por la ruta de la carpeta donde se encontrara el Libro_origen de esta forma "C:\Users\Usuario\Desktop", bueno la macro la ejecutas desde el Libro_destino, pruébala y comentas, si quieres probarla de lleno en tu original habría que modificar los rangos de extracción pero esto es sencillo, si no lo puedes realizar con gusto te lo hago solo necesitaría una copia de tu original claro esta que con datos ficticios pero muy importante con la misma estructura es decir rallados formatos, etc.
Atte.
joshua
Hola Joshua:
He visto el funcionamiento de tu macro en estos dos ficheros. Perfecto. Copia los datos y formatea las celdas con alineacion al centro.
Lo he aplicado a mis ficheros haciendo las variaciones en el macro, para ajustar a las columnas y filas que me interesan... y me pierdo...
No acierto a controlar las columnas ni las filas... y en loas datos copiados, sobre todo, los que contienen fechas o numeros... me hace cosas rarisimas que no entiendo...
Me gustaria enviarte los ficheros que yo utilizo, para que veas por donde surgen los problemas.
El fichero origen tiene datos y tiene las hojas protegidas... Me gustaria enviartelo a tu direccion de correo si es posible, para darte las claves de acceso y demas...
He visto que ofreces la posibilidad de enviarte un correo, pero no veo la manera de enviarte los ficheros adjuntos...
Saludos cordiales
Saludos.
Puedes enviarmelos a eliasorozco.serviconta@gmail.com
Atte.
joshua
Gracias Joshua por el envio de los ficheros adaptados para aplicar tu macro. Funciona perfectamente.
Quedo muy agradecido por la solucion que me has proporcionado, y quiero ponerlos a disposicion de todos, por si alguno mas, puede beneficiarse de ello.
Los dos ficheros, se explican por si mismos. El libro_origen tiene los datos, y el libro_destino contiene el macro para recibir los datos.
Saludos cordiales.
Jose Luis
Gracias..son los mejores..un saludo desde Puerto Maldonado,Perú...son extraordinarios....mis respetos
Hola Yo tb necesito algo similar pero con la diferencia elmio debebuscar datos con un criterio y luego copiar donde corresponda alcriterio buscado.
amigos como debería hacer para que solamente copie por ejemplo el rango de la comuna "A" y pague en el rango de la columna "B" del libro destino?..
HOLA TENGO DOS ARCHIVOS DE CALIFICACIONES... TENGO UN TERCERO QUISIERA QUE LAS NOTAS FINAL DEL PRIMER Y SEGUNDO ARCHIVO KISIERA SE KOPIEN AUTOMATICO AL TERCERO ME AYUDARIAS EN ESO... NO ENTIENDO MUCHO DE ESTO SE ME HARIA MAS FACIL CON UN VIDEO O TUTORIAL... GRACIAS DE ANTEMANO
como se filtraria los datos para cojer los datos filtrados y enviarlos para la hoja destino, tengo otra enquietu si tengo una planilla ya echa y quiero meter los datos q estoy mando a esa planilla ya echa pero al momento de insertar esos datos sea mayor, pues q se genere esa nueva columna pero si hay menos q el formato me que asi intacto, espero q me entiendas.
Joshu mi nombre es cesar... me gustaria que me apoyaras con muchas consultas en excel que tengo. como puedo hubicarte para tener tu correo... y poder hacerte las consultas. te paso mi correo. cesargaitanp@hotmail.com
Es una pregunta relacionada.
Tengo 84 archivos excel en una carpeta y necesito extraer la celda G4 de cada uno de ellos para hacer un nuevo libro que contenga una lista copilando esos datos.
al ejecutar esta macro me muestra una mensaje que dice: Este libro contiene uno o mas vinculos que no se pueden actualizar.
-para cambiar el origen de los vinculos o intentar de nuevo actualizar los valores, haga click en modificar
-para dejar los vinculos tal como estan, haga click en continuar
Y NO QUIERO QUE ME APAREZCA ESTE MENSAJE PORFAVOR, AYUDA! SALUDOS
' CopiarDatos Macro
Workbooks.Open Filename:=ruta_planilla 'Abre archivo planilla diaria TURBOVAPOR
Sheets("Trafos").Select
Range("H9:H39").Select
Selection.Copy
Workbooks(nombre_movcombustible).Sheets(b).Activate
Sheets(b).Select
Range("AP21:AP51").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Saludos quisiera saber si alguien tiene los códigos para abrir libros con el mismo nombre y para importar datos de un libro sin necesidad de abrirlo. Es que en este post todos hablan de cosas muy interesantes y códigos muy alucinantes, pero nadie dejo una pizca de código, sólo unos enlaces a páginas que ya no existen. Se agradecer+ia que pusieran esos códigos en el post, para el registro. Además de que no he econtrado otros post en los que se traten estos temas.
comentario movido aquí:
http://www.necesitomas.com/copiar-datos-otro-libro-1
Encontre esta información en esta liga
http://www.audeser.com/2012/05/03/intercambio-de-informaci%C3%B3n-con-ot...
VBA · General
Abrir un archivo Excel y leer datos del mismo es relativamente sencillo, pero puede ser más interesante realizar el intercambio de datos sin recurrir a abrir el programa asociado.
Microsoft permite realizar este intercambio mediante varias tecnologías, entre ellas ADO (hay detractores al respecto).
Hacerlo a través de Excel no resulta del todo simple, pero mediante estas rutinas pueden llevarse a cabo las tareas principales:
Option Explicit
Private Sub GetSheetNames2(ByRef szFullName As String, ByRefaszSheetList() As String)
Dim bIsWorksheet As Boolean
Dim objConnection As ADODB.Connection
Dim rsData As ADODB.Recordset
Dim lIndex As Long
Dim szConnect As String
Dim szSheetName As String
Erase aszSheetList()
Dim ExcelVersion As Integer
ExcelVersion = VBA.Val(Application.Version)
If ExcelVersion < 12 Then
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & szFullName & ";Extended Properties=Excel 8.0;"
Else
szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & szFullName & ";Extended Properties=Excel 8.0;"
End If
Set objConnection = New ADODB.Connection
objConnection.Open szConnect
Set rsData = objConnection.OpenSchema(adSchemaTables)
Do While Not rsData.EOF
bIsWorksheet = False
szSheetName = rsData.fields("TABLE_NAME").Value
If Right$(szSheetName, 1) = "$" Then
''' This is a simple sheet name. Remove the trailing "$" and continue.
szSheetName = Left$(szSheetName, Len(szSheetName) - 1)
bIsWorksheet = True
ElseIf Right$(szSheetName, 2) = "$'" Then
''' This is a sheet name with spaces and/or special characters.
''' Remove the right "&'" characters.
szSheetName = Left$(szSheetName, Len(szSheetName) - 2)
''' Remove the left single quote character.
szSheetName = Right$(szSheetName, Len(szSheetName) - 1)
bIsWorksheet = True
End If
If bIsWorksheet Then
''' Embedded single quotes in the sheet name will be doubled up.
''' Replace any doubled single quotes with one single quote.
szSheetName = Replace$(szSheetName, "''", "'")
''' Load the processed sheet name into the array.
ReDim Preserve aszSheetList(0 To lIndex)
aszSheetList(lIndex) = szSheetName
lIndex = lIndex + 1
End If
rsData.MoveNext
Loop
rsData.Close
Set rsData = Nothing
objConnection.Close
Set objConnection = Nothing
End Sub
Public Function GetSheetsNames(strFileName As String) AsCollection
'Needs a reference to:
'Microsoft ActiveX Data Object X.X Library
'Microsoft ADO Ext. X.X for DLL and Security
Dim tbl As ADOX.Table
Dim sSheet As String
Dim Col As New Collection
Dim objConn As ADODB.Connection
Set objConn = New ADODB.Connection
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0" & ";" & _
"Data Source=" & strFileName & ";" & _
"Extended Properties=Excel 8.0;"
Dim objCat As ADOX.Catalog
Set objCat = New ADOX.Catalog
Set objCat.ActiveConnection = objConn
For Each tbl In objCat.Tables
sSheet = tbl.Name
sSheet = Application.Substitute(sSheet, "'", "")
sSheet = Left(sSheet, InStr(1, sSheet, "$", 1) - 1)
On Error Resume Next
Col.Add sSheet, sSheet
On Error GoTo 0
Next tbl
Set GetSheetsNames = Col
objConn.Close
Set objCat = Nothing
Set objConn = Nothing
End Function
Public Function ReadDataFromWorkbook(ByVal SourceFile AsString, ByVal SourceRange As String) As Variant
' Requiere una referencia a Microsoft ActiveX Data Objects library (Microsoft ActiveX Data Objects x.x Object Library)
' Si SourceRange es una referencia a un rango, la función sólo devuelve datos de la primera hoja en SourceFile
' Si SourceRange es un nombre de referencia la función puede devolver datos de cualquier hoja en SourceFile
' SourceRange must include the range headers
' examples:
' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "A1:A21")
' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "A1:B21")
' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "DefinedRangeName")
Dim dbConnection As ADODB.Connection, rs AsADODB.Recordset
Dim dbConnectionString As String
Set dbConnection = New ADODB.Connection
On Error GoTo InvalidInput
'dbConnectionString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & SourceFile
'dbConnection.Open dbConnectionString ' Abre una conexión a la base de datos
With dbConnection
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & SourceFile & ";" & _
"Extended Properties=Excel 8.0;"
.Open
End With
Set rs = dbConnection.Execute("[" & SourceRange & "]")
On Error GoTo 0
ReadDataFromWorkbook = rs.GetRows ' Devuelve una matriz de dos dimensiones con todos los campos del RecordSet
rs.Close
dbConnection.Close ' Cierra la conexión a la base de datos
Set rs = Nothing
Set dbConnection = Nothing
On Error GoTo 0
Exit Function
InvalidInput:
MsgBox "The source file or source range is invalid!", vbExclamation, "Get data from closed workbook"
Set rs = Nothing
Set dbConnection = Nothing
End Function
Sub Test()
Dim Col As Collection
Dim lgHoja As Long
Dim strRuta_y_NombreArchivo As String
Call fAbrirArchivo(strRuta_y_NombreArchivo)
Set Col = GetSheetsNames(strRuta_y_NombreArchivo)
For lgHoja = 1 To Col.Count
MsgBox Col(lgHoja)
Next lgHoja
End Sub
Sub TestReadDataFromWorkbook()
' Lee datos de un Libro cerrado
Dim strRuta_y_NombreArchivo As String
Call fAbrirArchivo(strRuta_y_NombreArchivo)
Dim matrizTemporal As Variant, lgFila As Long, lgColumnaAs Long
matrizTemporal = ReadDataFromWorkbook(strRuta_y_NombreArchivo, "A1:B21")
' Sin transposición de datos
' For lgFila = LBound(matrizTemporal, 2) To UBound(matrizTemporal, 2)
' For lgColumna = LBound(matrizTemporal, 1) To UBound(matrizTemporal, 1)
' ActiveCell.Offset(lgFila, lgColumna).Formula = matrizTemporal(lgColumna, lgFila)
' Next lgColumna
' Next lgFila
' Con transposición de datos
matrizTemporal = Application.WorksheetFunction.Transpose(matrizTemporal)
For lgFila = LBound(matrizTemporal, 1) ToUBound(matrizTemporal, 1)
For lgColumna = LBound(matrizTemporal, 2) ToUBound(matrizTemporal, 2)
ActiveCell.Offset(lgFila - 1, lgColumna - 1).Formula = matrizTemporal(lgFila, lgColumna)
Next lgColumna
Next lgFila
End Sub
Hola Joshua estuve viendo tu macro y es exactamente lo que necesito, solo necesito hacerle unos cambios ya que necesito hacerlo con varios files, si me pudieras ayudar te lo agradeceria demasiado, mi correo es lcruz10@hotmail.com
Hola vi tus codigos pero cuando lo ejecuto me sale error de compilacion.
quisiera saber si se puede hacer un macro que te permita buscar ciertas palabras dentro de un archivo excel sin tener que abrirlo y mostrarlo en un lista con todas las coincidencias encontradas, y que muestre su ruta o que se ponga como un link que diga abrir la carpeta de ubicacion del archivo.
le agradezo de antemano, espero puedan ayudarme.
si dueran tan amables de enviarme los codigos a mi correo. jose_montalvo_22@hotmail.com
Slds
hola como podria hacer lo mismo pero en una de las hojas se encuentra indicado las hojas que deseo importar.
saludos y gracias por tu tiempo
POR FAVOR MAS INFORMACION DE TU COMENTARIO
Tengo una consulta , como puedo traspasar grandes cantidades de datos a otro excel ya que la macro que han entregado funciona super pero solo traslada 62 lineas hacia abajo .. y yo tengo como 100 registros .
gracias.
Revisa la condición de terminación del bucle.
Un saludo
HOLA PACO GRACIAS POR LA AYUDA QUE BRINDAS, QUISIERA PREGUNTARE ALGO ES PARECIDO A ESTE TEMA:
TENGO UN LIBRO EN MI RED DEL CUAL QUIERO QUE SEA LA BASE PARA UNA LISTA (VALIDACION DE DATOS) EN OTRO LIBRO (NO EN RED). EL PROBLEMA ES QUE DE IGUAL MANERA HE INTENDAO CON FORMULAS AGARRAR EL RANDO DE AHI, ESTA ES UNA DE ELLAS "=DESREF(\\cerl\Royl\[MAESTROS.xlsx]MA_Gestion!$B$2,,,CONTARA(\\cerl\Royl\[MAESTROS.xlsx]MA_Gestion!$B$2:$B$10))" ENTRE OTRAS ALGUNAS FUNIOCNAN OTRAS NO PERO SI O SI TENGO QUE ABIRR AMBOS LIBROS PARA QUE HAGA EL JUEGO CORRECTO. LO MALO ES QUE NO DEBERIA ABRIR EL DE RED PUES EL USUARIO NO DEBERIA PODER HACERLO. QUE ME ACONSEJAS? QUIZAS CON UNA MACRO? PERO COMO ENLAZARIA UNA MACRO CON LA FORMULA EN LA VALIDACIO DE DATOS LISTA?? GRACIAS ESPERO ME AYUDEN.! SALUDOS
Hola Jose luis trate de implementar este apartado pero no me funciona cuando son mas de 65 000 lineas las que se intentan copiar, creo que es por la version de excel. podrías ayudarme para ver como funciona en excel 2013? te agradecería tu respuesta a estebanrc2319@gmail.com
Hola, Gorkim. Me he encontrado con cosas parecidas.
Todos los tipos de referencias volátiles, como DESREF, referencias estructuradas a tablas, INDIRECTO, etc. necesitan que el otro libro esté abierto, porque si no lanzan un error.
La única solución que he encontrado por internet es ponerle al usuario un botón que abre todos los libros referenciados, actualiza y vuelve a cerrarlos. Por supuesto, la apertura es oculta, en modo lectura y se cierran sin guardar para que todo sea transparente al usuario.
Esto funciona hasta cierto punto. En algunas ocasiones, que creo que tiene que ver con el número de libros que se abren para sincronizar, al cerrarlos todos vuelve a dar el error. Probablemente en algún cierre recalcule de nuevo, generando el error.
Otra opción, más laboriosa, es poner un botón de actualizar datos manualmente, y que ese botón abra el otro archivo, recupere los datos, los coloque en su sitio como valor y vuelva a cerrar el origen. De esta manera eliminamos la fórmula volátil, con sus pros y sus contras.
Finalmente, convertir la fórmula en una no volátil (si existe la posibilidad) puede ayudar también, pues las fórmulas no volátiles no necesitan que el otro libro esté abierto para recuperar los datos.
Un saludo
Buenas tardes Pacomejia,
Se que es un tema bastante antiguo pero espero que me puedas ayudar.
Mi intención es copiar datos de un libro (que siempre es el mismo) a otro que es donde ejecuto la macro que estoy haciendo, pero este archivo es un archivo destino siempre cambia y tiene extensión xlsx (es decir no esta habilitado para macros). Este archivo destino lo necesito con esa extensión sin macros. Por tanto estoy escribiendo la macro en el libro de macros personal para poder ejecutarla en cualquier archivo.
Digamos que he conseguido abrir el archivo origen y copiar los datos que quiero pero al copiarlos me los copia en el libro de macros personal no en el archivo que yo quiero. Creo que el problema esta en instrucción This workbook e probado también con Active workbook y el resultado es el mismo.
He tratado como comentas de usar crear dos objetos workbook digamos:
dim Wborigen as workbook
dim Wbdestino as workbook
Set Wbdestino = This workbook
Set Wborigen = Workbooks.Open(RutaAlArchivo)
Te agradezco de antemano la ayuda...
Saludos
(pues sí es antiguo el tema del foro, ocho años)
ThisWorkbook representa el libro que contiene ese código, así que si lo utilizas en el libro de macros personal se referirá precisamente al libro de macros personal
Así que en tu caso, debes cambiar la asignación del libro de destino
Set Wbdestino = This workbook
y definirlo con el libro de destino.
Set Wbdestino =Workbooks ("elnombredetulibrodedestino")
Si quieres crear un libro nuevo, pues puedes hacerlo también así:
Set Wbdestino =Workbooks.Add
Dependerá de cuál sea tu libro de destino.
------
Ya sé Excel, pero necesito más.
Se tiene un libro en excel que tiene clave para ingresar
y se tiene otro libro en excel donde trae datos referenciados del libro 1, como el Libro 1 tiene clave de acceso me solicita que la ingrese desde el libro 2 la clave, como se puede hacer por medio de macros para que no me pida la clave al abrir el libro 2
Si me pueden ayudar, muchas Gracias
La función Workbook.Open tiene un parámetro (el 5º) para pasar la contraseña.
Workbooks.Open Filename:=PathName & Filename, Password:="ContraseñaConTodasLasLetras123"
Un saludo