Jump to content

Pirtrafilla

Members
  • Content Count

    305
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Pirtrafilla

  1. @ikanni, muchas gracias. El proyecto que envías veo que es para firmar directamente en una pantalla táctil. Me gustaría hacerlo a través de una máquina de firma electrónica. Por ejemplo, como las que tienen en los bancos. Pero como no tengo idea de cómo hacerlo, la idea que tu planteas me parece perfecta. Sinceramente no entiendo el código que manipula la imagen, pero voy a estudiarla. Muchísimas gracias. Moisés.
  2. Buenas tardes!! Estoy intentando buscar sin éxito información acerca de a través de una tableta para firma electrónica poder capturar la firma e insertarla en una hoja Excel, en un rango o una picture, pero no tengo éxito. Os agradezco si podéis darme un poco de luz, o si sabéis de algún link, o donde buscar, porque no veo información al respecto. La intención es que a la hora de imprimir una hoja de entrega de por ejemplo una herramienta de trabajo, en vez de imprimirla y firmarla en papel, pudiera firmarla en una tableta y guardar en PDF o imprimirla pero ya firmada. Todo lo que me sugiráis será de ayuda. Gracias de antemano. Moisés.
  3. @Antoni, ya me funciona. Hace lo que quería en el Evento Click. No se porqué no me lo hacía, por eso preguntaba si el evento era el equivocado. Gracias por responder. Moisés.
  4. Ni caso. Ahora me funciona con el Evento Click. Creo que lo único que he hecho es asignar a una variable el ListboxIndex. O lo mismo es que estoy un poco "despistado". Lo siento. No se si se puede editar un mensaje una vez se ha enviado. Private Sub ListBox4_Click() 'macro para editar los campos seleccionados en Listbox4 If ListBox4.ListIndex = -1 Then Exit Sub Dim n With ListBox4 n = .ListIndex TextBox3 = .List(n, 1) TextBox4 = .List(n, 2) TextBox5 = .List(n, 3) TextBox6 = .List(n, 4) TextBox7 = .List(n, 5) TextBox8 = .List(n, 6) End With End Sub Moisés.
  5. Hola a todos. Tengo un problema que os puede parecer un poco tonto, pero no encuentro como solucionarlo. Seguro que es fácil pero no encuentro el Evento que debo llamar. Tengo en un Userform un Listbox y debajo de este hay unos Textbox. Lo que quiero hacer es que cuando seleccione un datos del Listbox sus datos vayan a parar a los Textbox. Hasta ahí no hay problema, el problema lo tengo porque el código lo he puesto en el Evento Click del Listbox y me envía los datos solo la primera vez que hago click, y cuando selecciono otro item no hace nada. Entiendo que el código lo estoy poniendo en un evento equivocado y no acierto con cuál es. ¿podéis ayudarme por favor? Copio el código, aunque seguro que sabéis donde ponerlo en vez de en el evento Click. Private Sub ListBox4_Click() 'macro para editar los campos seleccionados en Listbox4 If ListBox4.ListIndex = -1 Then Exit Sub With ListBox4 TextBox3 = .List(ListIndex, 1) TextBox4 = .List(ListIndex, 2) TextBox5 = .List(ListIndex, 3) TextBox6 = .List(ListIndex, 4) TextBox7 = .List(ListIndex, 5) TextBox8 = .List(ListIndex, 6) End With End Sub No subo ningún archivo, entiendo que no es necesario. Ruego me disculpéis. Saludos. Moisés.
  6. Hola de nuevo. Ya he conseguido hacerlo funcionar. Private Sub CommandButton3_Click() 'macro para copiar los datos seleccionado del listbox2 al listbox4 If ListBox2.ListIndex = -1 Then Exit Sub Dim i, j, k, salir As Boolean With ListBox2 For i = 0 To .ListCount - 1 salir = False If .Selected(i) = True Then For k = 0 To ListBox4.ListCount - 1 If Val(ListBox2.List(i, 0)) = Val(ListBox4.List(k, 0)) Then salir = True: Exit For Next k If salir = False Then ListBox4.AddItem ListBox2.List(ListBox2.ListIndex, 0) For j = 0 To .ColumnCount - 1 ListBox4.List(contador, j) = ListBox2.List(i, j) Next j contador = contador + 1 End If End If Next End With 'ponemos los totales TotalesListbox End Sub Este bucle ya lo había probado entes, pero no me funcionaba porque comparaba los item de los dos listbox pero sin poner delante "Val". Así que nunca los evaluaba como repetidos. For k = 0 To ListBox4.ListCount - 1 If Val(ListBox2.List(i, 0)) = Val(ListBox4.List(k, 0)) Then salir = True: Exit For Next k De todos modos agradezco a los que os habéis interesado. La solución la tengo gracias a investigar en el foro con otras preguntas parecidas a la mía y adaptando los códigos a mi necesidad. En especial en este tema: Evitar datos duplicados en ListBox en la segunda columna Moisés.
  7. Hola de nuevo. Sigo sin poder solucionar este problema. Si alguien me puede ayudar se lo agradezco. Lo que necesito es pasar los datos de un listbox a otro, previamente seleccionando un item y que no se repita en el listbox de destino. Es decir que si vuelvo a enviar un item que ya haya enviado que no me lo cargue en el segundo listbox. Envié un archivo de prueba y de verdad que necesito ayuda. Muchas gracias de antemano. Moisés.
  8. Hola, envío los archivos con muy pocos datos. https://drive.google.com/open?id=182M2xP2gSYQd7v5AerC3EU1-VYmJpFO6 Es un Excel y un Access. Una vez abrimos el Excel le hacemos click a "Checklist". Nos pedirá la ruta nueva de la base de datos, la del Access. En el combobox "OT" ponemos 12810159. En el combobox "PERIODO OT" ponemos 201901. A la derecha, arriba, le damos a "REPLICAR A OTRO PERIODO". Se abre otro formulario. Dentro del Listbox1, el de en medio, seleccionamos el primer item, ALQUILERES. En el Listbox2, el de la izquierda, seleccionamos cualquier item, o varios a la vez y luego hacemos click en COPIAR SELECCIÓN. Es aquí donde quiero que cuando los item "viajen" al Listbox4, el de abajo, no se repitan si vuelvo a hacer click. Hay más botones, pero no funcionan, están por desarrollar. Ya veis que es un poco lioso, por eso no había enviado el adjunto. Si podéis darme una idea de como hacerlo o ayudarme, os lo agradezco. Saludos, Moisés.
  9. @Antoni, perdona, tienes razón. No lo he subido porque me parecía un problema que no precisaba de ver el archivo completo, sino de una idea para ver que puedo hacer para verificar que no se repita los item de un Listbox a otro. Voy a ver como lo hago porque esto es parte de un fichero grande que además, hasta llegar al botón se ha de salvar otro formulario. Y para colmo es un Excel que toma los datos de un Acces. Lo dicho, perdona, a ver si doy como hacerlo y dejo la información lo más reducido posible. Moisés.
  10. Hola de nuevo a todos. Necesito si es posible ayuda con este asunto. He puesto el siguiente código en el evento click de un botón para copiar los datos seleccionados del Listbox2 al Listbox4, solo con los item seleccionados. El Listbox2 permito multiseleccionar. El problema que tengo es que no se como hacer para una vez copie los datos del Listbox2 al Listbox4 no me repita los que ya he copiado. Tampoco tengo claro que la forma en la que he puesto el código sea la más eficiente, es la que he hecho con los conocimientos que tengo y después de leer en el foro. Si es posible me ayudéis os lo agradezco, como de costumbre. Private Sub CommandButton3_Click() 'macro para copiar los datos seleccionado del listbox2 al listbox4 If ListBox2.ListIndex = -1 Then Exit Sub Dim i, j With ListBox2 For i = 0 To .ListCount - 1 If .Selected(i) = True Then ListBox4.AddItem ListBox2.List(ListBox2.ListIndex, 0) For j = 1 To .ColumnCount - 1 ListBox4.List(contador, j) = ListBox2.List(i, j) Next contador = contador + 1 End If Next End With End Sub He declarado esta variable como Pública. Public contador As String Y cada vez que cambio el Listbox1 aprovecho para vaciar la variable y limpiar el Listbox4 Private Sub ListBox1_Change() contador = 0 ListBox4.Clear End Sub Gracias por vuestra ayuda. Moisés.
  11. @Héctor Miguel , ya he encontrado la solución. He sustituido esta línea. If valorOnulo = "" Then valorOnulo = " null ": num = "" Por esta otra: If IsNull(valorOnulo) Then valorOnulo = " null ": num = "" De todos modos muchas gracias, sin tu ayuda no lo habría podido solucionar. Moisés.
  12. Hola de nuevo. Para simplicar el código y siguiendo tu consejo he modificado por With, pero poniendo el "me" delante a ver si así evito el error que me daba antes. With Me.ListBox1 For i = 0 To .ListCount - 1 valorOnulo = .List(i, 9): num = "'" ' se asume que .list(i, 9) tiene dato (se considera el apóstrofo) ' If valorOnulo = "" Then valorOnulo = " null ": num = "" ' si .list(i, 9) no tiene dato, cambian las variables ' Sql = "update Tb_Checklist set Importe='" & .List(i, 4) & "',Contable='" & .List(i, 7) & "',Previsto ='" & .List(i, 6) & _ "',En_Curso='" & .List(i, 8) & "',ID_Contable=" & num & valorOnulo & num & " where ID =" & .List(i, 0) Rst.Open Sql, Conn, 3, 3, 1 Next End With El error que me da sigue siendo el de "No coinciden los tipos", si el valor es nulo. Moisés.
  13. @Héctor Miguel, muchas gracias por responder. He probado y funciona SOLO si el campo no es nulo. En cuanto el campo está vacío me salta el error de "No coinciden los tipos" Te copio la macro integra como la tengo. Private Sub CommandButton4_Click() Dim i, valorOnulo, num As String 'macro para grabar los datos en tabla Checklist Conexión For i = 0 To ListBox1.ListCount - 1 valorOnulo = ListBox1.List(i, 9): num = "'" ' se asume que .list(i, 9) tiene dato (se considera el apóstrofo) ' If valorOnulo = "" Then valorOnulo = " null ": num = "" ' si .list(i, 9) no tiene dato, cambian las variables ' Sql = "update Tb_Checklist set Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & "',Previsto ='" & ListBox1.List(i, 6) & _ "',En_Curso='" & ListBox1.List(i, 8) & "',ID_Contable=" & num & valorOnulo & num & " where ID =" & ListBox1.List(i, 0) Rst.Open Sql, Conn, 3, 3, 1 Next Conn.Close ListBox1.ListIndex = -1 'macro para grabar el Saldo_Pendiente en tabla Contable Conexión Sql = "UPDATE Contable SET Saldo_Pendiente='" & TextBox12.Value & "' WHERE ID_Contable =" & TextBox5 ' Rst.Open Sql, Conn, 3, 3, 1 Conn.Close Set Rst = Nothing: Set Conn = Nothing 'refrescamos el listbox1 desde este formulario With UserForm3 it = .ListBox1.ListIndex .ListBox1.ListIndex = -1 .ListBox1.ListIndex = it End With ' End Sub Por cierto, con el With Listbox1, En With...., me daba error. He probado primero quitándolo para ver que primero funcione la sentencia SQL y luego intentaré solucionar esto otro. Si me puedes echar una mano con esto te lo agradezco. Moisés.
  14. Hola a todos de nuevo. De nuevo con un problema con una consulta SQL desde Excel a Access. Pongo el código y explico. 'macro para grabar los datos en tabla Checklist Fin = ListBox1.ListCount For i = 0 To Fin - 1 xxx = ListBox1.List(i, 0) Conexión If IsNull(ListBox1.List(i, 9)) Then Sql = "UPDATE Tb_Checklist SET Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & _ "', Previsto='" & ListBox1.List(i, 6) & "', En_Curso='" & ListBox1.List(i, 8) & _ "' WHERE ID =" & xxx Else Sql = "UPDATE Tb_Checklist SET Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & _ "', Previsto='" & ListBox1.List(i, 6) & "', En_Curso='" & ListBox1.List(i, 8) & _ "', ID_Contable='" & ListBox1.List(i, 9) & "' WHERE ID =" & xxx End If Tengo un listbox en un formulario, donde voy modificando datos. En algunos casos he de dejar un campo vacío, o nulo. Es el datos que hay en el ListBox1.List(i, 9). Como me daba error he puesto un IF THEN que al final lo que hago es que si el valor de ListBox1.List(i, 9) es nulo no lo incluyo en el UPDATE. Pero lo que pasa es que si quiero actualizar el registro cuando el valor es nulo en el listbox a la tabla Tb_Checklist en el registro ID_Contable. No consigo hacerlo, y tampoco encuentro en Internet justo este problema. Agradezco si podéis ayudarme. Moisés.
  15. @bigpetroman, fantástico. Excelente idea. El código apenas tarda 2 segundos, ciertamente muy inferior al que había preparado. Muy agradecido. Moisés.
  16. Hola de nuevo. Abraham, te explico. En la primera hoja, Ws1 "Instaladores", hay una lista de personas con su ID_RH. Con un bucle recorro esa lista uno a uno For f1 = 7 To uf1 IDRH = Val(Ws1.Range("A" & f1)): ORDEN = Ws1.Range("B" & f1).value y los busco en la segunda hoja, Ws2 "PartePnetInst". Según el campo "ID_RH" y "Orden" de la primera hoja .AutoFilter Field:=1, Criteria1:=IDRH .AutoFilter Field:=2, Criteria1:=ORDEN filtro en la segunda que coincidan . En principio los ID de la primera deben existir en la segunda. Pero pudiera ocurrir que en la primera tuviera alguna persona de más que ya no esté en la segunda, así que al filtrar con el For Each celda In rng1.SpecialCells(xlCellTypeVisible) no de resultado. Ahí es donde puede ocurrir el error y no se como tenerlo previsto. No se si he logrado explicarlo bien. Gracias Abraham.
  17. Hola Abraham. Pues he hecho como dices y ya funciona. He puesto nombre de las hojas bien. Set rng1 = Ws2.Range("A2:A" & uf2) For Each celda In rng1.SpecialCells(xlCellTypeVisible) He podido ver el funcionamiento en la ventana de inmediato. Debug.Print celda.Address He sustituido tal y como me dijiste con las fechas dia = Val(Left(Ws2.Cells(fila, 6), 2)) por esta linea. dia = Day(Ws2.Cells(fila, 6)) Al iniciar la macro por si acaso me he dejado puesto el filtro he añadido esto. If Ws2.AutoFilterMode Then Ws2.AutoFilterMode = 0 Para evitar que saltara un error cuando el campo en la hoja Ws1 tenía un cero a la izquierda y el mismo número no lo tuviera en la hoja Ws2, he modificado esta línea. IDRH = Val(Ws1.Range("A" & f1)) Antes me ha saltado un error al no encontrar nada en el filtro, es decir no había nada debajo del filtro. Era por esto que digo que en la hoja Ws1 tenia "09850" mientras en la Ws2 tenía "9850". Al no encontrar el valor saltó el error. Lo he solucionado quitando el cero de la izquierda. Pero, ¿se puede prever que no encuentre nada en el filtro y continúe con el siguiente del "For / Next". Entiendo que la clave pasa por depurar esta línea, sin romper nada. If Not celda.value = "" And celda.Row > 1 Then Creo que sería lo último para pulir el código. Muchas gracias por toda tu ayuda!! Moisés.
  18. Hola Abraham. Gracias por el consejo de las variables, he modificado el código para atender este error. Respecto a lo que me sucede te explico. Lo que necesito es solo recorrer las celdas filtradas. No se por qué no lo hace ahora. He modificado el código y he puesto esto. For Each celda In rng1.SpecialCells(xlCellTypeVisible) 'For Each celda In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible) If Not celda.value = "" And celda.Row > 1 Then Sin embargo cuando corro la macro veo que sigue leyendo las lineas no filtradas. Imagina leer más de 2.000 lineas tantas veces. Si es cierto que he reducido el tiempo, porque como solo leo la columna "A" no es lo mismo que leer 10 columna como antes, pero en vez de tardar 30 segundos ahora tardo 10 segundos. Me parece excesivo, si consiguiera solo leer los datos filtrados seguro que estaríamos hablando de apenas 1 segundo o algo más. Ese es el problema que tengo. Copio el código entero para que lo puedas probar, si te es posible. Si no lo fuera estoy igualmente agradecido. Un abrazo. Sub PegarJornadasPnetInst() ApplicationOff ' 'declaro variables Dim uf1 As Long, uf2 As Long, f1 As Long Dim IDRH As String, ORDEN As String Dim celda As Range, rng As Range, rng1 As Range 'asigno las hojas Set Ws1 = Sheets("Instaladores"): Set Ws2 = Sheets("PartePnetInst") 'ultima fila de hojas uf1 = Ws1.Range("A65536").End(xlUp).Row: uf2 = Ws2.Range("A65536").End(xlUp).Row Set rng = Range("A1:J" & uf2) 'recorro cada fila de la hoja ws1 For f1 = 7 To uf1 IDRH = Ws1.Range("A" & f1).value: ORDEN = Ws1.Range("B" & f1).value 'filtro la hoja ws2 segun los valores de IDRH y ORDEN With Ws2.Range("A1:J" & uf2) .AutoFilter .AutoFilter Field:=1, Criteria1:=IDRH .AutoFilter Field:=2, Criteria1:=ORDEN Set rng1 = Range("A2:A" & uf2) For Each celda In rng1.SpecialCells(xlCellTypeVisible) 'For Each celda In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible) If Not celda.value = "" And celda.Row > 1 Then fila = celda.Row 'recorro el rango filtrado en la hoja ws2. Cojo el valor de la columna "F", o columna 6, 'me quedo solo con el día, que son los dos valores de la izquierda, por ejemplo 01/02/2019, sería el 02 dia = Val(Left(Ws2.Cells(fila, 6), 2)) If Ws1.Cells(5, dia + 9) = "S" Or Ws1.Cells(5, dia + 9) = "F" Then GoTo 10 'busco la zona de trabajo zona = Ws1.Cells(f1, 8) Select Case zona Case "BARNA" zona = "BS" Case "MANRESA" zona = "TM" Case "Especiales" zona = "BS" End Select 'asigno la nomenclatura segun la zona Ws1.Cells(f1, dia + 9) = zona 10: Else 'No se ha encontrado el IDRH y ORDEN, no hago nada End If Next 'deshago autofiltro y busco el siguiente de la hoja ws1 .AutoFilter End With Next f1 ' ApplicationOn End Sub Moisés.
  19. Hola a todos. Solucionado. En este mismo foro aparecía la solución El tema ya cerrado Quitar hora y minutos de fecha con Macro @johnmpl respondió a otro compañero con una duda similar, con este código que copio para el interés de quien se encuentre en una situación parecida. Sub ConvierteFechas() With Range("C2", [C1].End(xlDown)) .Value = Evaluate(Replace("if(#,int(#))", "#", .Address)) .NumberFormat = "dd/mm/yyyy" End With End Sub Lo he adaptado y ya funciona. Para colmo yo también tenía un error en esta línea que he corregido. If FechaI < iper Then FechaI = iper Gracias de todos modos!! Moisés.
  20. Hola Abraham, saludos. Subo un archivo de prueba aquí https://drive.google.com/open?id=18CELXF2Mp9grlXXg2B3LxoFS62H21RCj Muchas gracias.
  21. Hola de nuevo. Siento molestar, de verdad que estoy buscando y probando y no me sale bien. Tengo un problema para calcular dos fechas de dos celdas en Excel. En una celda me aparece el formato fecha incluyendo horas y en otra celda solo fecha. Intento restarlas y mientras no cambie de mes la fecha larga no hay problema, pero como sea otro mes lo hace mal. Esta es una foto de las celdas. Y el código que he comenzado a hacer y que luego necesitaré estos cálculos es este. Sub RellenarAusencias() ApplicationOff ' Dim rng1, rng2 As Range Dim FechaF As Date Set Ws = Sheets("AusenciasPnet") uf1 = ActiveSheet.Range("A65536").End(xlUp).Row: uf2 = Ws.Range("A65536").End(xlUp).Row iPer = ActiveSheet.Range("D3") 'fper = Day(Application.EoMonth([d3], 0)) fper = DateSerial(Year([d3]), Month([d3]) + 1, 1) - 1 For x = 2 To uf2 valor = Ws.Range("F" & x) Set busco = ActiveSheet.Range("A7:A" & uf1).Find(valor) If Not busco Is Nothing Then r = busco.Row FechaI = Ws.Range("N" & x): FechaF = Ws.Range("O" & x) If Ws.Range("O" & x) = "" Then FechaF = fper If FechaI < iPer Then FechaI = fper If FechaF > fper Then FechaF = fper dias = FechaF - FechaI + 1 MsgBox "Inicio " & FechaI & " ,Fin " & FechaF & " ,días " & dias End If Next ' ApplicationOn End Sub Para que veáis cuando da el fallo... La fecha Inicio que aparece en la celda es 28/01/2019 0:00, y sin embargo me lo trata como si fuera el mes "02". No veo como solucionarlo. Ah!!, el msgbox que veis en el código lo he puesto para ver si calculaba bien las fechas y por eso me he dado cuenta que lo hace mal. Gracias. Moisés.
  22. Hola a todos, necesito si podéis que echéis una mano con este código. El código funciona bien, pero es lento. Porque recorre cada celda de la fila y ejecuta una acción tantas columnas tenga el rango filtrado. No se si se puede hacer que en cuanto encuentre el valor filtrado y ejecute la acción cambie de fila. Eso aceleraría considerablemente el código. Lo copio y si podéis ayudarme os lo agradezco. Sub PegarJornadasPnetInst() ApplicationOff ' 'declaro variables Dim uf1, uf2, f1 As Long Dim IDRH, ORDEN As String Dim celda As Range, rng As Range 'asigno las hojas Set ws1 = Sheets("Instaladores"): Set ws2 = Sheets("PartePnetInst") 'ultima fila de hojas uf1 = ws1.Range("A65536").End(xlUp).Row: uf2 = ws2.Range("A65536").End(xlUp).Row Set rng = Range("A1:J" & uf2) 'recorro cada fila de la hoja ws1 For f1 = 7 To uf1 IDRH = ws1.Range("A" & f1).value: ORDEN = ws1.Range("B" & f1).value 'filtro la hoja ws2 segun los valores de IDRH y ORDEN With ws2.Range("A1:J" & uf2) .AutoFilter .AutoFilter Field:=1, Criteria1:=IDRH .AutoFilter Field:=2, Criteria1:=ORDEN For Each celda In rng.SpecialCells(xlCellTypeVisible) If Not celda.value = "" And celda.Row > 1 Then fila = celda.Row 'recorro el rango filtrado en la hoja ws2. Cojo el valor de la columna "F", o columna 6, 'me quedo solo con el día, que son los dos valores de la izquierda, por ejemplo 01/02/2019, sería el 02 dia = Val(Left(ws2.Cells(fila, 6), 2)) If ws1.Cells(5, dia + 9) = "S" Or ws1.Cells(5, dia + 9) = "F" Then GoTo 10 'busco la zona de trabajo zona = ws1.Cells(f1, 8) Select Case zona Case "BARNA" zona = "BS" Case "MANRESA" zona = "TM" Case "Especiales" zona = "BS" End Select 'asigno la nomenclatura segun la zona ws1.Cells(f1, dia + 9) = zona 10: Else 'No se ha encontrado el IDRH y ORDEN, no hago nada End If Next 'deshago autofiltro y busco el siguiente de la hoja ws1 .AutoFilter End With Next f1 ' ApplicationOn End Sub Moisés.
  23. Muchas gracias de verdad. Guardo el comentario para tenerlo en cuenta en el futuro. Moisés.
  24. Perfecto, muchas gracias. Así lo he podido solucionar. Solo que la consulta SQL le he tenido que poner otra comilla o me daba error en los campos que contenían valor. La he sustituido por esto: , Contable='" & nContable & "', Muchas gracias. Moisés.
  25. Hola Abraham. El Textbox7 lo tengo bloqueado para que no se manipule, pero si lo uso. Lo uso en otro evento. Y tengo intención de usarlo más tarde donde está bloqueado pero pidiendo permiso antes. No me importa ponerlo a cero. Supongo que te refieres a que cuando de alta un registro aproveche y le ponga un cero en vez dejarlo sin valor y luego tener problemas, ¿cierto? Moisés.
×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png