PROGRAMAR EN VBA MACROS DE EXCEL: Listbox de Excel
Mostrando las entradas con la etiqueta Listbox de Excel. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Listbox de Excel. Mostrar todas las entradas

Como Buscar en Excel Mientras se Escribe y Cargar Listbox con SQL







Como Buscar en Excel Mientras se Escribe en Textbox y Cargar en Listbox 

Buscar en excel mientras se escribeEn el presente post se muestra Como Filtrar en Excel Mientras se Escribe en Textbox y Mostrar los Datos Filtrados en Listbox, utilizando SQL - VBA.

La macro de Excel lista los datos filtrados, crea un filtro avanzado en Excel, que permite usar SQL en Excel, lo que crea una búsqueda dinámica en Excel en tiempo real o automática al ir buscando en la filas de la base de datos de Excel, mientras se va escribiendo en un Textobox, lo que vuelve a la macro un buscador inteligente en Excel.

En el playlist Conectar Excel con Excel con SQL de nuestro canal de YuoTube se muestran varias macros de excel que permiten filtrar en Excel con SQL utilizando la clausula Select, Where entre otras sentencias SQL.

Si te estás iniciando en la operación de Excel o requieres afirmar conocimientos, recomiendo leer un excelente libro Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet

  

Suscribe a nuestro canal para que YouTube te avise cuando se suba nuevo contenido al canal, en el vídeo encontrarás una explicación gráfica y detallada del ejemplo que se muestra en este post.







 


Como Funciona la macro de búsqueda avanzada en Excel VBA tiempo real


El ejemplos de macro de Excel de búsqueda avanzada, se puede descargar desde el final del post, una vez realizada la descarga de la macro, al abrir el archivo de Excel se muestra un formulario de Excel que contiene un Textbox que se donde se escribirán los datos para ejecutar una consulta SQL en una tabla de Excel.

Luego de ingresar un mínimo de tres caracteres en el Textbox de Excel, empieza la ejecución de la macro, la cual va cargando en el listbox todas las coincidencias que encuentre con los caracteres que se van escribiendo, la carga se hace en tiempo real o en forma simultanea a medida que se escribe en el textbox.

La macro que filtra las filas de Excel con SQL, se encuentra en el evento Change del listbox que se usa para el ingreso de datos para luego realizar la búsqueda avanzada en Excel en tiempo real.


⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizás sea de utilidad también

Combinar Excel con Access


Conectar Excel con Excel Obtener Todos los Datos de un Mismo Libro con SQL

Como Filtrar Datos de Otro Libro Excel en Base Criterios con SQL



Como se Crea la Macro de Búsqueda Avanzada Mientras se Escribe en Textbox


Como se dijo la macro se encuentra en el evento Change del Textbox que se encuentre en el userform de Excel, lo primero que se debe hacer para trabajar con SQL en Excel VBA es activar la referencia para que no provoque error, ello se hacer desde el Editor de VBA desde el menú HERRAMIENTAS luego REFERENCIAS debiendo activar la referencia denominada "Microsoft ActiveX Data Objects 2.5 Library".

 Habiendo activado la referencia nombrada, se dimensionan variables y crea el objeto conexión y objeto recorset, de la siguiente forma:


Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

Luego y lo más importante es crear la conexión ADODB para poder trabajar con SQL en Excel VBA, en este caso se conectará con el mismo libro, se usa el siguiente código:

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"""

Posterior se debe crear la SQL o String de consulta, que es la que tendrá los parámetros para filtrar o consultar los datos requeridos, así:

sql = "SELECT * FROM [" & "Hoja1$" & "] WHERE Ucase(Descripcion) LIKE Ucase('%" & UserForm1.TextBox1 & "%') ORDER BY ID ASC"


El código anterior dice: seleccione todos los campos o columnas de la tabla1 (Hoja1), cuando el dato de la fila correspondiente y columna "Descripción" (columna C del ejemplo) coincida con los caracteres escritos en el Textbox, sea que los caracteres o palabra escrita se encuentre al principio, medio, final o sea parte de una cadena de caracteres.

Si la consulta SQL en Excel encontró datos coincidentes en al base de datos con lo escrito en el textbox, éstos son cargados en el objeto "rs", teniendo los datos en memoria hasta que sean usados y se liberen las variables, luego carga los datos en el listbox, pero primero limpia el listbox, agrega un item para cargar la cabecera o titulo de las columnas, se realiza un bucle entre el primer dato y el último dato encontrado por el filtro cuyos datos están en memoria, se usa los siguientes códigos:

b.Clear
b.AddItem
rs.MoveFirst
Do While Not rs.EOF
b.AddItem rs.Fields(0).Value
b.List(b.ListCount - 1, 1) = rs.Fields(1).Value
b.List(b.ListCount - 1, 2) = rs.Fields(2).Value
b.List(b.ListCount - 1, 3) = rs.Fields(3).Value
b.List(b.ListCount - 1, 4) = rs.Fields(4).Value
b.List(b.ListCount - 1, 5) = rs.Fields(5).Value
b.List(b.ListCount - 1, 6) = rs.Fields(6).Value
rs.MoveNext
Loop

Para cargar la cabecera o título de columnas se usa el siguiente código:

For ii = 0 To rs.Fields.Count - 1
b.List(0, ii) = rs.Fields(ii).Name
Next ii


Código del ejemplo y descarga del archivo de excel utilizado


Seguidamente se muestra el código completo de la macro denominada Como Filtrar Datos de Excel Mientras se Escribe y Llenar Listbox Utilizando SQL, se muestra el código contenido en el Formulario de Excel y el código contenido en el módulo, para realizar la descarga en forma gratuita se debe realizar desde los link del final del post.


Código que se inserta en un Formulario de Excel

'-------------------------------------------------------------------------------------------------------
' By marcrodos   https:// programarexcel.com *********  https://youtube.com/programarexcel
'-------------------------------------------------------------------------------------------------------

Private Sub CommandButton3_Click()
Unload UserForm1
End Sub

Private Sub TextBox1_Change()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
On Error Resume Next

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Set a = Sheets("Hoja1")
Set b = UserForm1.ListBox1
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"""


If Trim(UserForm1.TextBox1.Value) = "" Then
sql = "SELECT * FROM [" & "Hoja1$" & "]"
Set rs = cn.Execute(sql)
b.Clear
rs.MoveFirst
Do While Not rs.EOF
b.AddItem rs.Fields(0).Value
b.List(b.ListCount - 1, 1) = rs.Fields(1).Value
b.List(b.ListCount - 1, 2) = rs.Fields(2).Value
b.List(b.ListCount - 1, 3) = rs.Fields(3).Value
b.List(b.ListCount - 1, 4) = rs.Fields(4).Value
b.List(b.ListCount - 1, 5) = rs.Fields(5).Value
b.List(b.ListCount - 1, 6) = rs.Fields(6).Value
rs.MoveNext
Loop
Exit Sub
End If


If Len(UserForm1.TextBox1) > 2 Then
sql = "SELECT * FROM [" & "Hoja1$" & "] WHERE Ucase(Descripcion) LIKE Ucase('%" & UserForm1.TextBox1 & "%') ORDER BY ID ASC"
Set rs = cn.Execute(sql)
UserForm1.ListBox1 = Clear

If rs.EOF = True Then
b.Clear
Set rs = Nothing
cn.Close
Set cn = Nothing
Exit Sub

Else

b.Clear
b.AddItem
rs.MoveFirst
Do While Not rs.EOF
b.AddItem rs.Fields(0).Value
b.List(b.ListCount - 1, 1) = rs.Fields(1).Value
b.List(b.ListCount - 1, 2) = rs.Fields(2).Value
b.List(b.ListCount - 1, 3) = rs.Fields(3).Value
b.List(b.ListCount - 1, 4) = rs.Fields(4).Value
b.List(b.ListCount - 1, 5) = rs.Fields(5).Value
b.List(b.ListCount - 1, 6) = rs.Fields(6).Value
rs.MoveNext
Loop
End If

'Carga los datos de la cabecera en listbox
For ii = 0 To rs.Fields.Count - 1
b.List(0, ii) = rs.Fields(ii).Name
Next ii

Set rs = Nothing
cn.Close
Set cn = Nothing
b.ColumnWidths = "30 pt;50 pt;190 pt;50 pt;50 pt;50 pt;50 pt"
End If
End Sub

Private Sub UserForm_Initialize()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
On Error Resume Next
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Set b = UserForm1.ListBox1


cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
sql = "SELECT * FROM [" & "Hoja1$" & "]"

Set rs = cn.Execute(sql)

rs.MoveFirst
Do While Not rs.EOF
b.AddItem rs.Fields(0).Value
b.List(b.ListCount - 1, 1) = rs.Fields(1).Value
b.List(b.ListCount - 1, 2) = rs.Fields(2).Value
b.List(b.ListCount - 1, 3) = rs.Fields(3).Value
b.List(b.ListCount - 1, 4) = rs.Fields(4).Value
b.List(b.ListCount - 1, 5) = rs.Fields(5).Value
b.List(b.ListCount - 1, 6) = rs.Fields(6).Value
rs.MoveNext
Loop

b.ColumnCount = 7
b.ColumnWidths = "30 pt;50 pt;190 pt;50 pt;50 pt;50 pt;50 pt"

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
On Error GoTo Fin
If CloseMode <> 1 Then Cancel = True
Fin:
End Sub



Código que se inserta en un módulo

'-------------------------------------------------------------------------------------------------------

' By marcrodos   https:// programarexcel.com *********  https://youtube.com/programarexcel

'-------------------------------------------------------------------------------------------------------

#If VBA7 And Win64 Then

'Si es de 64 bits

Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr

Public Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Public Declare PtrSafe Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr

Public Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

Public Declare PtrSafe Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As LongPtr

Public Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As LongPtr

#Else

'Si es de 32 bits

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long

Public Declare Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

#End If

Sub muestra1()

UserForm1.Show

End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛



Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends      

Como Eliminar Item al Pasar Datos Listbox a Otro y Guardar






En este post se muestra algo solicitado en nuestro canal de YouTube, es una Macro que Pasa Datos de un Listbox a Otro y Guarda en Hoja Excel, es otras palabras se muestra como haciendo doble click se pasa un elemento del listbox a otro listbox, a su vez guarda en la hoja correspondiente eliminando el item de la base de datos que da origen al primer listbox.

Si estás trabajando con listbox quizás quieras aprender más sobre este objeto de VBA para Excel, en el link encontrarás muchos ejemplos que serán de utilidad relacionados con listbox de Excel.

Recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.

  

Suscribe a nuestro canal para que YouTube te avise cuando se suba nuevo contenido al canal, en el vídeo encontrarás una explicación gráfica y detallada del ejemplo que se muestra en este post.






 


Para que sea más fácil de entender recomiendo descargar el ejemplo, desde el link del final se podrá hacer dicha descarga, el ejemplo muestra como al hacer doble click en en el Listbox1 que es el que tiene fondo blanco, se pasa el item al Listbox2 que tiene fondo celeste.

A la vez que se pasan los datos de un Listbox a Otro Listbox, también se borra de la Hoja1 de Excel que sirve de base de datos para el Listbox1, guardando el dato en la Hoja2 que es la base de datos del Listbox1.

Básicamente la programación del Listbox2 es idéntica a la del Listbox1, solo que Intercambia donde debe copiar y eliminar datos tanto del listbox como de la hoja de Excel que es donde están contenidos los datos que se muestran en el mismo, es por ello que solo se explicará sobre que realiza la macro en el Listbox1 quedando como tarea para los lectores replicar la misma macro, pero en el Listbox2, no obstante el código que se expone está en forma completa para los dos Listbox.


⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizá sea de utilidad también

Como Exportar desde Excel a TXT de Ancho Fijo


Como Espaciar los Registros en Listbox de Excel

Como Buscar por Cliente Rango de Fechas y Totalizar en el Listbox



Para lograr realizar lo mencionado en el ejemplo se debe primero pasar los datos del Listbox1 al Listbox2, lo cual se logra con los siguientes códigos:

b.AddItem a.List(fila, 0)
b.List(b.ListCount - 1, 1) = a.List(fila, 1)
b.List(b.ListCount - 1, 2) = a.List(fila, 2)
b.List(b.ListCount - 1, 3) = a.List(fila, 3)

También se debe guardar el dato correspondiente en la Hoja2 para ello se usan estos códigos

filaedit = c.Range("A" & Rows.Count).End(xlUp).Row + 1
c.Cells(filaedit, "A") = a.List(fila, 0)
c.Cells(filaedit, "B") = a.List(fila, 1)
c.Cells(filaedit, "C") = a.List(fila, 2)
c.Cells(filaedit, "D") = a.List(fila, 3)


Luego se ordenan los datos en la Hoja2 así:

uf = c.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A1:D" & uf
r2 = "A1:A" & uf
c.Sort.SortFields.Clear
c.Sort.SortFields.Add Key:=Range(r2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With c.Sort
.SetRange Range(r1)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With


Luego se busca en la Hoja1 el item correspondiente para eliminarlo, ya que fue guardado en la Hoja2, se usan los siguienes códigos:

uf = d.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A2:A" & uf
busco = a.List(fila, 0)
Set codigo = Range(r1).Find(busco, LookIn:=xlValues, LookAt:=xlWhole)
If Not codigo Is Nothing Then d.Cells(codigo.Row, "A").EntireRow.Delete
a.RemoveItem a.ListIndex
End Sub

Se debe tener presente que se tiene que eliminar el item del Listbox1, para ello se usa el siguiente código:

a.RemoveItem a.ListIndex

En resumen, la macro copia del Listbox1 al Listbox2, copia inmediatamente los registos en la Hoja2, a la vez que busca el mismo dato en la Hoja 1 para elimiarlo, por último elimina el item en el Listbo1; el código completo del Ejemplo de macro llamado Como Eliminar Item al Pasar Datos Listox a Otro Listbox y Guardar Datos en Excel se muestra a continuación y seguidamente se encuentra el link para descarga del ejemplo.


Código que se inserta en un Formulario de Excel

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********



Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next
Set a = UserForm1.ListBox1
Set b = UserForm1.ListBox2
Set c = Sheets("Hoja2")
Set d = Sheets("Hoja1")
fila = UserForm1.ListBox1.ListIndex
b.AddItem a.List(fila, 0)
b.List(b.ListCount - 1, 1) = a.List(fila, 1)
b.List(b.ListCount - 1, 2) = a.List(fila, 2)
b.List(b.ListCount - 1, 3) = a.List(fila, 3)

filaedit = c.Range("A" & Rows.Count).End(xlUp).Row + 1
c.Cells(filaedit, "A") = a.List(fila, 0)
c.Cells(filaedit, "B") = a.List(fila, 1)
c.Cells(filaedit, "C") = a.List(fila, 2)
c.Cells(filaedit, "D") = a.List(fila, 3)

uf = c.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A1:D" & uf
r2 = "A1:A" & uf
c.Sort.SortFields.Clear
c.Sort.SortFields.Add Key:=Range(r2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With c.Sort
.SetRange Range(r1)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

uf = d.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A2:A" & uf
busco = a.List(fila, 0)
Set codigo = Range(r1).Find(busco, LookIn:=xlValues, LookAt:=xlWhole)
If Not codigo Is Nothing Then d.Cells(codigo.Row, "A").EntireRow.Delete
a.RemoveItem a.ListIndex
End Sub

Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next
Set aa = UserForm1.ListBox1
Set bb = UserForm1.ListBox2
Set cc = Sheets("Hoja2")
Set dd = Sheets("Hoja1")

fila = bb.ListIndex
aa.AddItem bb.List(fila, 0)
aa.List(aa.ListCount - 1, 1) = bb.List(fila, 1)
aa.List(aa.ListCount - 1, 2) = bb.List(fila, 2)
aa.List(aa.ListCount - 1, 3) = bb.List(fila, 3)

filaedit = dd.Range("A" & Rows.Count).End(xlUp).Row + 1
dd.Cells(filaedit, "A") = bb.List(fila, 0)
dd.Cells(filaedit, "B") = bb.List(fila, 1)
dd.Cells(filaedit, "C") = bb.List(fila, 2)
dd.Cells(filaedit, "D") = bb.List(fila, 3)


uf = dd.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A1:D" & uf
r2 = "A1:A" & uf
dd.Sort.SortFields.Clear
dd.Sort.SortFields.Add Key:=Range(r2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With dd.Sort
.SetRange Range(r1)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

uf = cc.Range("A" & Rows.Count).End(xlUp).Row
r1 = "A2:A" & uf
busco = bb.List(fila, 0)
Set codigo = cc.Range(r1).Find(busco, LookIn:=xlValues, LookAt:=xlWhole)
If Not codigo Is Nothing Then cc.Cells(codigo.Row, "A").EntireRow.Delete
bb.RemoveItem bb.ListIndex
End Sub
Private Sub TextBox1_Change()
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
If Trim(TextBox1.Value) = "" Then
     'Me.ListBox1.List() = b.Range("A2:H" & uf).Value
     Me.ListBox1.RowSource = "Hoja1!A2:D" & uf
   Exit Sub
End If
b.AutoFilterMode = False
Me.ListBox1.Clear
Me.ListBox1.RowSource = Clear
For i = 2 To uf
   strg = b.Cells(i, 1).Value
   If UCase(strg) Like "*" & UCase(TextBox1.Value) & "*" Then
       Me.ListBox1.AddItem b.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = b.Cells(i, 4)
   End If
Next i
Me.ListBox1.ColumnWidths = "20 pt;90pt;80 pt;80 pt"
End Sub
Private Sub TextBox2_Change()
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
If Trim(TextBox2.Value) = "" Then
     'Me.ListBox1.List() = b.Range("A2:H" & uf).Value
     Me.ListBox1.RowSource = "Hoja1!A2:H" & uf
   Exit Sub
End If
b.AutoFilterMode = False
Me.ListBox1.Clear
Me.ListBox1.RowSource = Clear
For i = 2 To uf
   strg = b.Cells(i, 2).Value
   If UCase(strg) Like "*" & UCase(TextBox2.Value) & "*" Then
       Me.ListBox1.AddItem b.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = b.Cells(i, 4)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = b.Cells(i, 5)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = b.Cells(i, 6)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = b.Cells(i, 7)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = b.Cells(i, 8)
   End If
Next i
Me.ListBox1.ColumnWidths = "20 pt;90pt;80 pt;80 pt"
End Sub

Private Sub UserForm_Initialize()
Dim fila As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set a = Sheets("Hoja1")
Set b = Sheets("Hoja2")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
uc = b.Cells(1, Columns.Count).End(xlToLeft).Address
wc = Mid(uc, InStr(uc, "$") + 1, InStr(2, uc, "$") - 2)
With Me.ListBox1
    .ColumnCount = 4
    .ColumnWidths = "20 pt;90pt;80 pt;80 pt"
    '.RowSource = "Hoja2!A2:" & wc & uf
End With

uf = a.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To uf
       Me.ListBox1.AddItem a.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = a.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = a.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = a.Cells(i, 4)
Next i


With Me.ListBox2
    .ColumnCount = 4
    .ColumnWidths = "25 pt;90pt;60 pt;60 pt"
End With

uf = b.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To uf
       Me.ListBox2.AddItem b.Cells(i, 1)
       Me.ListBox2.List(Me.ListBox2.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox2.List(Me.ListBox2.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox2.List(Me.ListBox2.ListCount - 1, 3) = b.Cells(i, 4)

Next i

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub



Código que se inserta en un módulo

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********

Sub muestra1()
UserForm1.Show
End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends      

Como Filtrar por Cliente Rango de Fechas y Exportar a Otra Hoja EXCEL






En el post se muestra Como Fitrar por Cliente Rango de Fechas y Exportar los Datos Filtrados a Otro Hoja Excel, la macro de Excel que  se presenta muestra los datos filtrados en un Listbox de Excel, permite filtrar por cliente y a dicho filtro sumarle un filtro por fecha, que luego puede ser exportado a otra hoja del mismo libro.

Si estás trabajando con listbox quizás quieras aprender más sobre este objeto de VBA para Excel, en el link encontrarás muchos ejemplos que serán de utilidad relacionados con listbox de Excel.

Si te estás iniciando en la operación de Excel o requieres afirmar conocimientos, recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.

  

Mira la macro en acción. Suscribe a nuestro canal para que YouTube te avise cuando se suba nuevo contenido al canal, en el vídeo encontrarás una explicación gráfica y detallada del ejemplo que se muestra en este post.







 


El archivo de ejemplo es un archivo comprimido RAR, en el cual se encuentran contenido el archivo con la macro y un archivo JPG que se usa para poner un logo en el informe o reporte que se crea con los datos filtrados en el Listbox de Excel.

Se debe descomprimir en cualquier directorio de la PC con la única condición que se encuentren juntos, para que el ejemplo pueda funcionar perfectamente. En el archivo de Excel se muestra un botón que presionando muestra un formulario de VBA, que nos da la opción a filtrar la base de datos por Cliente y si es necesario se suma un filtro por fechas o rango de fechas.

La macro en primer lugar crea y elimina una hoja denominada reporte que es donde se va a crear el reporte, con el siguiente código

Sheets("Reporte").Delete
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Reporte"
Set a = Sheets("Reporte")

Posteriormente copias los datos filtrados que se están mostrando en el listbox a la Hoja de Excel creaada y denominada Reporte, así

For x = 1 To UserForm1.ListBox1.ListCount - 5
a.Cells(x + 2, "A") = ListBox1.List(x, 0)
a.Cells(x + 2, "B") = CDate(ListBox1.List(x, 1))
a.Cells(x + 2, "C") = ListBox1.List(x, 2)
a.Cells(x + 2, "D") = ListBox1.List(x, 3)
a.Cells(x + 2, "E") = ListBox1.List(x, 4)
a.Cells(x + 2, "F") = ListBox1.List(x, 5)
a.Cells(x + 2, "G") = CDec(ListBox1.List(x, 6))
Next

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizá sea de utilidad también

Como crear una factura con excel, guardarla y enviarla por mail automáticamente


Como enviar mail con archivo Excel y PDF mediante Outlook con Excel

Como hacer un link o hiperlink a google maps con Excel

Luego da formato y arregla el Reporte, cada uno seguramente le agregará lo necesario para que se ajusta a la forma de trabajar de cada uno.

Posteriormente se agrega una imagen se la redimensiona y ubica en el lugar deseado con el siguiente código:

path1 = ActiveWorkbook.Path & "\clientes4.jpg"
Set ran = a.Cells(1, 1)
Set imag = a.Pictures.Insert(path1)
With imag
    .Top = ran.Top
    'reducimos el alto y ancho de la foto
    .Width = 20
    .Height = ActiveCell.RowHeight - 2
    .Left = ran.Left
End With

Por último se guarda la hoja y se obtiene el reporte correspondiente, que son los datos Filtrados por Cliente Rango de Fechas que se Exportan a la Hoja Reporte y que fuera creada al principio de la macro, a continuación el código completo y seguidamente se expone el link para que se pueda descargar el ejemplo.


Código que se inserta en un Formulario de Excel

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********



Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub CommandButton2_Click()
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
dato1 = CDate(TextBox2)
dato2 = CDate(TextBox3)
If dato2 = Empty Or dato1 = emtpy Then
MsgBox ("Debe ingresar datos para consulta entre rango de fechas"), vbCritical, "AVISO"
Exit Sub
End If
If dato2 < dato1 Then
MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
Exit Sub
End If

b.AutoFilterMode = False
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear

'Adiciona un item al listbox reservado para la cabecera
UserForm1.ListBox1.AddItem

If dato1 = Empty Or dato2 = Empty Then

For i = 2 To uf
   dato0 = CDate(b.Cells(i, 2).Value)
   If dato0 >= dato1 And dato0 <= dato2 Then
       Me.ListBox1.AddItem b.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = b.Cells(i, 4)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = b.Cells(i, 5)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = b.Cells(i, 6)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = b.Cells(i, 7)
   End If
Next i


Else

If dato2 < dato1 Then
MsgBox ("La fecha final no puede ser mayor a la fecha inicial"), vbCritical, "AVISO"
Exit Sub
End If

For i = 2 To uf
   strg = b.Cells(i, 1).Value
   dato0 = CDate(b.Cells(i, 2).Value)
   If UCase(strg) Like UCase(TextBox1.Value) & "*" And dato0 >= dato1 And dato0 <= dato2 Then
       Me.ListBox1.AddItem b.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = b.Cells(i, 4)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = b.Cells(i, 5)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = b.Cells(i, 6)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = b.Cells(i, 7)
   End If
Next i

End If


'Carga los datos de la cabecera en listbox
For ii = 0 To 7
UserForm1.ListBox1.List(0, ii) = Sheets("Hoja1").Cells(1, ii + 1)
Next ii

UserForm1.ListBox1.AddItem
UserForm1.ListBox1.AddItem
UserForm1.ListBox1.AddItem
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 0) = "Total Importe"

For x = 0 To UserForm1.ListBox1.ListCount - 1
t = CDec(UserForm1.ListBox1.List(x, 6))
tot = tot + t
t = 0
Next x
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 1) = Format(tot, " ""U$S"" #,##0.00 ")

UserForm1.ListBox1.AddItem
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 0) = "Total de registros:"
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 1) = UserForm1.ListBox1.ListCount - 5

Me.ListBox1.ColumnWidths = "170 pt;70 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
End Sub

Private Sub CommandButton3_Click()
Unload UserForm1
End Sub

Private Sub CommandButton4_Click()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next


'Elimina hoja y crea hoja dando el mismo nombre que la eliminada
Sheets("Reporte").Delete
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Reporte"
Set a = Sheets("Reporte")

For x = 1 To UserForm1.ListBox1.ListCount - 5
a.Cells(x + 2, "A") = ListBox1.List(x, 0)
a.Cells(x + 2, "B") = CDate(ListBox1.List(x, 1))
a.Cells(x + 2, "C") = ListBox1.List(x, 2)
a.Cells(x + 2, "D") = ListBox1.List(x, 3)
a.Cells(x + 2, "E") = ListBox1.List(x, 4)
a.Cells(x + 2, "F") = ListBox1.List(x, 5)
a.Cells(x + 2, "G") = CDec(ListBox1.List(x, 6))
Next

a.Cells(x + 4, "A") = ListBox1.List(x + 2, 0)
a.Cells(x + 5, "A") = ListBox1.List(x + 3, 0)
a.Cells(x + 4, "B") = ListBox1.List(x + 2, 1)
a.Cells(x + 5, "B") = ListBox1.List(x + 3, 1)

a.Activate
a.Range("A1") = "REPORTE DE VENTAS"


a.Range("A2") = "CLIENTE"
a.Range("B2") = "FECHA"
a.Range("C2") = "COMPROBANTE"
a.Range("D2") = "TIPO"
a.Range("E2") = "SUC"
a.Range("F2") = "N COMP"
a.Range("G2") = "IMPORTE"
uf = a.Range("G" & Rows.Count).End(xlUp).Row
a.Range("G2:G" & uf).NumberFormat = "#.#,0"
a.Range("B2:B" & uf).NumberFormat = "dd/mm/yyyy"
a.Range("A:G").Columns.AutoFit
a.Range("A:A").ColumnWidth = 31

With a.Range("A2:G" & uf)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).Weight = xlThin
End With

With a.Range("A2:G" & uf)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlMedium
.Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).Weight = xlThin
End With

With a.Range("A" & uf + 3 & ":G" & uf + 4)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlMedium
End With

With a.Range("A1:G1")
.Merge
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.RowHeight = 75
.Font.Size = 16
.Font.Bold = True
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeLeft).Weight = xlMedium
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeTop).Weight = xlMedium
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlMedium
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeRight).Weight = xlMedium
End With

path1 = ActiveWorkbook.Path & "\clientes4.jpg"
Set ran = a.Cells(1, 1)
Set imag = a.Pictures.Insert(path1)
With imag
    .Top = ran.Top
    'reducimos el alto y ancho de la foto
    .Width = 20
    .Height = ActiveCell.RowHeight - 2
    .Left = ran.Left
End With

ActiveWorkbook.Save
Unload UserForm1
Sheets("Reporte").Select
MsgBox "El reporte se creo con éxito", vbCritical, "AVISO"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Private Sub TextBox1_Change()
On Error Resume Next
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
If Trim(TextBox1.Value) = "" Then
   Me.ListBox1.RowSource = "Hoja1!A1:G" & uf
   Exit Sub
End If


b.AutoFilterMode = False
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
dato1 = CDate(TextBox2)
dato2 = CDate(TextBox3)
'Adiciona un item al listbox reservado para la cabecera
UserForm1.ListBox1.AddItem


For i = 2 To uf
   strg = b.Cells(i, 1).Value
   If UCase(strg) Like UCase(TextBox1.Value) & "*" Then
       Me.ListBox1.AddItem b.Cells(i, 1)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = b.Cells(i, 2)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = b.Cells(i, 3)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = b.Cells(i, 4)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = b.Cells(i, 5)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = b.Cells(i, 6)
       Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = b.Cells(i, 7)
   End If
Next i



'Carga los datos de la cabecera en listbox
For ii = 0 To 7
UserForm1.ListBox1.List(0, ii) = Sheets("Hoja1").Cells(1, ii + 1)
Next ii


UserForm1.ListBox1.AddItem
UserForm1.ListBox1.AddItem
UserForm1.ListBox1.AddItem
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 0) = "Total Importe"

For x = 0 To UserForm1.ListBox1.ListCount - 1
t = CDec(UserForm1.ListBox1.List(x, 6))
tot = tot + t
t = 0
Next x
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 1) = Format(tot, " ""U$S"" #,##0.00 ")

UserForm1.ListBox1.AddItem
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 0) = "Total de registros:"
UserForm1.ListBox1.List(UserForm1.ListBox1.ListCount - 1, 1) = UserForm1.ListBox1.ListCount - 5


UserForm1.TextBox2 = Clear
UserForm1.TextBox3 = Clear

Me.ListBox1.ColumnWidths = "170 pt;70 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
End Sub

Private Sub TextBox2_Change()
If Len(UserForm1.TextBox2) = 10 Then UserForm1.TextBox3.SetFocus
End Sub

Private Sub TextBox3_Change()
If Len(UserForm1.TextBox3) = 10 Then UserForm1.CommandButton2.SetFocus
End Sub

Private Sub UserForm_Initialize()
Dim fila As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set b = Sheets("Hoja1")
uf = b.Range("A" & Rows.Count).End(xlUp).Row
uc = b.Cells(1, Columns.Count).End(xlToLeft).Address
wc = Mid(uc, InStr(uc, "$") + 1, InStr(2, uc, "$") - 2)
With Me.ListBox1
    .ColumnCount = 7
    .ColumnWidths = "170 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt"
    .RowSource = "Hoja1!A1:" & wc & uf
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
On Error GoTo Fin
If CloseMode <> 1 Then Cancel = True
Fin:
End Sub


Código que se inserta en un módulo

'**************https://programarexcel.com  **** https://youtube.com/programarexcel*********

#If VBA7 And Win64 Then

'Si es de 64 bits

Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr

Public Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Public Declare PtrSafe Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr

Public Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr

Public Declare PtrSafe Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As LongPtr

Public Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As LongPtr

#Else

'Si es de 32 bits

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long

Public Declare Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

#End If

Sub muestra1()

UserForm1.Show

End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛



Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends      
4.70/5 – 1379