comparar celdas con un libro cerrado

26/09/2006 - 02:11 por Diego | Informe spam
Grupo.
Hay un trabajo repetitivo que realizo, es actualizar datos de un libro de
origen en uno de destino.
Trabajo con 3 archivos, 2 de ellos en servidores distintos y el último es el
archivo central que solo yo manejo.
Los archivos publicos estan compartidos, así varios usuarios pueden
actualizar información a la vez, semanalmente actualizo el archivo central
actualizo las otras copias.
Ambos archivos tienen la misma estructura (cuado termino de actualizar, el
archivo actualizado reemplaza el original).
Quisiera automatizar este trabajo, para lo cual necesito saber como hago
referencia a una celda en un archivo cerrado, y que pueda inclusive leer la
información del contenido de una celda.

Gracias.
 

Leer las respuestas

#1 Héctor Miguel
26/09/2006 - 05:10 | Informe spam
hola, Diego !

... necesito saber como hago referencia a una celda en un archivo cerrado
... que pueda... leer la informacion del contenido de una celda.



op1: prueba [estando ambos libros abiertos] 'jalando' en alguna celda la informacion del otro libro...
despues cierra el libro 'de origen'... y revisa 'como' ha quedado la formula donde se hace la referencia...
-> 'ESA' es [exactamente con puntos, comas y apostrofos] 'la formula' que necesitas para 'leer' de libros cerrados
misma que puedes 'escribir', ya sea manualmente o por macros modificando rangos de origen y destino segun se requiera

op2: si tus requerimientos van mas alla de la anterior 'sencillez'... te paso algo de informacion al final del presente ;)
es 'algo... extensa' :)) asi que te sugiero que no omitas detalle en todo este 'rollo' :D

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

para este tipo de 'requerimientos' ['recomiendan'] usar ADO [ActiveX Data Objects] 'que' DAO [Data Access Objects]
'pero'... [efectivamente] =>se requiere<= esteblecer una referencia [en el proyecto de macros] ...
a la biblioteca de objetos =>Microsoft ActiveX Data Objects x.x Library<= 'x.x' corresponde a la version 'instalada'
[ademas] si el proyecto sera ejecutado en diferentes pc's... es =>recomendable<= 'programar' EN la version 'mas baja'
[y aunque tambien tiene sus 'visicitudes']... si 'desconoces' la dimension del rango [mientras el 'otro' libro esta cerrado]
[me parece que] es [quizas] =>la unica<= opcion 'viable' para 'rescatar' [bloques de] datos de un libro =>SIN 'abrirlo'<
otra alternativa seria 'tomar' UNA A UNA [cada vez] las referencias 'conocidas' en el libro cerrado
esto lo puedes hacer con una [simple?] instruccion usando el metodo 'ExecuteExcel4Macro'
=> NO requiere 'aditamentos', pero... seria una 'llamada' por cada celda del rango hasta que <= :((

te adjunto un ejemplo de 'ExcecuteExcel4Macro' y otro usando ADO ;)
_______
opcion 1: tomar datos desde un libro cerrado (UNA REFERENCIA A LA VEZ con el metodo ExecuteExcel4Macro)
==> primer paso, una funcion [es una manera muy 'versatil'] ...
Function ExtraerDeArchivo( _
ByVal DelDirectorio As String, _
ByVal DelArchivo As String, _
ByVal DeLaHoja As String, _
ByVal DeLaReferencia As String)
Dim TomarDe As String
If Right(DelDirectorio, 1) <> "\" Then DelDirectorio = DelDirectorio & "\"
TomarDe = "'" & DelDirectorio & "[" & DelArchivo & "]" & DeLaHoja & "'!" & _
Range(DeLaReferencia).Range("a1").Address(, , xlR1C1)
ExtraerDeArchivo = ExecuteExcel4Macro(TomarDe)
End Function

==> segundo paso, 'como llamarla' ...
Sub ExtraerUnDato()
Dim Ruta As String, Archivo As String, Hoja As String, Referencia As String, Mensaje as String
Ruta = "C:\Mis documentos": Archivo = "Pruebas.xls": Hoja = "Hoja3": Referencia = "b25"
Mensaje = " Directorio: " & Ruta & vbCr & _
" Archivo: " & Archivo & vbCr & _
" Hoja: " & Hoja & vbCr & _
"Referencia: " & UCase(Referencia) & vbCr & _
"Lectura de la referencia al libro NO ABIERTO:"
MsgBox Mensaje & vbCr & ExtraerDeArchivo(Ruta, Archivo, Hoja, Referencia)
End Sub
_______
opcion 2: tomar datos desde un libro cerrado [una o varias celdas a la vez, usando ADO]
==> MUY IMPORTANTE: deberas establecer una referencia en el proyecto VBA [herramientas / referencias...]
a la biblioteca de objetos ==> Microsoft ActiveX Data Objects x.x Library
==> primer paso, la funcion ...
Function TomarDatosDeArchivoCerrado( _
ByVal ArchivoDeOrigen As String, _
ByVal HojaDeDatos As String, _
ByVal RangoDeDatos As String, _
ByVal Títulos As Boolean)
Dim ConectarCon As ADODB.Connection, Ejecutar As ADODB.Command, HDR As String, _
Registros As ADODB.Recordset, Reg_n As Integer, Campo As Integer
Set ConectarCon = New ADODB.Connection
If Títulos = True Then HDR = "Yes" Else HDR = "No"
ConectarCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ArchivoDeOrigen & ";" & _
"Extended Properties=""Excel 8.0;" & _
"IMEX=1;" & _
"HDR=" & HDR & ";"";"
Set Ejecutar = New ADODB.Command
Ejecutar.ActiveConnection = ConectarCon
If HojaDeDatos = "" _
Then Ejecutar.CommandText = "SELECT * from `" & RangoDeDatos & "`" _
Else Ejecutar.CommandText = "SELECT * from `" & HojaDeDatos & "$" & RangoDeDatos & "`"
Set Registros = New ADODB.Recordset
Registros.Open Ejecutar, , adOpenKeyset, adLockOptimistic
If Registros.RecordCount > 1 Or Registros.Fields.Count > 1 _
Then MsgBox "Seleccionados..." & vbCr & _
Registros.Fields.Count & " campos (columnas) de " & vbCr & _
Registros.RecordCount & " registros (renglones)." _
Else MsgBox "Selección de UN registro unicamente."
Registros.MoveFirst
Do While Not Registros.EOF And Campo <= Registros.Fields.Count - 1
For Campo = 0 To Registros.Fields.Count - 1
For Reg_n = 1 To Registros.RecordCount
MsgBox "En el campo " & Campo + 1 & " {" & Registros.Fields(Campo).Name & "}" & vbCr & _
"Valor del registro " & Reg_n & ": " & Registros.Fields(Campo).Value
Registros.MoveNext
Next: Registros.MoveFirst: Next: Loop: ConectarCon.Close
Set ConectarCon = Nothing: Set Registros = Nothing: Set Ejecutar = Nothing
End Function

==> segundo paso, 'como llamarla'
==> tiene dos 'formas' [seleccionas la que necesites en el cuadro de mensaje]:
==> usando el nombre de la hoja y el rango de datos, o solo una referencia a un rango con nombre ...
Sub ExtraerVariosDatos()
Dim Forma As VbMsgBoxResult
Forma = MsgBox("Selecciona la forma de consulta al archivo externo..." & vbCr & _
" SI = Usar Hoja y Rango de celdas" & vbCr & _
" NO = Usar Nombres (en rangos)", _
vbYesNo + vbQuestion, "Forma de consulta")
If Forma = vbYes _
Then TomarDatosDeArchivoCerrado "C:\Mis documentos\Pruebas.xls", "Hoja3", "a21:c25", False _
Else TomarDatosDeArchivoCerrado "C:\Mis documentos\Pruebas.xls", "", "NombreRango", False
End Sub

en esta segunda opcion, el primer MsgBox 'te dice' cuantas columnas y renglones tiene el rango ['de algo servira']
y el segundo MsgBox 'te dice' los valores que contiene cada celda en el rango [puedes cambiar los MsgBox por ... ??? ]

Preguntas similares