Jump to content
giordancisco

llenar listbox con valores distintos entre dos tablas

Recommended Posts

Como va? tengo un un formulario en excel que consta de un listbox  que por el momento se llena con los valores de una tabla de acces. Lo que necesito es que solo se carguen los valores que no se encuentran en una tabla de excel que se encuentra en el mismo libro del formulario.

Este es el codigo que estoy usando ahora para llenar el listbox:

Dim Base As String
Dim Sql As String
'Dim rs As String
Dim tb As String
Dim np As String


'E:\Dropbox\MIS PROGRAMAS\ACCES\Buscador de Precios 64 bits 9-4-19.accdb

'HOJA OPCIONES CELDA U2
Dim Conexion As String
Conexion = "PROVIDER=MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE =" & Me.TextBox1.Text & ";PERSIST SECURITY INFO FALSE;"
'uf2 = Sheets("ACCES").Range("I" & Rows.Count).End(xlUp).Row

'Sheets("ACCES").Range("B11:I" & uf2).Clear

'LLAMAMOS AL OBJETO ADO
Set cn = New ADODB.Connection
'ABRIMOS LA CONEXION
cn.Open Conexion
'CREAMOS LA CONSULTA
Set rs = New ADODB.Recordset

With rs
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With

'Consulta = Consulta & " WHERE " & Me.cmbCampo & " Like '*" & Me.txtBusqueda.Text & "*'"
'Sql = "SELECT * FROM Personas where Descripción like " & "'%" & Range("D6") & "%'"
'Like Replace("'%" & UCase(txtBusqueda.Value) & "%'", " ", "%") And
'Sql = "SELECT * FROM Personas where Descripción like " & "'%" & txtBusqueda & "%'"
',FormatCurrency([Precio]) as Precio
'Sql = "SELECT * FROM Personas where " & tb & " like " & Replace("'%" & UCase(txtBusqueda.Value) & "%'", " ", "%") & "AND Proveedor = " & "'" & np & "'"

''cmbCampo.value'


Sql = "SELECT FormatCurrency([Monto comprobante]) as [Monto comprobante],[Nº Comprobante],[Tipo comprobante],[Observacion],[Dirección],[Tipo de Pago],[Vendedor] FROM caja" 'where [Nº Comprobante] <>  "

rs.Open Sql, Conexion

If rs.EOF Then

MsgBox "No se encontraron registros."
Exit Sub
End If

Me.ListBox1.Column = rs.GetRows



'Range("B11").CopyFromRecordset rs

'uf = Sheets("ACCES").Range("I" & Rows.Count).End(xlUp).Row
'Me.Lista.RowSource = "ACCES!B11:I" & uf

cn.Close
rs.Close
Set rs = Nothing
Set cn = Nothing

End Sub

Adjunto el archivo de excel y la base de datos en acces

https://drive.google.com/file/d/1UMQKegqUQbwJ93MQ8TFOslqMVE-7llmV/view?usp=sharing

https://drive.google.com/file/d/1FZ8O8iY6ApMbYUPwBR-2Gn0Ksx7cZABi/view?usp=sharing

La tabla en acces se llama: caja

En excel la tabla se encuentra en la hoja "Base de datos"

 

Desde ya muchas gracias estoy abierto a cualquier sugerencia. Un abrazo

 

 

Share this post


Link to post
Share on other sites

Por ahora conseguí agregar los resultados únicos creando la tabla de excel en acces con este sentencia SQL:

Sql = "SELECT FormatCurrency([Monto comprobante]) as [Monto comprobante],[Nº Comprobante],[Tipo comprobante],[Observacion],[Dirección],[Tipo de Pago],[Vendedor] FROM caja where [Nº Comprobante] not in (Select distinct [Nº Comprobante] from caja2)"

Si pudiera hacer una sentencia similar a esta pero que funcione con la tabla de excel estaría mas que contento. Desde ya muchas gracias

Share this post


Link to post
Share on other sites

A grandes males, grandes remedios.

Después de cargar el listbox con los datos de Access, elimina los elementos que estén en Excel.

Dim Comprobante As Range
Dim x As Long
With ListBox1
   For x = .ListCount - 1 To 0 Step -1
      Set Comprobante = Sheets("Base de datos").Columns("C").Find(.List(x, 1), , , xlWhole)
      If Not Comprobante Is nothimg Then .RemoveItem (x)
   Next
End With

 

Share this post


Link to post
Share on other sites

Había un error de sintaxis.

No he podido probar porqué me dice que no encuentra la tabla de Access cajafinal.

Dim Comprobante As Range
Dim x As Long
With ListBox1
   For x = .ListCount - 1 To 0 Step -1
      Set Comprobante = Sheets("Base de datos").Columns("C").Find(.List(x, 1), , , xlWhole)
      If Not Comprobante Is Nothing Then .RemoveItem (x)
   Next
End With

 

Share this post


Link to post
Share on other sites
Hace 23 minutos , Antoni dijo:

Había un error de sintaxis.

No he podido probar porqué me dice que no encuentra la tabla de Access cajafinal.


Dim Comprobante As Range
Dim x As Long
With ListBox1
   For x = .ListCount - 1 To 0 Step -1
      Set Comprobante = Sheets("Base de datos").Columns("C").Find(.List(x, 1), , , xlWhole)
      If Not Comprobante Is Nothing Then .RemoveItem (x)
   Next
End With

 

No se si los link se actualizan. Vuelvo a copiar y pegar el link con las nuevas modificaciones, tambien le saque el formulario que tenia el archivo acces. Adjunto el archivo excel y acces
https://drive.google.com/file/d/1UMQKegqUQbwJ93MQ8TFOslqMVE-7llmV/view?usp=sharing

https://drive.google.com/file/d/1FZ8O8iY6ApMbYUPwBR-2Gn0Ksx7cZABi/view?usp=sharing

Edited by giordancisco
me olvide un link

Share this post


Link to post
Share on other sites

Muchas gracias señor antoni, ahora voy a probar su propuesta. En el link que adjunte lo que hice fue quitar los formularios que tenia la base de datos que dificultaban la visualización de las tablas, contiene 3 tablas: La tabla "caja" es la referencia. la tabla "cajafinal" es una copia de la tabla de excel que es la que estoy generando ahora para conseguir los valores únicos, y la tabla "personas" es una lista de productos que para este caso no influye en nada.

La solución que encontré antes de que pueda ver su mensaje fue la de crear paralelamente una copia de la tabla de excel en la tabla "cajafinal" del archivo de acces al momento de registrar en el formulario "cajaform". Es decir se hace un registro doble al mismo tiempo tanto en la tabla de excel como en la de acces. De todos modos esto no era lo que pretendía, Así que ahora voy a proseguir con el código que usted muy amablemente me sirvió.  Muchas gracias Antoni
 

Share this post


Link to post
Share on other sites
Hace 55 minutos , Antoni dijo:

Había un error de sintaxis.

No he podido probar porqué me dice que no encuentra la tabla de Access cajafinal.


Dim Comprobante As Range
Dim x As Long
With ListBox1
   For x = .ListCount - 1 To 0 Step -1
      Set Comprobante = Sheets("Base de datos").Columns("C").Find(.List(x, 1), , , xlWhole)
      If Not Comprobante Is Nothing Then .RemoveItem (x)
   Next
End With

 

Lo acabo de probar un funciono! nuevamente muchísimas gracias señor Antoni!. Me hizo feliz. Bendiciones. 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy

Ayuda Excel - Madrid, Madrid, ES - Valorada por 6254 personas - Aprender Excel - Total: 4.7 / 5