Mandar Datos a Excel desde Access con ruta especifica

Hoy vengo con un tema que me esta dando dolor de cabeza. Tengo un código en VB programado para un botón en un formulario. Lo que hace este botón es enviar la información indicada en el formulario a un archivo de formtado prediseñado en excel. La modificación que vengo queriendo hacer es que cuando le de clic al botón este abra, o pregunte por el valor de un campo para direccionar la información al excel correspondiente:

Ej. Si el valor del campo "Carrier" es "TELESITES" me abra el formato correspondiente a telesites.

O si el valor del campo "Carrier" es "ATC" me abra el formato correspondiente a ATC.

Anexo mi Código, esperando puedan ayudarme.

Private Sub Comando36_Click()
'Declaramos las variables
Dim vFolio As String, vID As String, vNom As String, vLati As String, vLong As String, vFecha As Date, vDir As String, vCiu As String, vEst As String, vReq As String
Dim rutaPlantilla As String
Dim nuevoExcel As String
Dim miExcel As Object
Dim miHoja As Object
'Cogemos los datos del formulario
vFolio = Nz(Me.Folio.Value, "")
vID = Nz(Me.IdSitio.Value, "")
vNom = Nz(Me.SITIO.Value, "")
vLati = Nz(Me.LATITUD.Value, "")
vLong = Nz(Me.LONGITUD.Value, "")
vFecha = Nz(Me.FechaIngreso.Value, "")
vDir = Nz(Me.DIRECCION.Value, "")
vCiu = Nz(Me.CIUDAD.Value, "")
vEst = Nz(Me.ESTADO.Value, "")
vReq = Nz(Me.TipoSol.Value, "")
'Asignamos la ruta hasta la carpeta para el nuevo Excel
nuevoExcel = Application.CurrentProject.Path & "C:\Plantillas_Gestoria"
'Cogemos la ruta de la plantilla
rutaPlantilla = Application.CurrentProject.Path & "C:\Plantillas_Gestoria\SOLICITUDES_OPERANDO.xlsx"
'Abrimos la plantilla de Excel
Call ShellExecute(Me.hWnd, "Open", "C:\Plantillas_Gestoria\SOLICITUDES_OPERANDO.xlsx", "", "", 1)
'Capturamos la instancia de Excel para poder operar desde Access
Set miExcel = GetObject("C:\Plantillas_Gestoria\SOLICITUDES_OPERANDO.xlsx")
'Cogemos la "Hoja1" de la plantilla
Set miHoja = miExcel.worksheets("FORMATO_4")
'Operamos sobre la hoja
With miHoja
.Range("L62").Value = vFolio
.Range("D10").Value = vID
.Range("D9").Value = vNom
.Range("D16").Value = vLati
.Range("D17").Value = vLong
.Range("L8").Value = vFecha
.Range("A100").Value = vDir
.Range("A101").Value = vCiu
.Range("A102").Value = vEst
.Range("G42").Value = vReq
End With
'Guardamos el Excel con otro nombre
'miExcel.SaveAs "C:\Plantilla" & vID & ".xlsx"
End Sub

1 Respuesta

Respuesta
1

Es sencillo:

En vez de la línea en la que asignas la ruta de la plantilla, construyes un select case o un bloque if Then ElseIf Then... para indicar las distintas plantillas en función del valor del campo, por ejemplo:

Select Case Me.Carrier
Case "TELESITES"
rutaPlantilla = "C:\Plantillas_Gestoria\Plantilla TELESITES.xlsx"
Case "ATC"
rutaPlantilla = "C:\Plantillas_Gestoria\Plantilla ATC.xlsx"
Case ...
End Select

Y sigues con tu código, y cambias:

Call ShellExecute(Me.hWnd, "Open", "C:\Plantillas_Gestoria\SOLICITUDES_OPERANDO.xlsx", "", "", 1)
'Capturamos la instancia de Excel para poder operar desde Access
Set miExcel = GetObject("C:\Plantillas_Gestoria\SOLICITUDES_OPERANDO.xlsx")

por estas otras lineas:

Call ShellExecute(Me.hWnd, "Open", rutaPlantilla, "", "", 1)
'Capturamos la instancia de Excel para poder operar desde Access
Set miExcel = GetObject(rutaPlantilla)

Tienes un error en el código, que no notas porque no usas las variables en las que asignas la ruta: si usas Application.CurrentProject.Path, no puedes encadenar una ruta absoluta, tendrás que poner la parte relativa que sigue a la carpeta donde tengas alojada la BD.

Un saludo!


Supongamos que son formatos diferentes en excel. Es decir, los de Telesites, usan esos campos que ves en el código, sin embargo, para los ATC solo tengo que llenar 3 campos en el archivo excel. De que manera se especifica que campos tomara para llenar, en este caso, ¿el formato de ATC en el excel?

Pues igual, haces un Select en la parte final de tu código (lo que va entre el with y el end with), y en cada Case le pasas al excel únicamente los campos que te interesen.

Entiendo el punto Sveinbjorn, admito que soy malo en cuanto la estructura de las condiciones. Si no es mucha molestia, me gustaría que me orientaras con ejemplo el como hacerlo. Gracias!

Carlos, practicando (y fallando) es como mejor se aprende. Deberías intentarlo antes de ver mi ejemplo...

El código que sigue es solo una orientación de cómo tendrías que hacerlo:

Select Case Me.Carrier
Case "TELESITES"
With miHoja
.Range("L62").Value = vFolio
.Range("D10").Value = vID
.Range("D9").Value = vNom
End With
Case "ATC"
With miHoja
.Range("A101").Value = vCiu
.Range("A102").Value = vEst
.Range("G42").Value = vReq
End With
Case ...
....
End Select

Vale, seguí todos sus consejos y su ayuda, hasta ahora eh logrado que abra el formato correspondiente según el valor que tenga el campo Carrier. Pero lo que nadie me ha dicho es sobre el problema que tengo en la línea:
Set miHoja = miExcel.worksheets("FORMATO_4") cual es el verdadero problema (sé que Yó por saber poco de programación) pero lo poco que sé, intuyo que el problema radica en esa linea, no se como, ni porqué, pero abre el archivo correcto dependiendo el valor de Carrier, pero no esta tomando los valores especificados en el CASE que hice.
El error dice: se ha producido el error '9' en tiempo de ejecución: Subíndice fuera de intervalo
cuando le doy depurar, subraya en amarillo la linea: Set miHoja = miExcel.worksheets("FORMATO_4")

Con esa descripción de error, la pregunta es obvia:

¿Tienes en el excel que has abierto una hoja que se llame "FORMATO_4"?

Yo diría que la respuesta es no, y por eso el error...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas