Jump to content

YoelMonsalve

Members
  • Content Count

    166
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by YoelMonsalve

  1. Bueno luego de leer los otros comentarios, parecería que el evento MouseDown es el que tiene más sentido, en parecerse más al evento Click (de hecho, ¿tienen algo diferente?) Enter() que yo había propuesto, como dije, no es muy bueno porque se puede invocar de otras maneras, como Tabulando o incluso por código SetFocus(), que no debe ser la idea. Claro también queda la opción de considerar si puedes usar otros eventos como los aquí sugeridos, como Click sobre el Label, un Label transparente. Opciones hay muchas, pero es cuestión de que elijas la que más se adapta a tu diseño, tu gusto y tus intenciones. Por creatividad, prueba muchas opciones, y lo más importante elige al final aquéllo con lo que te vas a sentir realmente a gusto en tu resultado final. Y no que te quedes con esa sensación de "quisiera que hubiera sido algo más", tan desagradable. Éxito.
  2. Pues, si no lo pides no te lo doy jaja ..... Ya puse tu "like"
  3. Pues, no podemos dudar que el enfoque está "de lujo".
  4. Hola Haplox, hace tiempo estuve enredado en un problema similar con los eventos de controles VBA. Al parecer, no todos los eventos que uno pudiera suponer están realmente disponibles para los controles. Creo que Click() no está habilitado para TextBox (pero sí para Label). Podrías probar con Enter(), que produce un efecto similar. Puesto que al hacer click sobre el TextBox, invocas automáticamente al Enter. Revisa el resultado en el archivo adjunto, el Label cambia a "Hello" cuando haces click en el TextBox, y "Bye" cuando sales de él. La posible desventaja es que Enter() se dispara por otras razones, por ejemplo al hacer Tabulador sobre los distintos controles del Userform. Prueba1.xlsm
  5. Interesante, bueno puedes dar el tema solucionado.
  6. Hola Jesús, gusto en conocerte. La Macro FormulaSumar() del Módulo1 inserta automáticamente la fórmula que deseas, al final del campo de datos de la columna "L". Puedes aumentar la columna hacia abajo, pero siempre debe comenzar en la fila 8. Ahora, no se cómo quieres invocar la macro, si por medio de un botón, o automáticamente al llenar la hoja .... Coméntame esto, para adaptarlo. jesus-miguel-suma-ByYoel.xlsm
  7. Hyde entiendo, sueles trabajar los datos en grupos, creando memoria virtual para ellos. Si mal no recuerdo ofreciste una solución de ese tipo en un post hace poco. Y usar las funciones de Hoja de Cálculo de Excel (vLookUp) cuando sea posible. Olguita, que bueno te haya ayudado, en mi particular agradecería si me dieras un "like" y si ya está listo podrías dar el tema cerrado.
  8. Mmmmm, raro, déjame revisar. Ok, había unos problemitas con las columnas, tenías "n" y "o", creo que deben ser "k" y "l". Para evitar esto, te puse al inicio del código dos constantes llamandas ColPago y ColVence, simplemente cambia estos valores a los requeridos y serán tomados como tal por el resto del código (pues en las líneas subsiguientes hacemos referencia a estos nombres ColPago y ColVence, más bien que las constantes de letra). Vi que quitaste el "VENCIDA", obviamente para que no te sobreescriba las columnas, y ahora simplemente se marca de amarillo en la columna K aquéllas facturas vencidas y sin pago. Además, moviste el código al códulo de código Módulo1, no debe estar ahí sino en el módulo de Hoja2 (CXC). Revisa y avisa si quedó solucionado! CARTERA2017.xlsm
  9. Hola Hyde, bueno yo creo que este sería un tema cuya conclusión definitiva requeriría extensa investigación, y hacer pruebas comparativas con distintos modelos de código, en la misma máquina y bajo las mismas condiciones, para tomar el tiempo consumido por cada una. En una cantidad de datos pequeño por supuesto no se apreciaría ninguna diferencia, pero sí en una más grande. Ahora, aquí surge un punto interesante, por ejemplo si voy a procesar miles de datos en memoria es más rápido emplear Collection(), que el objeto Array() y programar algoritmos de búsqueda? Usar métodos de las clases ya provistas por VB, o programar data "en bruto" (como en los lenguages antiguos)? Utilizar eficientes algoritmos de ordenamiento para que los duplicados queden consecutivos, y poder eliminarlos fácilmente ? Es un campo amplio y son preguntas bastante abiertas que quizá superen el alcance y propósito de este post, pero si alguien quieren hacer la investigación del tema, y publicar sus resultados aquí sería genial!!, porque ya tendríamos una base de conocimiento sólida que aplicar en nuestros futuros trabajos (aunque yo personalmente no quiero dedicar 100hr de investigación a aclarar definitivamente este punto). Y cuánto a los estilos soy un poco más afin a la manera de Hyde que Antonio, no me gusta para nada estar creando objetos ocultos, después borrarlos, etc. Pero es cuestión personal de cada uno, pienso que cualquier estilo es indiferente siempre y cuando funcione y sea un código "razonablemente" posible de comprender. A menos que el rendimiento sea una variable crítica, en cuyo caso hemos de investigar por métodos eficaces en el sentido de lo expuesto en párrafos anteriores. Saludos a todos.
  10. POSDATA =============================== Debo aclarar que no soy un experto en gráficos e imágenes (ese es un terreno más amplio de la informática), pero vi que se utiliza el método .CopyPicture del Range para exportar una sección de la Hoja de Cálculo como Imagen. No se si exista una manera de configurar mediante código las características de la exportación, como tamaño, formato y resolución de imagen. Si alguien sabe cómo hacerlo, se agradece .... saludos
  11. Hola Haplox, no se si esto te servirá mucho pero una idea puede ser guardar y recortar las vistas previas, pero en formato PNG. Guardas todas tus imágenes en una carpeta. EL objeto ImageBox por defecto no acepta formato de imagen *.png (o hasta las anteriores versiones de Excel así era, no estoy enterado hoy día), pero hace tiempo al buscar en internet conseguí un código de terceros que define un procedimiento para permitir cargar imágenes de otros formatos distintos a *.jpg, se llama LoadPictureGDI(), en lugar de LoadPicture(). Debes crear un módulo de código MLoadPictureGDI en tu proyecto, tal como hago en el archivo de muestra, y copiar el código correspondiente dentro de él. Luego, en el formulario, la instrucción: Set Image1.Picture = LoadPictureGDI( ruta_archivo ) incluyendo en la ruta del archivo el directorio completo, en tu caso era C:\temp, en el mío lo coloqué en la misma ruta del libro ThisWorkbook.Path Eso sí, debes procurar que el tamaño del ImageBox sea el mismo de la imagen recortada que guardaste, pues configuramos el ImageBox con Zoom o Stretch, la imagen no se ve bien. En mi opinión el resultado es bastante bueno, descarga ambos el *.xlsm adjunto y el *.png y ponlos en la misma carpeta, abre el Excel e invoca el formulario. Saludos y espero te haya sido útil este aporte. Haplox-Imagenes-ByYoel.xlsm
  12. Buena esa Antonio. Supongo que mejor dejamos la tarea de comprobación al método ListIndex del ComboBox (quién internamente realizará la verificación), lo cual en términos de rendimiento debería ser más rápido que hacerlo nosotros con loops manuales. Pero creo que tendríamos un problema, si el valor no existe igual se lo estamos dejando al ComboBox (que no debería ser). Tomando tu idea, yo lo adaptaría: Ult_valor = ComboBox1 ComboBox1 = valor If ComboBox1.ListIndex = -1 Then MsgBox "El valor no existe" ComboBox1 = Ult_valor Else MsgBox "Valor encontrado en elemento " & ComboBox1.ListIndex End If
  13. Hola olguita, gusto en conocerte. Bueno, además de lo que aportó Dr. Hyde, estuve examinando el código y aunque técnicamente funciona, la parte del llenado del Combobox2 resulta un poco "ruda". Pues lo hacen a través de Instrucciones On Error, que no me parece muy aconsejable pues el programa debe evitar la aparición de errores, y no generarlos intencionalmente. Una alternativa más o menos parecida sería: ComboBox2.Clear For i = 1 To DATOS.Rows.Count nombre = DATOS.Cells(i, 2) For j = 0 To ComboBox2.ListCount - 1 If ComboBox2.List(j) = nombre Then Exit For Next If j = ComboBox2.ListCount Then ComboBox2.AddItem nombre Next i que inspecciona si el elemento existe en el List(), y sólo en caso contrario lo agrega. Podría hacerse de otras maneras (por ejemplo con Arrays) pero sería complicar el asunto. Incluyo el archivo con todas las modificaciones. Thanks! EJEMPLO LISTAS.xlsm
  14. Iba por lo mismo. Tuve que haber escrito: If FechaPago = "" And Date > FechaVenc Then ... en lugar de simplemente If FechaPago = "" Then. Es decir, si la fecha de vencimiento ya pasó y sigue sin ser pagada. Adjunto archivo modificado. ValidarFechas-2-byYoel.xlsm
  15. Estimado @Lug Barry, sus dos mensajes anteriores ya fueron reportados a Administración. Usted está quedando muy mal con esa actitud, cese sus ataques o pediré sea suspendido. Su participación en nada ayuda a esta comunidad, sólo se dedica a pedir ayuda de los colaboradores, y cuando no se la dan, instigar conflictos y rivalidades entre los participantes. No cometeré el error de dejarme arrastrar a este juego en contra del amigo Antonio, cada uno de nosotros tiene qué aportar en su campo, y no es el foro para protagonizar peleas. Le pido que recapacite, o sino que lo suspendan.
  16. Estimado Lug Barry, creo que este no es el medio adecuado para dirimir diferencias en lo personal conmigo. Este portal se trata exclusivamente de asuntos relacionados con la programción VBA/Excel. Haces señalamientos de tipo "enfocado a eventos negativos", "es muy joven", "es un niño": E incluso poniendo en duda mi capacidad profesional. No voy responderte en cuánto tus opiniones personales hacia mi, ya que son tuyas, pero agradezco por favor y encarecidamente retires todo señalamiento dirigido a cuestionar mi integridad profesional y competencia en el campo que aquí se refiere de la programación VBA/Excel. No viene al caso, y no tienes ninguna prueba ni fundamento para lo que dices. Tengo años de experiencia en la progrmación en mi haber (por haber empezado desde muy joven en ello), y para lo cual te remito a todas mis otras participaciones en el foro. Entonces en conclusión, ten todas las opiniones y diferencias que quieras en lo personal conmigo (son tuyas, las respeto), pero no vengas a tratar de afectar la integridad de mi trabajo con ello. Si quieres trabajar asesorado por otro usuario como Antonio o quién sea, también estás en tu derecho. ============================================================= P.D. Ya reporté este mensaje tuyo a la administración, y solicitando sea eliminado.
  17. Huaso, pero no entiendo. Estuve leyendo dicha conversación y al final de los mensajes se quedaba en que no había (que supiéramos) un evento que se dispare específicamente al cambiar elementos como el color de la celda. Se discutió que Worksheet_SelecionChange() se refería a otra cosa, y que más bien se estaban haciendo los cálculos al cambiar la celda seleccionada. Entonces cómo pudiste resolver el problema finalmente ???
  18. Saludos Enigma, muy bueno tu aporte, sólo un par de detallitos que añadir para que quede mejor: 1. El caption del CommanButton2, debería ser SALIR, supongo. 2. En el For del botón procesar, de I = 1 To Uf, incluí un Exit For para interrumpir el ciclo una vez se encuentre la persona. Ayuda Excel-Cuentas-2.xlsm P.D.- No se, pero a mi el archivo Enigma me funcionó bien desde el principio (!?)
  19. Incluye un archivo, aunque sea con datos ficticios por favor. Es necesario saber con exactitud las celdas donde está localizada la información. Debes incluir un archivo base de Excel, para ayudarte a partir de ahí.
  20. Si se fijan en el segundo Userform, todos los Textbox's personalizados lucen iguales. Tal vez quisiéramos un modelo de TextBox para SubTotal (con un cierto estilo), y otro para Total (suma de sub totales) en otro color. Esto sería como derivar varias clases a partir de la clase personalizada básica (derivada a su vez de MSForms.Texbox), y así ir poder ir armando una biblioteca de controles para tus aplicaciones de Formulario. Estos podrían ser temas futuros para una ampliación de este post.
  21. MacroAntonio no se si es sólo a mi que me sucede, pero cambia la celda B2 a color amarillo. Si luego haces doble clic sobre C2 (amarillo) está bien, pero ve lo que sucede si luego haces doble clic alternadamente sobre las demás celdas de la columna C.
  22. Bueno, el anterior código funciona pero tiene un tiempo de refrescamiento un poco largo (1 segundo) que podría resultar molesto. Según leí, Application.Wait() sólo permite demoras que sean múltiplos de 1 segundo. En cuánto a Timer() según Microsoft se permiten fracciones de un segundo ( https://msdn.microsoft.com/en-us/library/office/gg264416.aspx ), pero no se exactamente qué "fracciones" (el artículo dice textualmente " the Timer function returns fractional portions of a second"). Un post que ubiqué en internet dice que dichas fracciones son centésimas de segundo. Hay casos, y este no es el único, donde las capacidades "nativas" de VBA quedan agotadas y es un momento donde conviene usar las API de Windows. Las API son bibliotecas de funciones dinámicas provistas por, o diseñadas para, ser enlazadas en tiempo de ejecución con los ejecutables de Windows. En otras palabras, llamar API's es invocar directamente funciones del sistema operativo para alguna tarea que querramos realizar (gestión de directorios ficheros, administración de ventanas, etc). En este caso, usemos la Win32 API GetSystemTime() que nos dará la fecha y hora del sistema con resolución de milésimas de segundos http://custom-designed-databases.com/wordpress/2011/get-milliseconds-or-seconds-from-system-time-with-vba/ . La idea es emplear esta API en lugar de la función Now() para obtener una hora más precisa. El prototipo de GetSystemTime(), el cual debemos declarar al inicio de nuestro módulo de código es: Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As mySystemTime_t) donde el argumento lpSystemTime es de un tipo que debemos definir personalizadamente con Private Type. Concretamente una estructura con ciertos campos que representan información sobre el tiempo del sistema: Private Type mySystemTime_t Year As Integer Month As Integer DayOfWeek As Integer Day As Integer Hour As Integer Minute As Integer Second As Integer Milliseconds As Integer End Type El resto de detalles quedan en el archivo adjunto, y están debidamente comentariados. Como nota adicional dejo que esta versión funciona más fluidamente porque emplea un tiempo de refrescamiento de 250ms. Responde al cambio de color de las celdas A1, A2 casi instantáneamente, pero por alguna razón que aún no determino, si cambiamos los valores de dichas celdas, la Macro se detiene, cosa que no ocurría con el primer programa basado en Application.Wait() (si alguien sabe por qué sucede esto, lo agradecería). Igualmente, al abrir el archivo por primera vez la Macro queda congelada (aunque se programó el evento Workbook_Open()), es necesario ir a la Hoja2 y luego de regreso a la Hoja1 para re-ejecutar. Huaso_ActualizarFormula-ByYoel-2.xlsm
  23. Ok, aquí parece que voy solucionando el problema. La cuestión es que se requiere un proceso ejecutado en segundo plano (un "daemon" o demonio), una especie de ciclo infinito que testee constantemente el color de las celdas A1 y A2 (según tu ejemplo, pero probablemente son más que esas), y escriba en A3 el valor correspondiente. El problema es que si invocamos un ciclo infinito, la aplicación se congela y probablemente no nos deje interactuar con la hoja de cálculo. Una solución es usar el famoso DoEvents dentro del ciclo infinito. Esta instrucción transfiere el control al Sistema Operativo (o quizá a la aplicación Host Excel, no estoy seguro) para que continúe efectuando otros procesos, al mismo tiempo que se ejecuta el loop, y por tanto sin congelar la aplicación principal. Referencia de Microsoft para DoEvents En mi programa introducimos una pausa de 1s. tras cada verificación. Este procedimiento para la pausa al parecer deber ser programado manualmente, pues tanto Application.Wait() como la API Win32 Sleep() me daban por resultado el congelamiento mientras dure la pausa. El libro está programado para activar la macro ciclo perpetuo cada vez que se selecciona Hoja1, y se detiene automáticamente si tanto A1 como A2 están vacías. ================================================================================== RESPECTO A LOS COLORES: Si vas a modificar el color de la celda, imagino que usarás alguno de los colores básicos, pensé en vbBlue (o sea, R=0, G=0, B=255) pero no me aparece esta combinación dentro de la paleta de "colores estándar" de mi Excel. Busqué un azul oscuro y estaba codificado como 12611584, y es el que uso en la hoja de cálculo. El rojo de "colores estándar" sí es 255, o sea (R=255, G=0, B=0). El programa funciona, sólo tienes que cambiar el color o valor de las celdas A1 y A2, y en A3 se actualizará cada 1 segundo. Estoy trabajando ahorita para darte una propuesta que refresque más rápido, pero toma esta mientras tando. Si se detiene la macro, cambia de la Hoja 1 a otra hoja, y vuelve a ella. O ejecuta manualmente desde el editor VBA, ya sabes ..... Si te ayudó este aporte, recuerda darme "me gusta", son gratis !!! Huaso_ActualizarFormula-ByYoel-1.xlsm
  24. Saludos ikanni, bueno tu aporte luce por la dirección correcta, el problema es cómo invocar la Macro o Procedimiento justamente cuando se cambia el color de celda. Justo ahora se me ocurre una idea (pero no soltaré prenda aún jaja), déjame investigar un poco y si funciona la publico por aquí
  25. Hola cemaa, en ese caso debes definir un rango de búsqueda e inspeccionar sobre todas las celdas del rango, normalmente con un ciclo FOR. Revisa el archivo adjunto donde coloco mi versión del programa, y de paso observé que estuviste trabajando en el archivo anterior. Por lo cual en esta versión hallarás corregidos algunos de los problemitas de sintaxis que tuviste cuando lo intentaste en el anterior, y pusiste en comentario (y felicitaciones por tu iniciativa) En el camino a escribir mi aporte, publicó su respuesta el amigo Enigma ( saludos! ), con el muy conveniente estilo de "Factura Vencida" en la columna E que incorporé "prestado" a mi programa (espero no sea molestia jaja). Notarás un argumento mostrarMsg un poco extraño en la función CalcularVencidas(), el cual es para que se invoque la macro tanto si activas la Hoja1, como si cambias los datos en la columna E de la misma. Pero en el primer caso muestra mensaje y en el segundo no (pues sería fastidioso que muestre mensaje cada vez que cambias una celda). Algo que no me quedó claro es el criterio para decidir factura vencida, obviamente está vencida y sin pago si la celda contigua de la columna E aparece vacía, ahora en caso contrario que haya pagado pero posterior a la fecha de la columna E, sería acaso "Factura pagada con atraso", o simplemente no se advierte nada ? Ten el archivo, y si te gustó mi segunda colaboración contigo no me pondría bravo con otro "like" ! ValidarFechas-2-byYoel.xlsm
×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png