Macros de excel
Buenas, quiero hacer algo con macros tengo un listado de clientes de la empresa y quiero dar un click a un nit de los clientes y me lleve a otra hoja conté me muestre lo los productos que le he vendido, tengo claro que debe de haber una conexión a la base de datos y de igual una consulta o función que me traiga los datos, pero no se por donde empezar, soy programador de vb6 pero me enredo con las macros, me podrían ayudar
Gracias
Gracias
Respuesta de yobert
1
1
Te comento que yo también a inicio tuve el mismo problema, debido a que siempre he programado en lenguaje basic en sus dos versiones 6.0 y NET, pero debido al costo alto de las licencias, lo más suguerible es utilizar herramienta como excel orientado a programación vb 6.0, con respeto a lo que planteastes. Lo primero, que debes hacer es establecer tu conexión ADO o DAO, etc. al igual que la conexión que realizamos en Vb 6.0 o NET, solo importas los parámetros que necesitas, unas ves que importas todos los registros que necesitas, realizas exportación por ejemplo:
Tengo una base datos de productos vendidos:
Importo la Parámetro cliente, Producto, CantidadVendida, PrecioUnitario de la tabla detalle de pedido.
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim Query As String
Dim row As Double
Dim rstdata() As Variant
Set cn = New ADODB.Connection
With cn
.provider = "microsoft.jet.oledb.4.0"
.ConnectionString = "Data Source=C:\Producto\Ventas.mdb"
.Open
End With
Set rst = New ADODB.Recordset
Query = "Select cliente, Producto, CantidadVendida, PrecioUnitario from detalle de pedido"
With rst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open Query, cn, , , adCmdText
End With
rstdata = rst.GetRows 'el dato de cada registro se almacena en la variable rstdata.
row = ActiveSheet.Range("A65536").End(xlUp).row 'cantidad de registros que tiene la columna A de la hoja X donde vas a importar tus datos.
Filainicio& = 2 ' este caso puse dos a la variable fila de inicio porque deseo que los registros de la base datos me importe desde la fila 2
For Fila& = 1 To UBound(rstdata, 2) + 1 'hago recorrido de toda la tabla donde temporalmente he guardo mis registos que hecho la consulta, en este caso RSTDATA de tipo recorsed, cogo el limite superior UBOUND de mi tabla y evaluo el dato y cada vez que haga el recorrido incremento en +1 para que pase a la siguiente fila evalue el dato del la tabla temporal
For columnacampo = 1 To 21 ' declaras las columnas empieze a importa desde lacolumnan 1 hasta la columnas 21 tu tienes que determinar cuantos registros desees que te importe, esa cantidad, esta referida de acuerdo a la consulta en este caso solo eran cliente, Producto, CantidadVendida, PrecioUnitario (cuatro) desde 1 a 4
If Not IsNull(rstdata(columnacampo - 1, Fila& - 1)) Then ' evualias si los registros no estan vacios, si no estan vacios, se guarda en la fila 2 de la columna 1 , asi sucesivamente.
Cells(filainicio&, columnacampo) = rstdata(columnacampo - 1, Fila& - 1)
End If
Next columnacampo
Cells(filainicio&, 1).Offset(1, 0).Select ' se activa la fila 2 de la columna 1
filainicio& = filainicio& + 1 fila incrementa en uno para seguir importando los datos en la siguiente fila
Next Fila&
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
End Sub
Una vez que has importado los datos, recién puedes exportar los datos de una hoja a otra para poder evaluarlo, por ejemplo exporta los clientes que te han comprado, sin que se repitan mediante filtración de datos, de ahí puedes sacar también la cantidad total que te han comprado, lo primero es que establezcas tu cadena de conexión de datos (Ado en este caso, almacenes temproalmente los datos de la consulta realizada).
Tengo una base datos de productos vendidos:
Importo la Parámetro cliente, Producto, CantidadVendida, PrecioUnitario de la tabla detalle de pedido.
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim Query As String
Dim row As Double
Dim rstdata() As Variant
Set cn = New ADODB.Connection
With cn
.provider = "microsoft.jet.oledb.4.0"
.ConnectionString = "Data Source=C:\Producto\Ventas.mdb"
.Open
End With
Set rst = New ADODB.Recordset
Query = "Select cliente, Producto, CantidadVendida, PrecioUnitario from detalle de pedido"
With rst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open Query, cn, , , adCmdText
End With
rstdata = rst.GetRows 'el dato de cada registro se almacena en la variable rstdata.
row = ActiveSheet.Range("A65536").End(xlUp).row 'cantidad de registros que tiene la columna A de la hoja X donde vas a importar tus datos.
Filainicio& = 2 ' este caso puse dos a la variable fila de inicio porque deseo que los registros de la base datos me importe desde la fila 2
For Fila& = 1 To UBound(rstdata, 2) + 1 'hago recorrido de toda la tabla donde temporalmente he guardo mis registos que hecho la consulta, en este caso RSTDATA de tipo recorsed, cogo el limite superior UBOUND de mi tabla y evaluo el dato y cada vez que haga el recorrido incremento en +1 para que pase a la siguiente fila evalue el dato del la tabla temporal
For columnacampo = 1 To 21 ' declaras las columnas empieze a importa desde lacolumnan 1 hasta la columnas 21 tu tienes que determinar cuantos registros desees que te importe, esa cantidad, esta referida de acuerdo a la consulta en este caso solo eran cliente, Producto, CantidadVendida, PrecioUnitario (cuatro) desde 1 a 4
If Not IsNull(rstdata(columnacampo - 1, Fila& - 1)) Then ' evualias si los registros no estan vacios, si no estan vacios, se guarda en la fila 2 de la columna 1 , asi sucesivamente.
Cells(filainicio&, columnacampo) = rstdata(columnacampo - 1, Fila& - 1)
End If
Next columnacampo
Cells(filainicio&, 1).Offset(1, 0).Select ' se activa la fila 2 de la columna 1
filainicio& = filainicio& + 1 fila incrementa en uno para seguir importando los datos en la siguiente fila
Next Fila&
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
End Sub
Una vez que has importado los datos, recién puedes exportar los datos de una hoja a otra para poder evaluarlo, por ejemplo exporta los clientes que te han comprado, sin que se repitan mediante filtración de datos, de ahí puedes sacar también la cantidad total que te han comprado, lo primero es que establezcas tu cadena de conexión de datos (Ado en este caso, almacenes temproalmente los datos de la consulta realizada).
¿Qué pena quiero saber este código donde hace la conexión se coloca en un modulo o en que evento se debe de colocar?
El procedimiento lo copias dentro de un modulo, y llamas al procedimiento con el objeto de tipo botón
Private Sub CommandButton1_Click()
call Importar_Datos
End Sub
MODULO:Procedimiento importar datos
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Public Sub Importar_Datos()
Dim Query As String
Dim row As Double
Dim rstdata() As Variant
Set cn = New ADODB.Connection
With cn
.provider = "microsoft.jet.oledb.4.0"
.ConnectionString = "Data Source=C:\Producto\Ventas.mdb"
.Open
End With
Set rst = New ADODB.Recordset
Query = "Select cliente, Producto, CantidadVendida, PrecioUnitario from detalle de pedido"
With rst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open Query, cn, , , adCmdText
End With
rstdata = rst.GetRows 'el dato de cada registro se almacena en la variable rstdata.
row = ActiveSheet.Range("A65536").End(xlUp).row 'cantidad de registros que tiene la columna A de la hoja X donde vas a importar tus datos.
Filainicio& = 2 ' este caso puse dos a la variable fila de inicio porque deseo que los registros de la base datos me importe desde la fila 2
For Fila& = 1 To UBound(rstdata, 2) + 1 'hago recorrido de toda la tabla donde temporalmente he guardo mis registos que hecho la consulta, en este caso RSTDATA de tipo recorsed, cogo el limite superior UBOUND de mi tabla y evaluo el dato y cada vez que haga el recorrido incremento en +1 para que pase a la siguiente fila evalue el dato del la tabla temporal
For columnacampo = 1 To 21 ' declaras las columnas empieze a importa desde lacolumnan 1 hasta la columnas 21 tu tienes que determinar cuantos registros desees que te importe, esa cantidad, esta referida de acuerdo a la consulta en este caso solo eran cliente, Producto, CantidadVendida, PrecioUnitario (cuatro) desde 1 a 4
If Not IsNull(rstdata(columnacampo - 1, Fila& - 1)) Then ' evualias si los registros no estan vacios, si no estan vacios, se guarda en la fila 2 de la columna 1 , asi sucesivamente.
Cells(filainicio&, columnacampo) = rstdata(columnacampo - 1, Fila& - 1)
End If
Next columnacampo
Cells(filainicio&, 1).Offset(1, 0).Select ' se activa la fila 2 de la columna 1
filainicio& = filainicio& + 1 fila incrementa en uno para seguir importando los datos en la siguiente fila
Next Fila&
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
sub
Para poder importar datos necesitas agregar las siguientes referencias, o librerías que se encuentra en la pestaña herramientas/referencias, Microsoft activex data objetc (la ultima version que encuentres), microsoft ado Ext. 2.8 y microsoft office 11.0.
Private Sub CommandButton1_Click()
call Importar_Datos
End Sub
MODULO:Procedimiento importar datos
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Public Sub Importar_Datos()
Dim Query As String
Dim row As Double
Dim rstdata() As Variant
Set cn = New ADODB.Connection
With cn
.provider = "microsoft.jet.oledb.4.0"
.ConnectionString = "Data Source=C:\Producto\Ventas.mdb"
.Open
End With
Set rst = New ADODB.Recordset
Query = "Select cliente, Producto, CantidadVendida, PrecioUnitario from detalle de pedido"
With rst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open Query, cn, , , adCmdText
End With
rstdata = rst.GetRows 'el dato de cada registro se almacena en la variable rstdata.
row = ActiveSheet.Range("A65536").End(xlUp).row 'cantidad de registros que tiene la columna A de la hoja X donde vas a importar tus datos.
Filainicio& = 2 ' este caso puse dos a la variable fila de inicio porque deseo que los registros de la base datos me importe desde la fila 2
For Fila& = 1 To UBound(rstdata, 2) + 1 'hago recorrido de toda la tabla donde temporalmente he guardo mis registos que hecho la consulta, en este caso RSTDATA de tipo recorsed, cogo el limite superior UBOUND de mi tabla y evaluo el dato y cada vez que haga el recorrido incremento en +1 para que pase a la siguiente fila evalue el dato del la tabla temporal
For columnacampo = 1 To 21 ' declaras las columnas empieze a importa desde lacolumnan 1 hasta la columnas 21 tu tienes que determinar cuantos registros desees que te importe, esa cantidad, esta referida de acuerdo a la consulta en este caso solo eran cliente, Producto, CantidadVendida, PrecioUnitario (cuatro) desde 1 a 4
If Not IsNull(rstdata(columnacampo - 1, Fila& - 1)) Then ' evualias si los registros no estan vacios, si no estan vacios, se guarda en la fila 2 de la columna 1 , asi sucesivamente.
Cells(filainicio&, columnacampo) = rstdata(columnacampo - 1, Fila& - 1)
End If
Next columnacampo
Cells(filainicio&, 1).Offset(1, 0).Select ' se activa la fila 2 de la columna 1
filainicio& = filainicio& + 1 fila incrementa en uno para seguir importando los datos en la siguiente fila
Next Fila&
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
sub
Para poder importar datos necesitas agregar las siguientes referencias, o librerías que se encuentra en la pestaña herramientas/referencias, Microsoft activex data objetc (la ultima version que encuentres), microsoft ado Ext. 2.8 y microsoft office 11.0.
Buenos días, la base de datos mis es sql yo veo que el ejemplo esta en access, ¿debo de darle la ruta donde se encuenta la base de datos? ¿Qué es en un server?
Lo único que tienes que cambiar es el proveedor de acceso a datos:
En vez de:
.Provider="microsoft.jet.oledb.4.0"
Cambialo por:
.Provider = "MSDASQL"
En la cadena de conexión, es la mismo que hacemos en vb 6.0 y NET, la cadena de conexión defines si tu base datos esta en el mismo ordenador o esta en un server.
.ConnectionString = cnn.Open "driver={SQL Server};" & _
"server=NOMBRE_DEL_SERVIDOR;database=LA_BASE;uid=USUARIO;pwd=PASSWORD"
La mejor forma de crear un acceso datos es creando archivos *. UDL, estos archivos son fáciles de crearlo, de esta manera podrías también acceder a tu base datos. La sentencia seria de esta manera:
.ConnectionString = "file name=C:\Carpeta\ejemplo1.udl"
Saludos, ¿te refieres a que la base datos esta en un servidor o que es un server?, si te refieres a que la base datos esta en un server significa que el motor de datos al cual vas acceder para importar tus datos, se encuentran en un servidor (ordenador provee de recursos y servicios a los clientes o host, estaciones de trabajo, o pcs) por lo tanto la arquitectura es cliente - servidor, trabaja en dos capas entidad presentación (reglas de negocio, etc) y acceso a datos, en caso que la base datos estuviera en un ordenador el ordenador seria cliente servidor.
En vez de:
.Provider="microsoft.jet.oledb.4.0"
Cambialo por:
.Provider = "MSDASQL"
En la cadena de conexión, es la mismo que hacemos en vb 6.0 y NET, la cadena de conexión defines si tu base datos esta en el mismo ordenador o esta en un server.
.ConnectionString = cnn.Open "driver={SQL Server};" & _
"server=NOMBRE_DEL_SERVIDOR;database=LA_BASE;uid=USUARIO;pwd=PASSWORD"
La mejor forma de crear un acceso datos es creando archivos *. UDL, estos archivos son fáciles de crearlo, de esta manera podrías también acceder a tu base datos. La sentencia seria de esta manera:
.ConnectionString = "file name=C:\Carpeta\ejemplo1.udl"
Saludos, ¿te refieres a que la base datos esta en un servidor o que es un server?, si te refieres a que la base datos esta en un server significa que el motor de datos al cual vas acceder para importar tus datos, se encuentran en un servidor (ordenador provee de recursos y servicios a los clientes o host, estaciones de trabajo, o pcs) por lo tanto la arquitectura es cliente - servidor, trabaja en dos capas entidad presentación (reglas de negocio, etc) y acceso a datos, en caso que la base datos estuviera en un ordenador el ordenador seria cliente servidor.
Buenos días, cuando hablo de server es que la base de datos esta en un servidor, pero me podrías aclarar algo, ¿a qué te refieres cuando hablas de trabajar en dos capas entidad presentación?
La mejor forma de crear la conexión a la motor datos, que se encuentran en el server es creando archivos .UDL, de esta manera podrás hacer la conexión a tu base datos obviamente que se encuentra servidor, cuando hagas conexión a tu servidor, solo estableces la ruta de tu archivo UDL en el conectionstring de la siguiente manera:
.ConnectionString = ""file name=c:\Carpeta\NombreArchivo.udl" 'establece la conexion motor de datos.
La arquitectura de software se establece al elegir la tecnología con la cual vas a desarrollar tu aplicación, la cual define niveles de programación: Existen programación orientado a objetos en 3 capas (Presentación (Formularios, botones, etc), capa negocios (Programación y validaciones ) y conexión a datos ( Acceso a base datos, conexiones, consultas, trigger, etc), existe en dos capas Presentación y Acceso a datos, te recomendaría que indages arquitecturas de programación y sus respectivas capas, con respecto a tu pregunta, porque dos capas Porque en tu Pc, host local tendrás la aplicación la presentación(diseño, programación, validaciones, etc) y en el servidor el motor de base datos( Conexión a datos, consultas, reportes, etc)
.ConnectionString = ""file name=c:\Carpeta\NombreArchivo.udl" 'establece la conexion motor de datos.
La arquitectura de software se establece al elegir la tecnología con la cual vas a desarrollar tu aplicación, la cual define niveles de programación: Existen programación orientado a objetos en 3 capas (Presentación (Formularios, botones, etc), capa negocios (Programación y validaciones ) y conexión a datos ( Acceso a base datos, conexiones, consultas, trigger, etc), existe en dos capas Presentación y Acceso a datos, te recomendaría que indages arquitecturas de programación y sus respectivas capas, con respecto a tu pregunta, porque dos capas Porque en tu Pc, host local tendrás la aplicación la presentación(diseño, programación, validaciones, etc) y en el servidor el motor de base datos( Conexión a datos, consultas, reportes, etc)
- Compartir respuesta
- Anónimo
ahora mismo