VBA - Principiante a Ninja - Serie intermedia | Andrew Jarick | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

VBA - Principiante a Ninja - Serie intermedia

teacher avatar Andrew Jarick, Intelligent Automation Specialist

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      01 - Lección 8 de VBA

      1:56

    • 2.

      02 - Lección 9 de VBA - más funciones

      20:53

    • 3.

      03 - Lección 10 de VBA - cajas de diálogo

      19:23

    • 4.

      04 - Lección 11 de VBA

      20:04

    • 5.

      05 - Lección 12 de VBA

      27:47

    • 6.

      06 - Lección 13 de VBA

      32:15

    • 7.

      07 - Lección de VBA 14 - fechas

      25:07

    • 8.

      08 - Lección 15 de VBA - Formas de usuario

      21:36

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

206

Estudiantes

--

Proyecto

Acerca de esta clase

Para principiantes de VBA a Ninja te enseña cómo convertirte en un programador de ninja experto en Visual Basic para aplicaciones. El curso se divide en tres series, principiante, intermedio y avanzado. La serie de principiantes se centra en los fundamentos de VBA, que te proporcionan los conocimientos para poder comenzar a programar tus propios macros de VBA. A medida que avanzas, los cursos de series intermedios y avanzados, se centran más en funciones específicas que encontrarás en el mundo real, y te proporcionan todas las herramientas que necesitas para poder abordar hasta las tareas más complejas.

A diferencia de otros cursos de VBA, VBA Principiante a Ninja también:

  • Destaca los errores comunes en los que los desarrolladores de VBA a menudo entran y ofrece el enfoque alternativo de mejores prácticas.
  • Te enseña a hacer el código más eficiente, minimizando los recursos informáticos mientras se ejecuta código.
  • Te enseña a crear aplicaciones robustas que sean compatibles y más resistentes a los cambios y a los errores de los usuarios.
  • Te equilibra con los conocimientos y herramientas para poder programar por ti mismo, lo que limita la cantidad de gafas que necesitas hacer mientras te programas para resolver problemas.
  • Cómo integrar VBA con otras tecnologías, como navegadores web, HTML, XML y SQL
  • Te muestra cómo escribir programas VBA que evitan automatizar la interfaz de usuario de MS Office y cómo integrarse programáticamente con estos objetos directa y virtualmente.
  • Cómo adoptar UX (experiencia de usuario) y crear interfaces de usuario hermosas y funcionales que los usuarios disfrutarán de utilizar.

Conoce a tu profesor(a)

Teacher Profile Image

Andrew Jarick

Intelligent Automation Specialist

Profesor(a)

Hello, I'm Andrew.

Ver perfil completo

Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. 01: lección VBA 8: introducción de contenido intermedio: Bienvenido a la siguiente fase de convertirse en un musta ninja de Visual Basic. Mi nombre es Andrew Derek y seré su instructor. Si eres nuevo en VBA, te sugiero que empieces con mi inicio, por supuesto, porque estamos a punto de saltar directamente a algunos temas que requerirán algún conocimiento previo. Simplemente refiérase a mi página de perfil de habilidad compartida para encontrar el enlace al curso de principiante. Para aquellos de ustedes que están listos, ponte cómodo abrir Excel en su computadora. Y empecemos. Empezaré afirmando que la estructura del contenido intermedio cambiará ligeramente del curso de principiante. Comience por supuesto con estructurado de una manera para cubrir los conceptos básicos junto con algún contenido adicional en cada lección para asegurar una buena comprensión amplia de los fundamentos del VB I. Con los fundamentos cubiertos, el contenido intermedio se extenderá a través de múltiples cursos. Como se puede imaginar, hay mucho que cubrir. Si bien te recomiendo aprender y entender todos los temas tratados, este enfoque te brinda la capacidad de aprender las cosas que quieres de manera selectiva. Esto puede ser porque te enfrentas a un problema particular en el lugar de trabajo o por curiosidad o deseo de maestría. Al igual que con el inicio, por supuesto, seguiré abordando los errores comunes que cometen los desarrolladores de VB I y lo que los métodos de mejores prácticas debieran afeitarse el resultado deseado. En última instancia, quiero ayudar a hacer que su código sea eficiente, robusto y proporcione a sus usos finales una experiencia convincente. En este curso, vamos a cubrir funciones de libro de trabajo más críticas, tenía un cuadro de diálogo Crear archivo. Cómo hacer que el código se ejecute en eventos específicos, se hablará de tratar con conjuntos de datos. Y te presentaré una de las funciones más poderosas de VBA. Las matrices también cubrirán múltiples formas de tratar las fechas y comenzarán a profundizar en las formas de usuario y la experiencia del usuario. Ahora empecemos. Te veré en el siguiente video. 2. 02: Lección de VBA 9: más funciones de libro de trabajo: Bienvenido a Lección nueve, más funciones de cuaderno de trabajo. En el mundo real, necesitarás conocer estas funciones críticas del libro de trabajo de VBA. En esta lección, aprenderás acerca de abrir, cerrar y guardar libros de trabajo mediante programación, creando una ruta de archivo completa cuando se me conozca a partir de la lógica empresarial basada en escenarios y supuestos. Aprenderás a lidiar con los mensajes emergentes cuando abras programáticamente un libro de trabajo y escribes código para abrir libros protegidos con contraseña. Aprenderás a cargar archivos enormes al instante. Y te explicaré los argumentos opcionales para el comando open book. Sigamos adelante. Consideremos este escenario. Se le pide que escriba una macro que necesite datos de una fuente externa. El dato se produce automáticamente a una hora específica todos los días y se deposita en un directorio específico. Entonces eso es un conocido, esa es una constante que no va a cambiar. El archivo siempre se depositará en esa carpeta todos los días. El otoño que se genera automáticamente tiene una convención de nomenclatura específica y que es año, mes, día y año siendo personaje completo año dos caracteres mes a Día del Personaje en el punto de conversión de moneda de la escuela csv. Y este tipo de convención de nomenclatura en realidad es bastante común con estos trabajos automáticos que crean archivos. Y eso es para evitar que la Caída sea sobrescrita por el siguiente expediente de dies. Y en realidad están los usos que sí usan estos archivos. Entonces eso significa un par de cosas. Eso significa que no podemos editar el archivo ni eliminarlo. No podemos moverlo y no debemos mantener el seguimiento en demasiado tiempo por si acaso eso bloquea a otros fuera del archivo. Y por último, el equipo en el que estás también requiere una copia de la caída para sus propios fines. Por lo que necesitamos hacer una copia de ese expediente. Entonces echemos un vistazo rápidamente a la pregunta de presentación. Sólo traeré mis documentos aquí. Está bien. Entonces este es el expediente. Simplemente abriré eso rápido. De acuerdo, aquí vamos. Como podemos ver, es un archivo bastante sencillo. Son sólo tres columnas. Tenemos citas con Got a country y tenemos que valores. Se trata de valores de conversión de divisas. También puede notar que el tipo de archivo es un CSV o un valor separado por comas. Los archivos CSV son en realidad solo archivos de texto. No obstante, se pueden abrir en Excel porque este archivo CSV básicamente almacena una tabla de datos. Simplemente cerraré rápidamente esto y lo abriré en el Bloc de notas solo para mostrar que no guardaste. Yo traigo esto de vuelta aquí arriba, click derecho abrir con. Entonces así es como se ve el archivo, abriéndolo en el bloc de notas. Por lo que en primera fila contiene a nuestros bateadores. Y como se puede ver, el valor h está separado por una coma todo el camino a través. Cerraré eso. Entonces el primer problema en el que debemos pensar es que el nombre del archivo cambia todos los días. No obstante, proporcionamos suficiente información para poder crear dinámicamente ese nombre de archivo y abrir el archivo siempre que se haya creado automáticamente en la fecha y hora específicas. Normalmente en el lugar de trabajo con este tipo de empleos, las caídas se depositan en una unidad compartida de red. No obstante, en esta instancia sólo va a estar en mi unidad de decir local en mi carpeta de documentos. Pero eso está bien. El concepto sigue siendo el mismo. Entonces solo voy a empezar con una constante porque sabemos que el archivo va a aparecer en un directorio todos los días en un directorio específico y ese directorio no va a cambiar. Entonces esa es solo mi carpeta de documentos. Como dije antes, estos suelen estar en unidades compartidas de red, pero el concepto es el mismo. Por lo que el propósito de usar variables para crear un nombre de archivo es para que podamos concatenar estas cadenas juntas para crear la ruta completa y el nombre del archivo para que podamos abrirla. Como tal, es importante considerar cómo se verá el hombre de caída una vez que hayas concatenado todas estas cuerdas juntas. A lo que me refiero con eso es mirar hacia fuera estas barras invertidas de directorio y asegúrate de que realmente tengas barras invertidas donde deberían ser una. Entonces la siguiente constante que quiero crear es esta parte del nombre del archivo, porque podemos crear dinámicamente esto en base a la fecha actual. Simplemente usaré esto en una constante porque esta parte no va a cambiar. También. Eso copiaremos. De acuerdo, entonces definamos ahora nuestra subrutina. Sólo lo estoy llamando archivo de datos abiertos. Y pensemos en algunas de las variables que vamos a necesitar. Entonces definitivamente vamos a necesitar un objeto de libro de trabajo, específicamente el libro que vamos a abrir. También vamos a necesitar el cuaderno de trabajo actual porque podríamos estar sacando datos de la apertura unidireccional y depositando en éste. Y adicionalmente, vamos a necesitar los objetos de hoja de trabajo tanto para el libro que vamos a abrir como para el libro en el que vamos a escribir los datos. Entonces ahora trabajemos en cómo vamos a crear el nombre del archivo, que esperamos que tenga este formato de fecha. Entonces el año en personajes completos, mes en personajes, día en personajes. Cómo podemos seguir generando eso para que podamos crear una ruta de archivo completa y nombre de archivo. Yo sólo voy a arrastrar por la ventana inmediata por segundo. Vba tiene algunas funciones incorporadas que nos pueden devolver la fecha y hora actuales. Por lo general, utilice la función now. Entonces permítanme sólo interrogar esa función. Como se puede ver, la función NOW ha devuelto dados y la marca de tiempo actual. No es exactamente en el mismo formato que hicimos. No obstante, en realidad se puede usar esto y coaccionar esto al formato que requerimos. Y déjame mostrarte cómo hacer eso. Entonces solo borraré esa línea. Entonces. Podemos utilizar la función de formato. Y como puede ver, es pedirnos que proporcionemos un documento que sea expresión. Entonces lo que quiero brindarle es la expresión ahora, que va a devolver la fecha que acabamos de ver antes. Y el siguiente argumento es el formato. Por lo que esto es muy similar a la estructura de formato de celdas de Excel. Básicamente podemos simplemente especificar el formato en el que queremos que se devuelva la altura. Entonces yo, por eso, por qué, por qué, por qué m, m d, pero cerca criado y golpeó entrar. Ya verás que nos ha proporcionado la fecha en el formato que requerimos. Entonces el año, el mes, y el día, solo arrastras eso hacia abajo. De acuerdo, entonces ahora tenemos suficiente información para abrir el cuaderno que queremos abrir. Entonces la forma en que abrimos un cuaderno es con, primer lugar, la colección de libros de trabajo. Y la colección de libros de trabajo tiene un método infantil. Abierto en frío. Y luego puedes suplir a eso un montón de argumentos. Pero en realidad somos capaces de abrir el cuaderno y al mismo tiempo sentar ese objeto a un objeto que aquí hemos definido. Y sólo usaremos eso en una declaración de conjunto. Tan sólo cierran como corchetes, para que no esté molesto con nosotros. Entonces esencialmente la sintaxis de esto es que estamos configurando el objeto y con especificar de qué objetos estamos hablando. Y esa es la que vamos a abrir. Entonces ahora proporcionemos el nombre del archivo, que será la ruta completa del archivo, la fecha, y el nombre del archivo. Y usamos ampersand concatenar cadenas. Y ahora necesito la fecha, así que momento. Y ahora necesito el resto del nombre del archivo. Ahora como se puede ver, el nombre del archivo es el primer documento y hay muchos otros argumentos después de eso, y los argumentos que después de eso están entre corchetes. Lo que esto significa es que en realidad son argumentos opcionales, y entraré en lo que son estos argumentos clave más adelante en la lección. Entonces lo siguiente que quiero hacer es tomar este cuaderno que acabamos de abrir, y quiero citar mi propia copia de eso. Entonces ahora que tengo mi objeto libro de trabajo, puedo usar uno de los métodos de ese objeto para guardar y guardar como. Y yo sólo lo voy a poner en el mismo lugar. Entonces en el mismo directorio del que acabamos de sacarlo, Normalmente, quiero decir, probablemente tendrías esto en un directorio diferente, pero solo por el bien de la demostración. Entonces solo usaré eso otra vez. Y voy a guardar el archivo en un formato diferente al que hemos abierto. Entonces eso es un CSV con esta convención de nomenclatura. Entonces cambiaré el nombre y tipo convención y caída. Entonces, antes que nada, quiero la fecha al revés. Entonces di, di mes, mes, año, año, año, año. Y ahora también necesitamos especificar el formato de archivo. Y puedo hacer eso escribiendo Excel workbook default o Excel workbook normal. Voy a usar default. Y eso es todo. Entonces vamos a ejecutar esto para ver cómo vamos. Si sumar a través de eso sucedió de repente, si le pego a FI una vez más. Está bien. Y produzco terminado. Así que vamos a traer a la caída explorar para ver qué está pasando. Entonces podemos ver que tenemos SI cae aquí, lo cual es genial, que es el formato y el nombre de archivo que hemos designado. Abramos eso para echar un vistazo. Ya está abierto. Nos olvidamos de cerrarlo. Ahí vamos. Por lo que hemos abierto el archivo y hemos cambiado ese formato de archivo por un libro XLS x látigo. Déjame solo abrir también la conversión de divisas c es v, para que podamos compararlos uno al lado del otro. Es perfecto. Para que pueda seguir adelante y cerrar esos. Hay una cosa más que quiero hacer es cerrar el cuaderno tras página web, cambia falso. Entonces volvamos a ejecutar esto y veamos qué va a pasar. Si tenemos un libro de trabajo que ya existe con este nombre de archivo el cual ganó un save como sobre la parte superior del mismo. Entonces lo abrí. Echemos un vistazo. Sí, ese es el CSV. Y ahora vamos a ahorrar como. Por lo que nos ha proporcionado un cuadro de mensaje de error. Y nos está preguntando, ¿queremos sobrescribir nota al margen por ahora, lo que nos ha dado un área de depuración porque no fue capaz de ahorrar, que va a terminar en eso y cerrarlo de nuevo. Por lo que obviamente esto no es ideal en cuanto a automatización de VBA porque estos pop-ups sostendrán la ejecución de tu macro y requerirán la intervención del usuario para descartarlos. Por suerte, somos capaces de suprimir ese tipo de pop-ups. Y la forma en que lo hacemos es estableciendo la propiedad display que pertenece al objeto de aplicación. El objeto de aplicación siendo la instancia de Excel, que es el padre para el objeto de colección de libros de trabajo. Entonces si escribo aplicación y luego muestro alertas, se puede decir que el método pop ahí arriba es igual a falso. Lo que eso significa es que mientras el código se está ejecutando, suprimirá que las alertas se muestren. Y seleccionará automáticamente la opción predeterminada. Pero solo recuerda ponerlo siempre en verdad después de que hayas terminado de correr. Entonces intentemos eso de nuevo ahora para ver si hemos suprimido esa caja pop up. Entonces como puedes ver, hemos terminado de ejecutar el código y no vimos un popup, lo cual es genial. Y si solo abro File Explorer, podemos ver que tenemos un nuevo archivo, así que se guarda sobre la parte superior de la caída existente que estaba ahí. Lo cual es genial. Por lo que sólo saltaré de nuevo a nuestro código. De acuerdo, entonces ahora vamos a repasar algunos de los argumentos adicionales que podemos enviar el libro abierto y los libros de trabajo comando Guardar como. Ahora no voy a pasar por todas ellas y especie de ir por las que encuentro son críticas de conocer, lo cual puede ser útil para suprimir aún más las alertas que se muestran durante un comando open o save. Todo lo que puede ser útil en automatización en general. Entonces, en primer lugar, después del método abierto, tenemos nuestros corchetes de apertura y después tenemos nuestros argumentos a los que podemos enviárselo. El primero es obviamente nombre de archivo, y eso es obligatorio. Es necesario especificar qué, qué libro te gustaría abrir. Y separamos los argumentos por comas. Entonces como pueden ver, mientras empiezo a escribir comas, el argumento al que nos estamos refiriendo se vuelve audaz en intellisense. Entonces eso es un dado que necesitamos separar nuestros argumentos con comas. Entonces digamos por ejemplo, yo quería establecer el argumento carga corrupta. Una forma de hacerlo sería golpear coma hasta que la carga corrupta sea audaz, que está ahí. O lo que podría hacer es simplemente decir, primero que nada, separado con una coma y luego enseñé realmente el argumento de carga corrupta. Después con dos puntos y un igual, y verás que ahora el argumento de carga corrupta está en audacia en IntelliSense, lo que significa que cualquier cosa que escriba aquí es para el argumento carga corrupta. Por lo que en realidad puede especificar el orden de los argumentos, o simplemente puede usar la opción de coma para especificar qué argumento le gustaría suministrar. Por lo que el primero es actualizar links. Ahora bien, si has abierto un libro de trabajo en el lugar de trabajo y contiene enlaces a fuentes externas, ya sea otro libro de trabajo o un conjunto de datos. Es posible que veas ese mensaje emergente que dice, ¿te gustaría actualizar los enlaces a estos datos? Ahora, obviamente, estoy abriendo un libro de trabajo programáticamente y sí contiene enlaces. Se va a mostrar ese mensaje, que va a sostener mi macro y no quiero hacer eso. Por lo que en realidad puedes especificar false, lo que evitará que aparezca ese cuadro de mensaje. El siguiente argumento es de sólo lectura. Lo que esto hace es que especifica que abrimos el libro de trabajo en modo de solo lectura, lo cual es bastante autoexplicativo. Y esto puede ser útil específicamente para el escenario que acabamos construir en el que no queremos editar el archivo que estamos abriendo. Simplemente queremos sacar datos de ella y cerrarla rápidamente. Y también puede evitar el bloqueo de caídas, lo que puede ser una molestia en el entorno laboral con múltiples usuarios que usan el mismo archivo. El siguiente es formato. Y esto se usa cuando estamos abriendo un archivo de texto como un CSV. Pero queremos especificar que el delimitador de archivos o el carácter que especifica la separación del campo h es diferente a una coma. Por lo que podría ser una pestaña, podría ser un espacio, podría ser un punto y coma, o podría ser un personaje acostumbrado. Y esta es una lista enumerada, lo que significa que necesitas suministrar un número y en realidad puedes simplemente Google qué número necesitas especificar para la parte superior de la apertura defectuosa, pero voy a pasar rápidamente por ellos. Por lo que uno es para delimitador separado por tabuladores es un delimitador separado por comas, que es el predeterminado. Tres es para espacio, cuatro es para punto y coma, cinco no es nada, y seis es el carácter personalizado, cual deberá especificar la caída del delimitador. El siguiente es contraseña. Entonces de nuevo, en el lugar de trabajo que pudo haber abierto un cuaderno de trabajo que pide una contraseña cuando estás abriendo el cuaderno de trabajo. Y obviamente este es otro punto de falla para la automatización porque está solicitando al usuario que especifique una contraseña. Ahora en realidad puedes suministrar esta contraseña. Guardemos la contraseña es solo contraseña. En realidad puede simplemente especificar eso como una cadena en este argumento. Entonces si tu libro de trabajo sí contiene una contraseña, es una buena idea solo especificar eso en una constante, similar a cómo hemos usado las constantes para la ruta del archivo y para el nombre del archivo, que no tengas que solo hablar eso en cada vez que abres o cierras el cuaderno de trabajo, el siguiente del que quiero hablar está delimitado. Entonces si hemos especificado que es un delimitador personalizado en el argumento de formato, necesitamos especificar qué es eso. Por lo que podría ser falta, podría ser una cita doble o podría ser cualquier cosa. Es sólo el carácter que se utiliza en ese archivo el que especifica que ese es un delimitador para el siguiente campo. Y de la siguiente de la que quiero hablar es de carga corrupta. Por lo que esto es extremadamente útil. Y en el lugar de trabajo cae un comúnmente almacenado en servidores de archivos, incluso su propia carpeta Mis documentos. Y si tu lugar de trabajo tiene muchos usos y tu trato con archivos Excel de gran tamaño, esto obviamente puede causar problemas. En mi experiencia, he visto que los libros tardan de dos a cinco minutos en abrirse. Y eso se debe a un par de cosas. En primer lugar, se debe al ancho de banda de la red. Entonces, si tienes muchos usuarios en tu red, no hay suficiente ancho de banda para suministrar el archivo rápidamente. Pero el principal culpable de la carga lenta de archivos distintos del ancho de banda en la red es el formateo innecesario. He notado que a algunos usuarios les gusta rellenar el formato en toda una tabla o incluso hasta la última fila del libro. Y esto no sólo hace que el libro sea increíblemente grande, sino que hace que abrir el libro sea muy lento porque Excel necesita completar muchas tareas antes de presentar realmente una apertura del archivo. Entonces lo que puede hacer la carga corrupta por nosotros en la instancia que tenemos libro de trabajo que tarda mucho tiempo en abrirse, lo que voy a hacer es especificar que es sólo radar, pero también especificaré Excel extraer datos en el argumento de carga corrupta. Y lo que esto hace, ignorará todo formato y abriremos la caída lo más rápido posible desde la fuente de archivos, lo que significa que tan rápido como se pueda leer desde la red, se abrirá. Y va a ignorar todo el formateo y simplemente abrirlo para que rápidamente puedas saltar ahí, extraer datos y saltar. Ok, entonces solo eliminaré estos ahora. Y ahora hablemos de los argumentos que podemos enviar al comando Guardar como. Entonces el primero es el nombre de archivo, que es bastante obvio. Es sólo el nombre de archivo que especificamos con el que queremos guardar el archivo como. Y el siguiente es formato de archivo, que rápidamente hemos cubierto. Aquí hay numerosas opciones disponibles. Entonces si tienes un requisito específico para que un archivo se guarde en un formato particular, entonces solo google la enumeración de formato de archivo XML y verás una lista completa de los formatos de archivo a los que puedes exportar el archivo. Los clave aquí sin embargo, libro de Excel a la culpa, que es XLS X, también se puede utilizar XML CSV. Otro realmente común, al menos en mi experiencia, es la hoja de Excel XL, que es para compatibilidad con versiones anteriores con Excel 2003 volver a los libros de 2007. Entonces eso es solo el formato de archivo dot XLS. Y de la siguiente de la que quiero hablar es la resolución de conflictos. Entonces esto es lo que pasa si tenemos múltiples usos en el mismo archivo. Y especifica qué cambios deben priorizarse para guardarse. Por lo que el valor predeterminado es la resolución de Excel USA, que no es ideal en automatización porque pide al usuario que resuelva los conflictos de ahorro. La otra opción son los cambios de sesión local XL. Entonces lo que eso significa es que Excel priorizará los cambios de usos locales sobre cualquier cambio de usos remotos. Y el otro es los cambios de sesión de Excel. Entonces eso es lo opuesto al que acabamos de cubrir. Lo que significa que Excel priorizará los otros usos cambios sobre los nuestros propios en esta sesión local. Y así eso resume los argumentos clave que quería cubrir en esta lección. Entonces eso termina escucha nueve. En esta lección aprendiste acerca de abrir, cerrar y guardar libros de trabajo programáticamente, te mostré cómo crear una ruta de archivo completa para un archivo basado en lógica empresarial y supuestos, aprendimos a suprimir mensajes emergentes mientras se ejecuta código, y cómo abrir un libro de trabajo protegido con contraseña. Te mostré cómo cargar rápidamente archivos que normalmente tardan mucho tiempo en cargarse. Y les expliqué los argumentos opcionales clave para el comando open books dot. Gracias por ver, y nos vemos en el siguiente video. 3. 03: lección VBA 10: cuadros de diálogo de archivos: Bienvenido a la lección diez, Cuadro de diálogo Archivo. Un cuadro de diálogo Archivo es una característica incorporada de las aplicaciones de Office. En pocas palabras, es básicamente una ventana que presenta al usuario con una vista del sistema de archivos para que el usuario pueda seleccionar un archivo o directorio para el fin especificado por la aplicación que lo fríe. Un ejemplo de un cuadro de diálogo de archivo es la ventana que verá al seleccionar Archivo y abrir desde cualquier aplicación de oficina. En esta lección, te enseñaré cómo crear cuadros de diálogo Archivo. Te explicaré las diversas propiedades que somos capaces de sentarnos para personalizar nuestro cuadro de diálogo de archivos. Te mostraré cómo lidiar con la respuesta devuelta de EUA. El contenido adicional que cubriremos incluye con declaraciones, la función VBA DIR incorporada y la función VBA LAN incorporada. Vamos a patear. Los cuadros de diálogo de archivos son algo que utilizo a menudo cuando construyo aplicaciones VBA. El propósito de esto es básicamente pedir al usuario que localice un archivo o carpeta. Tan solo un par de escenarios donde puedes usar. Uno podría ser pedirle al usuario que localice un archivo del que va a estar extrayendo datos o donde el usuario quiere guardar un archivo, cómo y dónde sus usos realmente hasta su propia imaginación usando el escenario de la última lección como ejemplo, que abre y guarda una copia de un libro de trabajo externo, podría intentar localizar automáticamente el archivo ya que conocemos el directorio en el que se supone que debe estar y la convención de nomenclatura de ese nombre de archivo. Y si no tiene éxito, entonces pida al usuario que localice el archivo que falta. Entonces intentemos lograr justamente eso. Al mirar la rutina de la última lección, queremos intentar abrir el archivo utilizando la lógica que ya hemos definido. Y si eso falla, presentar al usuario un seleccionador de archivos. Hay algunas formas en las que podemos hacer esto si el archivo no existe y VBA intenta abrirlo, eso obligaría a VBA a un error en tiempo de ejecución. En esa instancia, necesitaríamos escribir un manejador de errores para que el VBA sepa qué hacer cuando se encuentre ese error específico. No obstante, estaremos cubriendo el manejo de errores en una sesión de celosía. Y además, siento que hay una mejor manera de lograr esto, lugar de tratar de abrir un archivo que puede o no existir, lo que causaría una época. Podríamos primero probar para ver si el archivo realmente existe antes de intentar incluso abrirlo. De esa manera estamos evitando que ocurra una era de tiempo de ejecución y la necesidad de atender esa era. Entonces, en resumen, lo que estamos tratando de hacer es que estamos intentando abrir el archivo automáticamente. Y si ese archivo no existe, entonces le pediremos al usuario que seleccione el archivo a abrir. Ahora hablemos de cómo determinamos si existe o no un archivo. Vba tiene una función que podemos usar para lograr esto y se llama D. Déjame subir la Ventana Inmediata. Por lo que la función DIR, vamos a probar para ver si existe un directorio. Y si existe, va a devolver el nombre del archivo como una cadena. Y si no existe, va a devolver una cadena de 0 longitud. Entonces el archivo que usamos en el primer ejemplo, acabo de copiar la ruta del archivo y sólo voy a suministrar eso como una cadena. Y sabemos que existe porque lo hemos usado en la última lección. Entonces si tocamos Enter, podemos ver que nos ha devuelto el nombre del archivo. Ahora si yo fuera sólo para cambiar un personaje aquí. Sé que este archivo no existe, y si golpeo enter, verás que nos ha proporcionado de vuelta una cadena de 0 longitud. Por lo tanto, somos capaces de utilizar la función DIR para determinar si el archivo existe o no. Porque si existe, va a devolver una cadena que es mayor que 0, o la longitud de esa cadena es mayor que 0. Y si no existe, va a devolver una cadena que tiene la longitud de 0. Por lo que basta con mover la ventana inmediata fuera del camino. Empecemos. Entonces para validar lo que devuelve la función DIR, solo voy a usar una declaración if básica. Espera un minuto. Sólo volveré a subir la ventana inmediata. Sólo lo señalaré por 1 segundo, y solo te mostraré la declaración de longitud también. Entonces si envuelvo esta función dentro de otra función que nos dice la longitud de una cadena, y esa función se llama Lin. Se cuenta 31. Entonces eso significa que dentro de esta cadena hay 31 caracteres. Ahora si cambio eso para que no exista, el archivo no existe. Nos ha dado una longitud de 0 caracteres. Entonces dentro de esa afirmación if, somos capaces de usar esta función len y envuelto dentro de la función len está la función. Y si el archivo no existe, vamos a conseguir 0. Y si el archivo sí existe, vamos a conseguir algo mayor que 0. Entonces volveré a mover eso hacia abajo del camino. Descomenta esto. Si, entonces, si la longitud de D y el camino es el, vale, entonces así es como escribimos esta declaración if. Entonces la primera función ahí es la longitud, que es ésta, todo dentro de estos corchetes. Y si le pegamos a especias aquí dentro, nos mostrará la expresión en el medio. Y la expresión en el medio es ésta. Entonces si la longitud de lo que se devuelve de D, si esa longitud es mayor a 0, entonces podemos seguir adelante y abrir el cuaderno de trabajo. Por lo que sólo copiaré esta copia. Entonces debo decir. Y voy a poner eso aquí. De lo contrario, haz algo. Entonces, ¿qué queremos hacer si el archivo no existe? Queremos solicitar al usuario que seleccione el archivo. Entonces para hacer eso, vamos a necesitar un cuadro de diálogo de archivos. Vamos a necesitar una variable para eso. Entonces es, está arriba, que es olla de oficina o está integrada en Office, debo decir. Ellos van Diálogo de archivo. Ahora bien, esto es sólo un objeto genérico que es parpadear. Por lo tanto, necesitamos establecer ese objeto. Entonces solo haré eso ahora. Ahora el cuadro de diálogo Archivo es hijo del objeto de aplicación. Y como mencioné en la última lección, aplicación es evidente de la colección de libros de trabajo y los objetos de libros de trabajo. Entonces necesito aplicación, he derramado eso incorrectamente. Diálogo de archivo de puntos. Existen algunos tipos de diálogo de archivos diferentes. Y por suerte nos dice cuáles tenemos a nuestra disposición. Por lo que queremos un recolector de archivos. Pero los otros tipos que tenemos ahí, hay un recolector de archivos, uh, carpeta pika, y diálogo abierto y un diálogo Guardar como. Pero yo quiero archivar picker. Entonces una vez que el código ha ejecutado esta línea, tiene sentado el objeto en blanco de éste en una ventana de diálogo de archivos que pertenece a la aplicación. Y en la parte superior de ese diálogo de archivos está un diálogo de archivos, file pika. Hay algunas otras propiedades que quiero sentarme. Entonces, por ejemplo, no quiero permitir que el usuario seleccione más de un archivo. No quiero que seleccionen un archivo que no sea del tipo de archivo correcto. Y también quiero ayudar al usuario empezando a buscar en una carpeta en particular. Entonces para hacer eso, necesitamos sentar más propiedades de ese objeto de diálogo de archivos. Y para hacer eso voy a usar una declaración de ancho. Por lo que básicamente una declaración con permite sentarse múltiples propiedades al mismo tiempo. Por lo que sólo voy a configurar eso. Y similar a una sentencia if, la sentencia width necesita una sentencia end. Ahora dentro de esta declaración de ancho, podemos sentar múltiples propiedades a la vez. Otra cosa también es que dentro de estos con declaraciones, no necesitamos volver a declarar de qué variable de cuál hablando. Entonces, por ejemplo, si quiero establecer un filtro, qué filtra qué tipo de archivos se puede seleccionar mediante este cuadro de diálogo Archivo. No tengo que decir primero el nombre del objeto y luego la propiedad. Simplemente puedo empezar con la propiedad o el punto a la primera propiedad que siempre modifico cuando estoy sentado un cuadro de diálogo de archivo es que limpié los filtros. Entonces siento que esta es una propiedad secundaria del objeto de diálogo de archivos, y clear es un método secundario de la propiedad filters. Y así la razón por la que hago esto es porque los filtros para estos objetos se almacenan en caché. Significa que si me siento un montón de filtros y luego escondo ese cuadro de diálogo y luego volví a mostrar los filtros de la última vez que he mostrado el cuadro de diálogo presente en el nuevo. Por lo que siempre es solo una buena práctica borrar los filtros. Y el siguiente a agregar es agregar un filtro para que podamos seleccionar un archivo CSV. Entonces de nuevo, estamos usando la propiedad filters. Pero esta vez quiero sumar uno. Entonces está el método add. Ahora nos dice lo que necesitamos abastecer. Por lo que necesitamos proporcionar una descripción como cadena y extensión una cadena y una posición. Entonces la descripción es bastante directa. Es una cadena que puedes escribir solo para describir lo que permites seleccionar. Las extensiones son las extensiones de archivo o los caracteres que aparecen después del punto. Y la posición es si tienes más de uno, qué posición de esa lista debería enlistar este ítem B? Entonces vamos a empezar con los archivos CSV, la descripción y la extensión. Voy a usar un comodín aquí. Te explicaré por qué en tan solo un segundo. Entonces lo que hace un comodín es que le dice a Windows que acepto cualquier carácter antes de este carácter. Entonces lo que va a hacer es que va a buscar la patente de cualquier personaje o de cualquier personaje, y luego punto CSV, lo que significa que va a filtrar todo lo que no es un archivo CSV. También quiero evitar que el usuario pueda seleccionar múltiples archivos, aunque teóricamente puedan seleccionar múltiples archivos en esta instancia, no quiero que lo hagan, solo quiero permitirles seleccionar un archivo. Entonces eso es. False de selección múltiple. Entonces lo estoy poniendo en falso. Y para ayudar al usuario, quiero asegurarme de que no tengan que cazar por mucho tiempo. Entonces tengo una suposición educada de que va a estar en mi carpeta de documentos. Por lo tanto, quiero que empiecen a buscar en esa carpeta. Y para hacer eso, puedo decir que el nombre de archivo inicial es igual y sólo voy a suministrar esa constante. Entonces lo que eso hará es que abrirá la ventana y va a estar en esa carpeta. Y así la última propiedad sería mostrar puntos, que presentaremos el diálogo de archivo al usuario. Entonces hay una trampa aquí. El catch es que la forma que se muestra, que es el cuadro de diálogo del archivo, es una forma modal. Entonces lo que eso significa es cuando el formulario se muestra y se presenta en la pantalla, significa que ningún código puede ejecutarse. Pero eso está bien. En realidad podemos usar eso a nuestra ventaja. Entonces lo que voy a hacer es poner esta propiedad de punto show dentro de una declaración if. Entonces lo que esto significa es cuando evalúa esta línea, en realidad va a mostrar el cuadro de diálogo del archivo al usuario, pero no fue continuar porque no puede, es modal. Por lo tanto, no se está ejecutando ningún código en segundo plano. No obstante, una vez que han seleccionado un archivo y el calor, bien, siempre y cuando pase esta línea, significa que no sólo han visto la forma, han seleccionado un hit caído OK. Y si Mostrar es igual a falso, entonces eso significa que en realidad han pulsado Cancelar y han descartado ese cuadro de diálogo de archivo. Entonces tenemos dos condiciones aquí. Tenemos si han seleccionado un archivo o quinto hit OK. Y si han cancelado fuera de ese cuadro de diálogo de archivo, si han seleccionado un fólico y seguir adelante y arpanet como hemos hecho aquí arriba. Entonces sólo voy a copiar esta línea. Probablemente más fácil simplemente rematarlo de nuevo porque voy a estar cambiándolo, pero está bien. Y voy a quitar todas las cosas dentro de los corchetes Open arguments. Ahora bien, ¿qué quiero abastecer? Yo quiero suministrar los artículos que han seleccionado. Por lo que eso es puntar artículos seleccionados. Ahora, debido a que el diálogo de fuentes potencialmente puede permitir múltiples selecciones, este objeto aquí esta propiedad es una lista, por lo tanto, necesito suministrar el índice. Y debido a que en los que se les permite seleccionar uno, el índice sólo va a ser uno. Pero si hubiera, por ejemplo, múltiplo, tendrías que entonces recorrer recorrerlos y realizar una acción sobre ellos uno por uno. Entonces eso es bueno. Si el show es cierto, eso significa que lo han visto, han golpeado bien. Por lo tanto, quiero que abras el archivo si está seleccionado. De lo contrario, si han golpeado escape o cancelado, quiero presentar un cuadro de mensaje. De verdad no pasarla bien con su teclado Mac. Y también quiero salir del sub. Por lo que Exit Sub es un poco diferente a N sub. N sub siendo el punto final de terminación de toda la rutina. Y Exit Sub es solo un punto donde se puede llegar a eso, diremos, vale, ya he tenido suficiente. Voy a salir del sub con gracia. Entonces eso significa que si hemos superado esta sentencia if, significa que o el archivo existe y lo hemos abierto, o bien el archivo ha sido seleccionado y también lo hemos abierto. No vamos a poder llegar a este punto por ningún otro medio porque hemos salido del sub antes de que pueda llegar a esa línea de código. Entonces eso significa que podemos realizar las mismas acciones que estábamos haciendo antes, lo cual fue guardar error en versión. Y cierra el libro de trabajo y luego vuelve a encender las alertas de visualización. De acuerdo, entonces ya casi estamos listos para probar esto. Pero lo que primero voy a hacer, es que voy a saltar a mi carpeta Documentos y sólo voy a cambiar el nombre del archivo para que definitivamente no exista. Entonces solo voy a sumar uno al inicio. Yo también puedo hacerlo también sólo para este también. De todos modos. Entonces vamos a probar este código. Voy a pasarlo usando F8. Entonces he desactivado las alertas y el archivo no existe porque cambié el nombre del archivo. Entonces ahora va a saltar a este lado de la declaración if, la condición else, va a sentar ese objeto. Ahora diremos que el objeto ha sido establecido. Se trata de un cuadro de diálogo Archivo y es un diálogo de archivos, un recolector de archivos. Por lo que la siguiente línea está entrando dentro de la declaración width. Entonces vamos a despejar los filtros. Todavía no hemos visto la ventana porque no hemos tocado el show de puntos. Y vamos a añadir el filtro de archivos CSV. Vamos a apagar el multiselección. Vamos a establecer la ruta inicial del archivo a la carpeta para que aparezca dentro de mi carpeta OneDrive, Mis documentos. Y ahora después de que golpee F8, nos va a mostrar el cuadro de diálogo de archivos o esperemos. De acuerdo, ahí vamos. Entonces y está dentro de la carpeta Mis documentos. Ellos entrarían. Ese es el archivo que acabo de renombrar. Por lo que sólo voy a seleccionarlos. Hit OK. Por lo que ahora tengo un lado otomano, el índice de ítems seleccionados de uno. Y voy a sentar este objeto abierto de WB usando el comando workbooks dot open, que va a abrir el archivo que hemos seleccionado en ese cuadro de diálogo de archivos. Entonces si golpea F8 una vez más. Oh, bien, entonces el código se ha saltado hasta el final, así que ya no estamos pisando por él. Pero puedo confirmar que se ha completado porque tenemos el archivo que acabamos de guardarlo como. Entonces tuvimos el porque lo renombramos. Recuerda, ponemos uno delante de él, de vuelta, en el Explorador de archivos, pero acabamos de crear hay bueno en la hora actual aquí. Por lo que se ha completado, pero es sólo una especie de fuga de nosotros. El código se ha escapado de nosotros. Ahora esto es algo de lo que necesitas tener cuidado cuando estás depurando y revisando tu código. Eso a veces el código puede huir de ti y simplemente puede comenzar a ejecutarse a toda velocidad. Lo cual obviamente es un ideal, especialmente cuando estás depurando, estás tratando de asegurarte de que las cosas no se rompan antes de ejecutarlo a ritmo. Y la razón por la que esto sucede es algo desconocida, pero sí conocemos las ciertas condiciones que lo hacen ocurrir. Y esas condiciones cuando ocurre una llamada a procedimiento remoto, que es abrir ese cuaderno de trabajo, y regresa de nuevo a este módulo de código para continuar con el código. Entonces en esta instancia, lo que ha pasado es que está abierto ese cuaderno, cual se envía una llamada de trámite para abrir ese cuaderno. Y luego como está terminado, ese comando, ha vuelto directamente a este código y se acaba de ejecutar a todo ritmo. Ahora lo que puedes hacer para moverte eso es echar basura a tu código con puntos de interrupción. Y la razón por la que haces eso es que si se apaga y hace su llamada de procedimiento remoto y vuelve y lo ejecuta a todo ritmo. Se va a parar en el próximo punto de interrupción. Entonces intentemos eso otra vez. Voy a golpear a F5 y de inmediato deberíamos ver aparecer el diálogo del archivo. Pero luego una vez que seleccionemos un archivo, se detendrá en este endif o este endif. Y yo pegaría OK. Boom, por lo que se detuvo en el primer punto de interrupción después de la línea abierta del libro de trabajo. Y sólo puedo seguir adelante. Ok, entonces eso resume este ejemplo práctico. Entonces en resumen, lo que hemos hecho es que primero estamos apagados las alertas. Después hemos probado para ver si el archivo existe y lo estamos haciendo usando la función. Y eso nos va a devolver un nombre de archivo si el archivo sí existe en ese directorio, y si no lo hace, no nos va a devolver nada. Entonces, por tanto, vamos a probar la longitud de la cuerda. Si la función regresa y si el archivo existe, solo vamos a saltar directamente y abrir ese archivo. Pero si el archivo no existe, si no podemos ubicar automáticamente, entonces vamos a preguntar al usuario a través de un cuadro de diálogo Archivo. Después nos sentamos múltiples propiedades a la vez. Y mientras estamos dentro de esta declaración de ancho, también tuvimos una declaración if que aprovechó que el cuadro del dólar de caída lo muestra modalmente, lo básicamente nos permite hacer una pausa en esta línea y White para el para seleccionar un archivo o pulsar cancelar y luego ejecutar el código en consecuencia. Por lo que o bien abrimos la falla que han seleccionado o simplemente cancelamos y salimos del sub. Seguimos entonces como normal, que es guardar la versión Erin del archivo y cerrar el archivo sin guardar. Eso termina esta lección. En resumen, hoy aprendimos a crear cuadros de diálogo Archivo. Cómo personalizar nuestro cuadro de diálogo. Por ejemplo, crear una carpeta o un selector de archivos, permitiendo al usuario seleccionar varios archivos, conseguir que la ventana comience en una carpeta en particular y filtrar archivos por extensión de archivo. Aprendimos a manejar la respuesta devuelta desde el extremo USA te presenté con declaraciones. Adicionalmente, las funciones VBA integradas que cubrimos fueron la función DIR y la función LEN. Espero que hayas disfrutado de este video y te veré en el siguiente. 4. 04: lección de VBA 11: ejecuta en eventos: Bienvenido a la Lección 11, correr en eventos. En VBA. Podemos captar algunos eventos que se desencadenan por el código de usuario u otras razones ambientales. Tan sólo un par de ejemplos de algunos eventos. El clic de un botón cuando se agrega una hoja a un libro de trabajo o cuando se realiza un cambio en una hoja de cálculo. Atrapar eventos puede ser muy útil para asegurarnos de que nuestras aplicaciones VBA funcionen de una manera que pretendemos que lo hagan. En esta lección, vamos a responder a la pregunta, ¿qué son los eventos? Hablaremos de los diversos tipos de eventos y alcances de eventos. Y vamos a estar haciendo un par de ejemplos prácticos de usar eventos en nuestro código. También estaremos hablando de la función VBA incorporada llamada izquierda. Hablemos con un poco más de detalle sobre cuáles son los eventos en realidad. Eventos o simplemente una acción o un desencadenante que ha ocurrido. Un evento puede ser iniciado por un usuario programáticamente o por fecha u hora. Existen numerosos eventos o desencadenantes que podemos utilizar en VBA que son capaces de atrapar y luego ejecutar de inmediato código tan pronto como se detecte el evento. En el interés de que nuestras aplicaciones VBA sean lo más robustas posible. En ocasiones necesitamos captar eventos para que podamos garantizar una experiencia de usuario consistente. Mi filosofía en hacer aplicaciones de VBA coherentes funcionales es controlar un bloqueo tanto como sea posible, y al mismo tiempo, captar las acciones del usuario y manejarlas de una manera que especifique lo que esto hace es eliminar tanta varianza ambiental como sea posible, lo que puede causar problemas inesperados con las aplicaciones que hemos construido. Un ejemplo sencillo de esto puede ser si un usuario inexperto abre mi libro de trabajo o aplicación de VBA y no habilita las macros. Podrán percibir que se rompa la aplicación que he construido, y eso es porque no está haciendo lo que están esperando que haga, lo creas o no, este es un tema razonablemente común que he vivido en el lugar de trabajo. Lo que podemos hacer para evitar esto es configurar un libro de trabajo en un estado bloqueado predeterminado y aplicar lógica en el evento abierto del libro de trabajo, lo que implica que la macro ha sido habilitada y luego ejecutar código que inicializa el aplicación y lo desbloquea. Te mostraré exactamente cómo hacer esto más adelante en la lección. Hablemos del alcance del evento, similar a la jerarquía del modelo de objetos del libro como se discute en detalle en mi curso de principiante, hay múltiples niveles o tipos de eventos. Esos son eventos de hoja de trabajo, eventos de libro de trabajo, eventos de aplicación, uso del formulario eventos, chat, eventos, en eventos de tiempo y en eventos clave. Básicamente, estos son los eventos que ocurren en esos niveles discretos de la aplicación. Por ejemplo, cambiar una celda sería un evento de hoja de cálculo. Agregar una nueva hoja de trabajo a un libro de trabajo sería un evento de libro de trabajo en ventana, minimizar, maximizar o cambiar el tamaño. Eso sería un evento de solicitud. Al hacer clic de un botón en un formulario de usuario que hemos creado sería un evento de formulario de usuario sobre cambio de una serie de gráficos o redimensionamiento de gráficos sería un evento de gráfico. Cuando ocurre una hora específica sería un evento a tiempo. Y cuando se presionan teclas específicas en el teclado sería un OnKeyEvent. Por favor, tenga en cuenta que esta lista no es una lista exhaustiva de eventos. Ahora pongámonos a usar eventos en nuestro código. En este ejemplo práctico, quiero asegurarme de que el usuario active macros. Y para ello, lo que quiero hacer es cambiar el estado predeterminado del libro de trabajo. A lo que me refiero con eso es que quiero ocultar todas las hojas del libro por una. Y el que haya descubierto contendrá un mensaje solicitando al usuario que active las macros y vuelva a abrir el libro de trabajo. Cuando luego activen macros y abran el cuaderno, captaré el evento de la apertura del cuaderno, lo que significa que definitivamente han activado macros y luego muestran esas hojas ocultas y ocultaré el mensaje pidiéndoles que activen macros. Porque queremos estar captando eventos que pertenecen al cuaderno de trabajo. Voy a entrar en el, este objeto de libro. Y quiero llamar su atención sobre estos verdaderos cuadros desplegables en la parte superior del IDE. Entonces el de la izquierda nos muestra el objeto del que estamos hablando en esta instancia, queremos hablar de un cuaderno de trabajo, que es el cuaderno de trabajo. Y el otro lado nos puede mostrar todos los eventos que fueron capaces de atrapar en este objeto cuaderno de trabajo. Como puedes ver, hay bastantes. Entonces lo que eso se hace, no estoy seguro si esto es visible en la pantalla, pero lo que haré es solo copiarlo y pegarlo. Lo que esto ha hecho ha creado automáticamente este subbosque. Y es un sub privado, privado, lo que significa que pertenece a ese objeto de libro de trabajo. Y no es visible desde todas las demás hojas o módulos de código a menos que nos referimos explícitamente al objeto de este libro de trabajo primero. Por lo que este sub se va a ejecutar automáticamente cuando se abra el libro de trabajo. No hay nada más que tengamos que hacer para asegurar que este sub se ejecute en libro abierto. Aparte de, por supuesto, asegurar que las macros estén habilitadas en el propio libro de trabajo. Entonces en este retener, lo que quiero hacer es que quiero recorrer recorriendo las hojas de trabajo y quiero ocultar una hoja de trabajo en particular. Entonces voy a empezar por agregar una nueva hoja, y voy a poner un mensaje en esa hoja que dice, por favor active macros. Entonces aquí está nuestro cuaderno de trabajo. Voy a añadir una nueva hoja, y voy a llamar a ésta activa hoja. Y yo voy a y vamos a sentar este fondo a blanco. Entonces no dices esas rejillas. Y también voy a esconder todo debajo de ella. Y de ese lado, voy a asegurarme de que esa celda sea lo suficientemente grande. Y voy a hacer eso rojo. Y sólo vamos a hacer que sea audaz sólo para que se destaque en un podría realmente aumentar el tamaño. Y entonces sólo sí, genial. Entonces la intención es que cuando abrieron el cuaderno de trabajo y no hayan activado macros o van a ver, es esta hoja, la hoja de activación, todas las demás estarán escondidas y les dirá claramente lo que necesitan hacer para que esta macro funcione. Entonces solo seguiré adelante y ocultaré rápidamente las otras hojas de trabajo. Entonces tenemos este activado ahora, así que eso es lo que estarán viendo cuando abran el cuaderno de trabajo si no habilitan las macros. Por lo que volveremos a saltar al IDE. Y vamos a trabajar en este cuaderno de trabajo, abrir retener. Pensando en los objetos que vamos a necesitar. Vamos a necesitar un objeto de libro de trabajo, que es el libro de trabajo que estamos viendo actualmente. También vamos a necesitar un objeto de hoja de trabajo. Y lo que quiero estar haciendo es querer recorrer cada una de las hojas del cuaderno y quiero mostrar u ocultar el cuaderno dependiendo del nombre. Entonces sé que éste va a ser visible y el resto se va a esconder. Por lo tanto, solo puedo mirar esta propiedad de nombre y puedo determinar si quiero mostrar u ocultar ese cuaderno de trabajo. Entonces lo hicimos en el inicio por supuesto, recorriendo cada una de las hojas de trabajo. Por lo que voy a hacer eso rápidamente. Por lo que hemos pedido bucle. Entonces eso va a recorrer cada hoja de trabajo en la colección de sombras del libro de trabajo. Pero antes de continuar, quiero explicar algo ya que vamos a estar en bicicleta a través de estas hojas de trabajo arbitrariamente. Si sólo hay una hoja visible, la cual tenemos. Y la primera forma que nos encontramos en este bucle es aquella que queremos ocultar, que se romperá. No podemos ocultar todas las hojas de trabajo en el libro que necesita ser al menos una forma visible. Entonces lo que voy a hacer es que voy a hacer esto en dos bucles separados. Primero uno estando seguro de los que queremos mostrar, y luego el segundo es esconder los que queremos ocultar. Entonces voy a estar interrogando el nombre de la hoja de trabajo y es activa hoja. Ahora porque este es el que queremos que se muestre queremos el negado de esto. Sólo nos interesan las hojas de trabajo que no tienen este nombre. Por lo tanto, sólo voy a añadir 11 cosa, que no lo es. Por lo que sólo va a entrar esta declaración if. Si el nombre no es hoja activa, entonces y vamos a nombrar argumento para eso y queremos hacerla visible XL. Y si desaparece en ti solo golpea el espacio de control y lo trae de nuevo arriba punto x0, xo factible. Enfriar. Ahora el siguiente bucle, se va a copiar y pegar. Me voy a deshacer de eso y no, y voy a cambiar este. Hazlo oculto. Entonces voy a ahorrar ahora y eso va a preservar los estados visibles de cada una de las hojas y también se hizo eco de otra cosa que podría desencadenar fallas o errores es el estado protegido de la hoja o del cuaderno. Por lo que podría haber moldeado protección que solo permite al usuario editar ciertas celdas. En esta instancia, lo que querrás hacer es desrecoger la sábana antes de calentarla o mostrarla y lo haces así. Y aquí es donde también proporcionarías contraseña si has incluido una, es una buena idea si tienes una contraseña para almacenarla como una constante, asegúrate de que después de configurar la propiedad visible para protegerla de nuevo, eso es si tienes un forma que está protegida. Pero en este caso no lo hacemos. Sólo voy a borrar eso. Lo mismo otra vez para el cuaderno de trabajo. Si tienes un cuaderno protegido y está y actualmente está protegido, puedes hacerlo fuera del folato justo antes de que entre al bucle completo. Como este cuaderno de trabajo no está protegido, sólo voy a eliminar eso. Ahora podemos ejecutar este código para probar lo que sucede cuando un usuario abre el libro sin la necesidad de cerrarlo realmente y volver a abrirlo. Entonces solo haré eso ahora. Pasaremos si yo oh, así que vamos a correr era. Variable de objeto o con variable de bloque no establecida. Esto es bueno. Me alegra que tengamos un error de tiempo de ejecución, así que solo lo depuraremos. Está en esta línea aquí. Entonces para cada hoja de trabajo, así no hay nada. ¿ Sabes lo que no hicimos? No hemos establecido el objeto que es libro de trabajo. Por lo que voy a cambiar rápidamente eso. Porque este cuaderno de trabajo, sólo agregar esta línea no hace nada porque el código ya está aprobado esta ley. Y entonces lo que voy a hacer es simplemente arrastrarlo de nuevo hasta aquí para que establezca ese objeto. Y digamos ahora, sí, vale, eso funciona al momento de interrogar ahora el nombre de la hoja de trabajo y sólo queremos introducir esta declaración if si el nombre no es forma activa y la hoja de trabajo actual con mirar en este bucle es en realidad activar la forma. Por lo que se salta a Grad yendo. Y la hoja actual es custdata. Entonces, sin embargo, queremos que esa sea visible. padre uno es la salida, que está ahí. Sí, genial. Está bien, vamos. Sólo esperaré hasta que lleguemos al siguiente bucle. De acuerdo, entonces ahora estamos en el segundo bucle y ese es el que va a ocultar las sábanas que queremos escondidas. Y el actual es activar hoja. Y está escondido. Ese 1 cuarto dado aún no lo ha hecho, y ya no se ha escondido. Entonces ahora si entonces minimizamos esto, solo me aseguro de que este código esté terminado de ejecutarse. Minimizaré esto y traeré a Excel. Entonces veo que el mensaje de macro activar ha desaparecido. Toda esa hoja ha desaparecido, y ha mostrado todas las demás hojas que queremos que se muestren. ¿ Qué pasa si queremos múltiples hojas ocultas? Podemos agregar criterios adicionales o si es a esta declaración if que está dentro del bucle que se pretende ocultar las formas. Pero eso puede quedar algo fuera de control, particularmente si tienes muchas hojas de trabajo en el libro, hay una manera más fácil. De vuelta en Excel. Simplemente agregaré una nueva hoja de trabajo y te mostraré cómo. Por lo que he añadido una nueva forma que ahora se llama SHA-2. Lo que hago es usar una convención de nomenclatura en el nombre de la hoja. Entonces me aseguro de que los primeros siete caracteres estén ocultos un subrayado, y podría haber numerosas razones por las que quieres hojas ocultas, podría ser que tengas un conjunto de datos que quieras ocultar al usuario. O podría ser que tengas un montón de configuraciones en una forma de la que estás leyendo, desde el código. Es básicamente cualquier cosa que no quieras la edición. Entonces sigamos adelante y sumamos esto a nuestra condición si. Déjame mostrarte primero en la ventana inmediata cómo voy a usar esta convención de nomenclatura. Entonces vamos a utilizar una función VBA incorporada que se llama izquierda. Y lo que hace lift es que nos devuelve un cierto número de caracteres del lado izquierdo de la cuerda. Y especificamos cuántos caracteres queremos del lado izquierdo de la cadena. Entonces solo escribiré a la izquierda y luego verás los argumentos que hicimos. Entonces tenemos cuerda y una cuerda, solo lo escribiré. Entonces esa es la forma que acabamos de agregar al cuaderno de trabajo. Y voy a golpear coma, y es el primer personaje siete. Por lo que quiero que devuelva los primeros siete caracteres de ese nombre de hoja. Y como pueden ver, ha devuelto los primeros siete caracteres que se esconden en la escuela, porque ahora hemos devuelto los primeros siete caracteres del nombre de la hoja de trabajo. Podemos usar esa lógica en nuestra declaración if. Entonces solo saltaré de nuevo al si block LCF porque tenemos la primera condición si ahí y no es otra, Es otra. Si tenemos otro padecimiento queremos probar. Izquierda como acabamos de aprender, de la cadena, que es nombre de hoja de trabajo. Y son los primeros siete personajes igual a subrayado oculto. Entonces. Y yo también quiero hacer lo mismo. Otra forma en que podemos lograr eso también es agregar una condición todo en nuestra declaración if. Por lo que solo te mostraré rápido o y luego solo podremos copiar esto. Por lo que en realidad podemos agregar dos condiciones a esa declaración if. Pero sólo borraré esa. Por lo que ahora podemos ejecutar esto y solo probar para ver si esta hoja de trabajo desaparece. ¿ De acuerdo? Y en realidad hemos probado aquí. Entonces si seleccionamos la hoja, podemos decir que la propiedad de la hoja ya está escondida, con forma oculta, pero sólo voy a sacar estos fuera del camino. Sí, la hoja que creé que estaba oculta, datos subrayados, ha desaparecido del libro de trabajo. Cuando construyes en probar este tipo de funcionalidad que se ejecuta en abierto y UNCLOS, es una buena idea construirte una rutina que restablezca el estado para que puedas probarlo de nuevo rápidamente para que no tengas que pasar manualmente por cada las hojas de trabajo y seleccione la propiedad visible. Entonces sólo voy a hacer eso rápidamente ahora. Y luego te mostraré qué más puedes usar esa caída. Y lo voy a hacer en un nuevo módulo de código, Insertar módulo, módulo tres. Ok. Entonces lo estoy enfriando reiniciando cuaderno de trabajo el cual puedo carbonizar en cualquier momento. Y eso lo va a devolver al estado en el que debe estar el cuaderno cuando esté abierto. Voy a nombrar mis variables. Otra vez. Voy a necesitar dos para bucles. Y el primer bucle será para los auditores que queremos que se muestren. Y el segundo bucle serán cuatro elementos que queremos ocultos. Entonces la que queremos mostrar es la que está activando Xite porque esa es la única hoja que queremos que se active cuando se abra el cuaderno de trabajo. Y también quiero agregar el LCA para lo oculto debajo de la escuela. De acuerdo, así que ahora podemos usar eso para restablecer nuestro libro al estado en el que debería estar cuando esté abierto. Sólo voy a probar eso ahora con F5. Oh bien, tenemos que hablar de desajuste. Y me alegro de que estemos recibiendo estos errores de tiempo de ejecución porque realmente nos ayuda a aprender. Entonces si hit debug, nos dice qué pasa. Entonces si no hoja de cálculo 0.9c y el nombre de punto de la hoja de trabajo actual es hoja activa. Es una cuerda. Vale, puedes ver aquí que tengo un menos en lugar de un igual. Entonces eso es solo un ejemplo de depurar tu código y probar tu código para asegurarte de que esté funcionando y robusto. Por lo que golpeó de nuevo a F5. Y volveré aquí a mi libro. Y como se puede ver, sólo esta hoja es visible. Entonces otra forma en que quiero usar esta rutina es cuando se cierra el cuaderno de trabajo. Entonces digamos por ejemplo, un usuario lo usa y tienen las macros habilitadas, y luego todas las hojas se descubren, pero guardan el libro de trabajo y luego usan un verdadero viene. Y no tienen las macros habilitadas porque ese usuario ya guardó el libro y se desocultan las hojas. Quiero asegurarme de que cada vez que se cierre el libro de trabajo, esas hojas estén ocultas y el mensaje que les dice que activen las macros sea visible. Entonces solo voy a copiar este sub nombre y voy a saltar de nuevo al módulo de código de este libro de trabajo. Y solo miraré a través de estos eventos para encontrar uno que atrape al usuario cerrando el cuaderno de trabajo. Entonces soy capaz de establecer la propiedad visible de forma a lo que quiero que sea. Iba antes de cerrar. Y se crea una rutina que captará evento de cierre del libro de trabajo y nos permitirá ejecutar código antes de que el libro de trabajo se cierre realmente. Entonces lo que voy a hacer es que ahora voy a llamar a una macro ya construida. Por lo que en resumen, esta rutina aquí va a captar el evento del usuario cerrando el cuaderno de trabajo. Y antes de que el libro de trabajo se cierre realmente, va a llamar a la rutina de reinicio del libro de trabajo. Y lo otro que quiero hacer es también guardar el cuaderno de trabajo, que guardará los estados visibles de cada una de las hojas de trabajo. Por lo que voy a hacer eso rápidamente. De acuerdo, ahí vamos. Ok chicos, eso es todo por ahora. En esta lección, aprendimos sobre qué eventos y rascamos la superficie de cómo podemos usarlos. Hablamos sobre el alcance del evento, IA, a qué nivel de la aplicación, los eventos que desencadenaron o capturaron. Y completamos un par de ejemplos prácticos de atrapar en libro abierto y Workbook cerrar eventos y ejecutar código tan pronto como se detecta el evento. También aprendimos sobre la función VBA incorporada llamada lift, que devuelve el número especificado de caracteres de la izquierda de la cadena. Algunas otras cosas que surgieron en esta lección fueron probar tu código. Nos topamos con un par de errores de tiempo de ejecución. Eso fue algo bueno. Es mejor que averigüemos estos errores que tus usuarios. También tocamos el control de la experiencia del usuario, que fue enteramente de lo que se trataba los ejemplos prácticos. Y por último, aprendimos sobre llamar a una macro desde dentro de otra macro. Mi nombre es Andrew, gracias por verlo, y los veré en el siguiente video. 5. 05: lección de VBA 12: manejar con datos: Bienvenido de nuevo. Esto es menos de 12 tratando con datos. Me di cuenta de que tratar con datos es un título razonablemente vago y amplio para este tema porque hay innumerables formas de manejar datos en VBA. Por lo que este título será tema recurrente sobre el resto de mis cursos tanto para contenido intermedio como avanzado. En esta lección, aprenderemos sobre la importación de datos a nuestro libro de trabajo de diversas fuentes. Aprenderemos sobre conectarnos a bases de datos externas y ejecutar algunas consultas SQL básicas para buscar datos y devolverlos a Excel. Vamos a estar haciendo esta lección en dos partes. En la primera parte estaremos importando datos del archivo CSV que hemos abierto en la lección anterior. Y la segunda parte, nos conectaremos a una base de datos y extraeremos todos los datos de una tabla dentro de esa base de datos. Y en ambos ejemplos, estaremos rellenando una hoja dentro de este libro de trabajo con los datos extraídos del archivo o de la base de datos. Entonces en este primer ejemplo, estaremos construyendo algo más de funcionalidad en esta subrutina que hemos estado construyendo durante el último par de lecciones. Y así como una recapitulación, lo que hace esta rutina es que primero busca un archivo para ver si existe y lo abre si lo hace, lo contrario, pide al usuario que localice ese archivo. Entonces el siguiente paso es que queremos extraer los datos de la hoja de trabajo que hemos abierto, poblar eso en una hoja dentro de este libro de trabajo y luego continuar de la misma manera. Por lo que diremos su propia copia del cuaderno de trabajo y lo cerraremos. Por lo que comenzaremos a codificar por aquí. Este es el punto donde se abrirá el libro de trabajo debido a que la macro lo abrirá automáticamente. Y si no puede encontrar ese archivo, le pedirá al usuario que localice ese archivo. Entonces otra vez, si llegamos a este pod aquí, eso significa que tenemos el cuaderno abierto. Y no sólo está abierto, está configurado para este objeto abierto del WB. Lo primero que voy a hacer es establecer el objeto de libro actual. Entonces ese es el cuaderno de trabajo en realidad está ejecutando el código. Y ahora cambiaremos hablando de este cuaderno de trabajo actual. Pondré una hoja de trabajo y en esta instancia, lo que vamos a estar haciendo es usar la hoja un objeto que está aquí arriba. Y ahí es donde vamos a estar depositando los datos. Ahora voy a establecer el objeto de hoja de cálculo del libro que hemos abierto, que es el archivo CSV. Ahora bien, CSV es un documento muy básico. Es sólo un documento de texto. Un CSV también puede contener una sola hoja. Por lo tanto, no necesito especificar un nombre aquí. Simplemente puedo suministrar un índice que es uno, porque sólo va a haber una hoja en un documento CSV. Una vez que el código llegue a este punto aquí tendremos ambos cuadernos abiertos. También tendremos ambos objetos de hoja de cálculo establecidos. Ahora podemos seguir adelante y empezar a sacar los datos la hoja de trabajo del libro que acabamos de abrir. Encuentro que la forma más rápida de hacer esto es con el uso de rangos. Y eso se debe a que simplemente puedo usar la propiedad de valor de rango y eso sostendrá toda la información que está en ese rango. Y entonces puedo asignar el valor de un rango a otro rango. Entonces para hacer eso, voy a necesitar un par de objetos de alcance. Uno especificando un rango del libro de trabajo que hemos abierto, y otro especificando un rango del libro actual. Primero fijemos el rango desde el cuaderno que acabamos de abrir, que está abierto R y G. Ahí hay un pequeño truco inteligente que podemos emplear aquí para que Excel nos diga cuál es el rango usado de esa hoja de trabajo. Ia, Excel nos dirá todas las columnas y filas que contienen datos. Es importante recordar que esto sólo es útil cuando estamos hablando de una mesa. Por lo que una hoja que solo contiene una tabla para usar la propiedad de rango con identificar si hay más de una tabla en una hoja y solo incluirá ambas por defecto. Entonces es tan simple como eso usamos el objeto hoja de cálculo y estamos especificando el rango usado. Ahora puedo sentar el otro objeto de rango basado en el tamaño de este objeto de rango. Debido a que estamos cambiando valores de un rango a otro, necesitamos que esos rangos sean del mismo tamaño. Entonces déjame mostrarte cómo hacer eso. Entonces lo que estamos haciendo aquí es que estamos sentando un nuevo objeto de rango, que está en el libro actual de la hoja de trabajo actual, que es la hoja uno. Y con el ajuste de ese rango para que sea del mismo tamaño que el rango objetos abiertos. Y cómo estamos haciendo eso es usar la propiedad address del objeto abierto rango. El inmueble de dirección nos dirá la celda superior izquierda y la celda inferior derecha de la tabla. Entonces ahora que tenemos ambos de nuestro conjunto de objetos de rango, simplemente podemos establecer el valor de uno al valor del otro. Y eso es todo. El motivo por el que prefiero este método es que es extremadamente eficiente. No tuvimos que dedicar tiempo manualmente a averiguar qué tan grandes son los rangos, porque estamos usando unas funciones de Excel integradas para hacer eso. Tampoco estamos usando la interfaz de usuario en absoluto, lo que significa que no estamos seleccionando hojas ni seleccionando libros de trabajo ni seleccionando rangos. No estamos usando copiar y pegar qué copia datos en el portapapeles simplemente usando las propiedades y los métodos que están a nuestra disposición dentro de estos objetos. Entonces intentemos ejecutar esto. Simplemente voy a F5 a través del primer pop usando la conversión de divisas CSV. Está bien. Ahora estamos sentados fuera objeto de libro actual y estamos configurando el objeto de hoja de cálculo actual. Y yo estaba sentado un segundo objeto de hoja de trabajo que es del libro que acabamos de abrir. Cuando ahora se utiliza la propiedad de rango usada de ese objeto de hoja de cálculo para sentarse las dimensiones de rango. Ahora, rápidamente sólo vamos a abrir la ventana inmediata después de que hayamos establecido ese objeto. Y voy a ver cuál es la dirección de esta enorme gama. Por lo que voy a devolver la dirección. Ahora se devuelve I1 para ver 805. Entonces si solo traigo nuestra conversión de divisas, csv, Podemos decir que la esquina superior izquierda es I1. Y deberíamos decir que la esquina inferior derecha es C 805, que tenemos 805. Entonces esa es una forma realmente rápida y fácil de conseguir que Excel te diga cuántas filas y columnas están en uso en esta hoja de trabajo. Entonces solo estoy saltando de nuevo aquí, bajando la ventana de minutos. Entonces ahora estoy sentado arreglarme en una hoja de trabajo que está en el libro actual para ser exactamente del mismo tamaño que el rango que acabamos de tomar del libro que hemos abierto. Ahora estoy tomando el valor del rango en el cuaderno que acabamos de abrir. Y estoy configurando eso como el valor del rango en el libro actual. Y déjenme mostrarles rápidamente un cuaderno de trabajo actual que tenemos en la Hoja uno. Sólo voy a sacar esto. En la Hoja uno. Tenemos I1 para ver 805. Y eso fue instantáneo, que es objetivamente más rápido que usar copiar y pegar. Minimicemos eso. Ahora continúa como normal. Simplemente vamos a guardar y cerrar y terminar la rutina. Pasemos ahora al siguiente ejemplo. En este ejemplo nos estaremos conectando a una base de datos de Microsoft Access y estaremos sacando todos los datos de una tabla y rellenando eso en una nueva hoja de trabajo de este libro. Antes de continuar, solo quiero mostrarles el exceso de base de datos. Entonces sólo voy a traer eso aquí. Si estás siguiendo junto con estos videos, la base de datos y el archivo CSV estarán disponibles para su descarga en la sección de proyectos de este curso. Por lo que sólo abriremos esta base de datos. Como pueden ver, aquí tenemos dos mesas. Tenemos la tabla de conversión de divisas y tenemos un título de prueba. Pero en este momento todo lo que nos preocupa es esta tabla de aquí, TBL subrayan la conversión de divisas. Y si abro esta tabla, verás que contiene la misma información que está en el archivo CSV. De acuerdo, así que cerraré esto ahora. Y empecemos. Voy a crear algo de espacio aquí abajo. Entonces solo voy a empezar definiendo nuestra subrutina. Sólo lo estoy llamando conectar a dos dB. Pensemos en lo que vamos a necesitar aquí. Entonces definitivamente vamos a necesitar libro de Outlook y un objeto de hoja de cálculo porque estaremos rellenando datos de la base de datos en este libro de trabajo actual en una hoja de cálculo. Yo también podría seguir adelante y sentar ese objeto de libro de trabajo. Entonces para poder conectarnos a una base de datos y extraer datos de ella, vamos a necesitar dos cosas. Vamos a necesitar un conjunto de discos y vamos a necesitar una conexión. Piensa en un conjunto de registros como una hoja de trabajo. Es esencialmente una tabla de los registros que regresamos de la base de datos. Y la conexión es el vínculo entre Visual Basic o Excel y la propia base de datos. Como siempre con VBA, hay numerosas formas en que podemos conectarnos a una base de datos. En este ejemplo, voy a usar IDEO DB u objetos x-dot activos. Y esto se debe a que podemos usar este método para múltiples tipos de bases de datos diferentes. Entonces para poder usar un objeto x-dot activo, vamos a necesitar realmente agregar esa referencia a nuestro libro de trabajo. Y para ello, vamos a seleccionar herramientas y vamos a seleccionar referencias. Y sólo voy a traer esto aquí arriba. Y vamos a necesitar buscar la biblioteca de objetos de punto Active X de Microsoft. Así que me desplazaré hasta aquí hasta que lleguemos a Microsoft. ¿ Y quieres seleccionar la más actualizada de tu máquina? En mi máquina que es 6.1 y golpeó bien, una vez que hemos agregado esta biblioteca de referencia, ahora somos capaces de sentar variables de esos tipos. Por lo que comenzaremos con un objeto de conjunto de registros. Se lo va a llamar mi RS. A continuación declararé el objeto de conexión. Ahora que he declarado estos objetos, los voy a sentar como nuevas versiones genéricas en blanco de estos objetos. Por lo que el siguiente paso será establecer una conexión entre Excel y la base de datos de Microsoft Access phi, este objeto de conexión DB. Y para poder hacer eso, vamos a necesitar configurar una cadena de conexión. Entonces voy a necesitar una variable más. Simplemente sumaré eso aquí arriba. Y ahora voy a crear una cadena de conexión. El string de conexión requiere una sintaxis específica, pero la sintaxis diferirá dependiendo del tipo de base de datos a la que se esté conectando. Hay algunos grandes recursos en línea que pueden ayudarte a construir una cadena de conexión para la base de datos a la que estás intentando conectarte en cadena de conexión. En este ejemplo, necesitamos proporcionar un par de cosas. El primero es el proveedor y el segundo es la fuente de datos. El proveedor simplemente le dice a VBA ¿qué mecanismo estamos usando para conectarnos a esta base de datos? Y el proveedor que vamos a estar usando en este ejemplo es un mecanismo predeterminado de Microsoft ice OLA DB y su versión 12. Y vamos a separar los parámetros de la aplicación con punto y coma. Y para crear la fuente de datos, solo voy a reutilizar la constante que usamos en el ejemplo anterior, que es el enlace a mi carpeta Documentos. Y esta última parte es el nombre del archivo de la base de datos. Entonces sólo agarraré eso desde aquí. Entonces con estos dos combinados, es la ruta del archivo de la carpeta Mis documentos y el nombre del archivo de la base de datos. Entonces esa es nuestra fuente de datos. Ahora que tenemos una cadena de conexión construida, podemos conectarnos a una base de datos. Sólo nota una cosa, tengo un errata aquí, tengo una N en esto y otra Y en aquello. Entonces sólo voy a cambiar eso. Y voy a estar usando el método Open del objeto de conexión. Y nos va a decir qué necesitamos abastecer cuando se trata una cadena de conexión de suministro que hemos creado. Y si tenemos un nombre de usuario y contraseña, podemos proporcionarlos. Y también podemos suministrar otras opciones, pero todo lo que necesitamos en esta es solo la cadena de conexión. Por lo que después de que se ejecute esta línea, habremos establecido esperemos una conexión a nuestra base de datos. Y ahora podemos empezar a enviar comandos a una base de datos con el fin de traer de vuelta los registros que queremos y los comandos que estaremos enviando lo que se llama SQL o SQL. SQL principal Lenguaje de Consulta Estructurada. Voy a necesitar construir una declaración SQL, y voy a hacer eso dentro de un objeto string. Por lo que solo crearé un nuevo objeto y llamándolo STI SQL. Ahora construyamos nuestra declaración SQL. Ahora, SQL se puede complicar increíblemente. No obstante, en esta instancia, todo lo que queremos hacer es devolver todos los registros que se encuentran en una tabla en particular. Entonces para hacer eso, usamos Select y vamos a usar una estrella salvaje aquí, que es de todo. Y ahora necesitamos suministrar el nombre de nuestra tabla, que era TBL en la conversión de moneda de la escuela. De acuerdo, ahora que tenemos nuestra declaración SQL, podemos seguir adelante y abrir en el conjunto de registros usando el método Open que nos va a decir lo que necesitamos, la fuente, que es la sentencia SQL. Y necesitamos suministrar la conexión, que es la conexión que hemos establecido con la base de datos. Y hay otros argumentos que podemos suministrar, pero eso es todo lo que necesitamos para abastecer por ahora. Entonces lo primero que siempre hago después abrir un registro sit es que reviso que hayamos devuelto registros y los registros sit object sí tiene una propiedad de conteo de registros, sin embargo, hay una captura y déjame explicar. Entonces hablemos de las diferencias entre Excel y base de datos. Excel es muy nivel macro en que podemos referirnos fácilmente a celdas individuales dentro de una tabla. No obstante, una base de datos está más enfocada en conjuntos de datos, lo que significa una tabla o conjunto de registros completo que se devuelve de una consulta. Por lo que en una base de datos hay menos enfoque en las células individuales. Y si bien esa es una gran manera de manejar conjuntos de datos en una base de datos, esto se puede ver como una limitación al hacer referencia a una base de datos desde Excel. Entonces para sortear esto, inventaron un mecanismo al que llamamos cursor. Entonces déjame solo traer a Excel. Entonces piensa en un bloqueo de cursor esto, es literalmente sólo la celda con actualmente en la que indica en qué columna y en qué estaba Roe. Y somos capaces de navegar por ahí usando el cursor. Por lo que teniendo esto en cuenta, necesitamos especificar dónde está la ubicación costera en el objeto de conexión. Entonces déjame hacer eso rápidamente ahora. Y se utiliza cliente. Entonces vamos a usar el cursor de Excel, no el cursor de base de datos. Y al hacer esto, podemos obtener fácilmente una representación precisa de cuántos registros en el conjunto de registros. Entonces solo voy a usar la propiedad de conteo de registros dentro de una declaración básica if. Y así la razón por la que estoy haciendo esto es si empezamos a interactuar con un conjunto de discos como si tuviera discos, sin embargo, no tiene discos, entonces eso va a producir una era. Entonces solo quiero ejecutar código cuando en realidad se ha devuelto un registro. Entonces si nos metemos dentro de esta declaración if con conexión de datos abiertos con directo abierto se sentaría y tenemos registros devueltos de la base de datos. Entonces ahora puedo seguir adelante y crear una nueva hoja de trabajo en la que voy a poblar los datos. Y para crear una nueva hoja de trabajo, necesito usar la colección de hojas, que pertenece al objeto del libro de trabajo. Entonces WB, porque ese es el libro de trabajo en el que queremos crear la hoja en y la colección de hojas. Y hay un método que anuncio para esta línea, sólo vamos a añadir una hoja genérica. No obstante, también quiero especificar el nombre. Y sólo voy a usar la fecha actual como lo hemos hecho en una lección anterior usando formato. Elige un guion bajo allí también. Por lo que esta línea va a agregar un nuevo tono en ese objeto de libro de trabajo, que es este libro de trabajo actual. Y va a establecer la propiedad de nombre al mismo tiempo agrega la nueva hoja de trabajo y va a crear una hoja con este nombre. Entonces ese es el día actual en día y mes. Entonces d, d m, m, y va a tener un subrayado y luego moneda. Ahora que he creado mi nueva forma, entonces puedo sentar mi objeto de hoja de trabajo basado en lo que acabamos de crear. Sólo voy a copiar esto porque ese es el nombre de la propiedad. Es exactamente lo mismo. Enfriar. Entonces en una forma de U no solo se quieren llenar todos los datos, también quiero incluir los encabezados de campo. Y si miras un conjunto de registros como una tabla, no incluye los encabezados de campo, pero los encabezados de campo están disponibles desde el objeto de conjunto de registros. Entonces lo que voy a hacer es usar un bucle for y bucle a través de los conteos de campos en el conjunto de registros. Y luego vamos a poblar los nombres de campo en la hoja de trabajo dentro de ese bucle for. Entonces estoy usando la propiedad fields, y esa propiedad tiene un método llamado count. Solo voy a necesitar definir esta variable x. Ponlo como a lo largo por si acaso. Y ahora puedo seguir adelante y poblar eso en la hoja de trabajo. Yo quiero que esté en la fila uno porque ahí es donde van los encabezados de campo. Y voy a usar x, que es nuestro punto en el interior de nuestro bucle for. Y ahora voy a sacar la propiedad de nombre de campo del objeto de conjunto de registros para la columna actual en la que estamos. Algo que quiero agregar aquí es que a diferencia de una hoja de cálculo o un objeto de hoja de cálculo, la propiedad de este campo está indexada 0. A lo que me refiero con eso es el número de índice comienza en 0. tanto que un objeto de hoja de trabajo, el Índice comienza en uno, como en la fila uno, columna uno, etcétera. Pero la propiedad fields, la indexación comienza en 0. Eso significa que necesito quitarme uno del número x porque empieza en uno aquí. cual estamos usando para abordar qué columna está en la hoja de trabajo. Ahora quiero asegurarme de que el cursor de conjunto de registros esté en el primer registro. Entonces solo voy a usar un método de movimiento. Como se puede ver, hay múltiples tipos diferentes de métodos, pero quiero decir mover primero. Entonces eso sólo va a mover el cursor hasta el primer registro de ese conjunto de registros. Y ahora que también tengo mi cabeza de campo está poblada, ahora puedo seguir adelante y empezar a poblar los datos del registro, sentarme a la hoja de trabajo. Para hacer eso, voy a usar un bucle due until, y voy a bucle hasta que el conjunto de discos llegue al final. Entonces te mostraré cómo voy a hacer eso. Hacer E, o, F, o final de archivo. Ahora porque no estoy usando un bucle de índice aquí, voy a necesitar otro número o contador para contar en qué fila estamos actualmente en sumas voy a agarrar una nueva variable aquí. Y me voy a sentar eso aquí, 22 porque la primera fila ya está tomada con los encabezados y vamos a empezar en la fila dos. Entonces si lo piensas, este bucle va a estar en bucle a través de los registros o filas, y voy a necesitar otro bucle para recorrer los campos o columnas de mi conjunto de registros. Entonces voy a usar un método similar al que hemos usado aquí. Ahora puedo poblar esta celda actual desde el registro establecido en la celda de la hoja de trabajo. Y voy a usar y como el rho porque esa es la fila ahí, empieza a las dos. Y el índice de la columna es el valor de punto x igual. Y similar a lo anterior, estamos usando x menos uno porque los campos es 0 índice. Estamos usando el método de valor esta vez. Acaba de encontrar un error. Entonces en este bucle se supone que estamos usando nombre no valor, porque valor es el contenido de la celda y nombre es el nombre del campo. Entonces voy a cambiar eso. Ahora después de que hayamos terminado este bucle aquí, eso significa que hemos recortado todas las columnas de esa fila actual en el conjunto de registros. Entonces ahora tenemos que ajustar eso. Tenemos que pasar a la siguiente fila de la hoja de trabajo y a la siguiente fila del conjunto de registros. Entonces, por tanto, voy a hacer y igual y más uno. Y voy a pasar al siguiente registro y al conjunto de registros usando el método move next. De acuerdo, entonces piensa que estamos listos para probar esto ahora solo voy a pasarlo usando F8. Así que basta con hacer click aquí y se produjeron paradas. Y si no tenemos una flecha de inmediato, significa que hemos compilado y todo está bien o al menos es bueno por ahora. Sí. Está bien. Eso es bueno. Está compilado. Empecemos a pasar por esto. Entonces vamos a sentarnos fuera objeto cuaderno. Vamos a crear una nueva versión en blanco del conjunto de registros y la conexión de base de datos. Estamos construyendo una cadena de conexión. Y tal vez sólo traiga la ventana inmediata sólo para mostrarles cómo luce eso terminado. Entonces así es como se ve, un chapado. Por lo que he concatenado la ruta y el nombre del archivo. Vamos a bajar eso. Por lo que ojalá ahora podamos conectarnos a nuestra base de datos usando esta cadena de conexión, dedos cruzados. Bueno eso parecía funcionar. Por lo que ahora vamos a fijar la ubicación costera. Por lo que estableció la ubicación del cursor en el lado del cliente, lo que significa que somos capaces de obtener una representación precisa de cuántos registros se han devuelto en conjunto de registros. Voy a construir consulta SQL ahora. Voy a abrir ese conjunto de registros dedos cruzados eso con sentencia SQL escrita correctamente. Sí, eso está bien. Entonces, subamos la ventana inmediata y podemos interrogar cuál es el conteo de registros. De acuerdo, así que tenemos 804 discos en ese conjunto discográfico, que es todo en el título. Sigamos adelante. Entonces ahora vamos a crear una nueva hoja de trabajo. Y podemos decir que se creó uno nuevo aquí esta noche. Ah, que es el día actual aquí en Australia bajo moneda escolar, que es excelente. Y voy a establecer esos objetos para que estemos usando el mismo nombre que acabamos crear para que hayamos establecido objeto hoja de cálculo. Sigamos adelante. Entonces ahora vamos a poblar los encabezados de campo en la hoja. Entonces sólo voy a traer a Excel para que podamos decir que ya se ha hecho eso todavía. Entonces tenemos la sábana aquí, voy a imán si es pequeña. Entonces podemos decir el nombre de la hoja aquí, y acaba de llenar los encabezados de campo en la hoja. Eso es genial. Um, yo también tipo de hacer esto en pantalla dividida, así que solo aguanta conmigo un momento para que podamos ejecutar el código al mismo tiempo. Podemos decirlo, poblar la hoja de trabajo. Por lo que volvamos al código ahora. Vamos a pasar al primer registro. Vamos a establecer la ubicación del cursor en el primer registro y el conjunto de registros. Y vamos a fijar el primer rotor dos. Y ahora vamos a recorrer en ciclo cada registro en este centro discográfico, bajar esto hasta que lleguemos al fondo de ese conjunto de récords. Entonces por el momento, como pueden ver, no estamos al final del conjunto de registros y esa propiedad es falsa. Por lo que sólo vamos a hacer un punto en bicicleta por ahora. Es interesante, pero es porque el valor es lanzarse a C. Vale, así que ahora se está moviendo. Por lo que también puede estar pensando, wow, estamos pasando por este conjunto de récords celda por celda, pero esto es razonablemente eficiente. Si tuviéramos más columnas y más filas o más registros, probablemente lo haría de otra manera, pero no nos tocó eso hasta llegar al contenido avanzado. Entonces por el momento, este método en realidad está bastante bien para lo que queremos hacer, que es poblar un pequeño número de filas y columnas en una hoja de trabajo. Y como dije, es razonablemente eficiente porque cuando no se utiliza la interfaz de usuario con sólo poner valores de un lugar a otro. Entonces lo que voy a hacer es que sólo pondré un cuadro de mensajes al final el cual indica que hemos llegado al fondo. Por lo que había 805 cada fila. Para que podamos ponerlo en marcha a precio completo y podamos obtener el cuadro de mensajes cuando esté hecho. Por lo que ahora voy a pegarle a F5 y listo. Entonces, como puedes ver, es bastante rápido. Y vamos a desplazarnos rápidamente por aquí. Voy a traer eso un poco más allá. Y sí, está poblado todos los registros. Ojalá, si me pego a control aún, tenía un 105. Ahí vamos. Entonces eso está poblado todos los registros. De acuerdo, así que eso termina la Lección 12. En resumen, miramos la importación de datos de diversas fuentes externas. Abrimos un archivo CSV e importamos eso a nuestro libro de trabajo. También nos conectamos a una base de datos externa y ejecutamos una consulta SQL básica para devolver los registros que nos interesaban. Las nuevas características de VBA que introdujimos fueron la biblioteca de objetos de datos x activos y también el objeto de tipo conjunto de registros. Mi nombre es Andrew, gracias por verlo, y los veré en el siguiente video. 6. 06 - Lección de VBA 13: Arrays: Bienvenido a la Lección 13. Armatrices. En mi opinión, un ascenso de la función más poderosa y útil en VBA. Las matrices son tan útiles porque nos permiten mantener eficientemente enormes cantidades de datos en la memoria mientras consumen muy pocos recursos. Esto nos permite realizar tareas intensivas en mano de obra en fracciones de fracciones de segundos. En esta lección, aprenderemos sobre mi tema favorito, arrays. Hablaremos de matrices de una sola dimensión, y también hablaremos de matrices multidimensionales. Piensa en una matriz como una tabla virtual. Mesa relicario. Podría tener filas y columnas. Esto es a lo que nos referimos cuando nos referimos a las dimensiones de una matriz. Una matriz unidimensional contiene sólo una columna. Por lo tanto, sólo necesita una dimensión para referirse a un valor 0 específico, que es el rho. Una matriz multidimensional contiene más de una columna. Esto significa que necesita varias dimensiones para referirse a un punto o valor específico dentro de ese conjunto de datos, por ejemplo, columna y qué fila. La ventaja de usar una matriz o si se dice un rango de hoja o registro sit es por su eficiencia. Él es sólo una comparación rápida de un objeto de rango versus una matriz. Un objeto de rango es una referencia a una ubicación específica en una hoja. Y debido a que la variable de organización es una representación de esa ubicación de forma específica, tiene muchas otras propiedades padre e hijo. Y debido a esto, la variable en VBA consume más memoria en comparación con una matriz de las mismas dimensiones. Un objeto de rango también tiene que sostener una referencia entre el objeto teórico declarado en VBA y el objeto de rango físico en la hoja. Esto significa que siempre se realizan operaciones de lectura y escritura inevitables entre la representación variable del objeto de rango y el objeto de rango físico en la hoja. Por lo tanto, cuando estamos hablando de conjuntos de datos muy grandes que requieren una operación intensiva en mano de obra. Y por eso hasta hice sólo buscar un solo valor dentro del título. El rendimiento del objeto de rango es muy pobre cuando se compara con una matriz. Por otro lado, una matriz es solo un tipo de objeto básico que tiene muy pocas propiedades. Es literalmente sólo las dimensiones correctas y el tipo de datos. Eso significa que te permite simplemente cargarla con datos y sostenerla con un mínimo alboroto. Y debido a su simple nitrito, hace que las mismas tareas intensivas en mano de obra se realicen sin esfuerzo y por lo tanto increíblemente rápido. Estaremos viendo dos ejemplos prácticos hoy en día, una matriz unidimensional y una matriz multidimensional. Saltemos justo dentro. Y este ejemplo, te presentaré a surge unidimensional y también a la función VBA incorporada llamada split. Sólo voy a agregar rápidamente un nuevo módulo de código. Entonces estamos en el módulo cinco. Ahora empecemos con split. Split es una función VBA incorporada que nos permite realizar una operación sobre una cadena, cual la divide en numerosos componentes discretos basados en un delimitador. Un delimitador es un carácter que denota un punto de separación. Si recuerdas de nuevo en la última lección, usamos archivos CSV. Un archivo CSV tiene un coma como delimitado entre campos. La función dividida también nos permite definir qué personaje queremos usar como delimitador. Voy a empezar en primer lugar, sólo por crear una subrutina. De acuerdo, solo lo estoy llamando matriz SBA SPL. De acuerdo, entonces lo primero que haré es declarar nuestra variable array. Ahora este tipo de datos es una cadena. Lo que eso significa es que todo dentro de esta matriz se va a almacenar como una cadena. En realidad eres capaz de contener múltiples tipos de datos mediante el uso de variante. No obstante, rara vez uso variante. Y la razón por la cual es porque sólo quiero sostenerlo de la manera más básica posible, que es una cadena. Al usar la pestaña de datos de variante, puedes encontrar problemas como teníamos formatos de fecha y ese tipo de cosas. Y eso es obviamente indeseable. Por lo que siempre solo sostengo todo es una cuerda. Ahora también quiero declarar una variable de cadena, y eso va a contener pedazo de texto que contiene unas cosas que queremos dividir. Entonces pensemos por qué podríamos querer dividir algo. Ok, así que me limitaré a saltar de nuevo a nuestro ejemplo anterior aquí. Como puedes ver aquí, tenemos la ruta completa del archivo de la base de datos que teníamos en el ejemplo anterior. Entonces solo voy a copiar eso saltó de nuevo al módulo cinco, y sólo lo asignaré a esta variable aquí. Digamos por ejemplo, sabemos que esta es una ruta de archivo completa, pero solo queremos agarrar el nombre de archivo en sí. Sabemos que un directorio contiene barras invertidas. Por lo tanto, si dividimos esta cadena por barras invertidas, Ahora podemos agarrar el nombre del archivo, que será el último otoño en esa división. Entonces, solo hagamos eso ahora. Entonces estoy usando la función dividida aquí y mi corchete, y la expresión que quiero enviar la función dividida es dividida y el delimitador es invertida. No necesito suplir nada más. Por lo que una vez que se ejecute esta línea estará sosteniendo una matriz en SPL y va a contener esta cadena dividida por el carácter de la diagonal inversa. Entonces lo que estoy esperando es la primera fila en mi matriz para sostener el colon C. Y el siguiente serán usos, y el siguiente serán I y II. siguiente es OneDrive y así sucesivamente y así sucesivamente y así sucesivamente. Entonces lo que haré es pasar por el código y después de ejecutar esta línea, te mostraré lo que pasa en la ventana del reloj. Y despreocupado por este contexto, el contexto actual de esta subrutina. Así que pega bien. De acuerdo, así que ahora abajo en la ventana del reloj podemos ver que tenemos nuestra variable aquí. Podemos decir que en la parte superior hay una cuerda y tiene una propiedad de 0 a cinco. Y array es 0 indexado, lo que significa que el primer registro está indexado 0. A diferencia de una hoja de cálculo que está indexada en una, no hay fila 0, solo hay fila uno. Entonces en array, el primer elemento siempre es un 0 tanto para fila como para columna. Pero este es sólo una matriz unidimensional, por lo tanto, sólo tenemos filas. Entonces como puedes ver aquí, si golpeo el plus, puedes ver que el índice 0 es el colon C, que es exactamente lo que esperaba que fuera. Y el siguiente es usos, y el siguiente es EI y DRA. El siguiente es documentos de One Drive por bla, bla. Entonces como pueden ver aquí, y yo doble SPL cinco, estoy sosteniendo el propio nombre de archivo real. Entonces ahora hablemos de cómo voy a sacar el nombre del archivo de esta matriz. En esta instancia, sé que el nombre del archivo es el último otoño en esta cadena. Recuerda cuando estábamos mirando la matriz en el reloj, vimos que en la parte superior decía cuerda 0 a cinco. Por lo tanto, sabemos que hay seis elementos en esta matriz, y nos referimos a estas cosas como límites. Entonces el límite bajo, lo que significa que es el primer elemento de la matriz y el límite superior es el último elemento de la matriz. Entonces si quiero agarrar el último otoño, me referiría al límite superior de mi matriz. Entonces solo voy a usar ese límite superior y ahora voy a depurar imprimir eso en la Ventana Inmediata. Entonces, entonces estoy usando los corchetes de nuevo porque en realidad me estoy refiriendo a algo dentro de la matriz. Y ahora en edad se refieren al índice. Entonces otro que son cinco. Entonces solo muéstrale 5 primero, que es el sexto ítem porque empieza en 0. Entonces si traigo esto de nuevo aquí y le pego a F8, solo saca esto. Verás en la ventana inmediata que nos ha dado el nombre del archivo. Ahora bien, y si no quiero explícitamente Cy5 porque sus numerosas carpetas, hay numerosas, más carpetas que ésta o menos carpetas de las que tenemos en esta cadena actual. Entonces lo que puedo hacer entonces se refiere al límite real. Entonces ese es un cálculo que me dice cuál es el límite inferior o superior de esa matriz en particular. Entonces, en lugar de suministrar un índice, te voy a abastecer encuadernado en U de lo que abundan. Y si pasamos por encima de eso, dirás que nos dice que el límite superior es cinco. Entonces si solo hago esto y vuelvo a golpear a F5, verás que se ha hecho lo mismo. De igual manera, si quiero devolver el límite inferior o el primer elemento de la matriz, que sería C colon. También puedo usar L bound. Entonces si solo hago eso, puedes ver ahora tiene el colon C en la Ventana Inmediata. Entonces ese fue solo un ejemplo realmente rápido y fácil para presentarte a las matrices al mismo tiempo presentarte a la función dividida. Entonces ahora pasemos a matrices multidimensionales. Este siguiente ejemplo podría no ser del todo práctico. No obstante, sirve como una buena introducción a las matrices 2D. Y al mismo tiempo demostraremos cuán eficiente y rápido mueren cuando se usa como mesa en comparación con usar una hoja exactamente de la misma manera. Vamos a estar haciendo este ejemplo en dos partes. En la primera parte, vamos a cargar hasta 5 mil filas en una hoja de trabajo con números aleatorios. Y luego vamos a buscar a través de esas 5 mil filas para un valor específico. Después de eso, también cargaremos una matriz 2D con 5 mil filas de números aleatorios y cazaremos un valor específico dentro de esa matriz. Yo sólo voy a quedarme aquí en el módulo cinco. Pero empezaré con solo definir nuestra subrutina. De acuerdo, entonces pensando en las variables que vamos a necesitar. El primer terreno, voy a cargar una hoja de trabajo con 5 mil filas de números aleatorios. Entonces definitivamente necesitaré el cuaderno de trabajo y la hoja de trabajo. Ahora tengo unas sábanas en blanco listas. Eso es frío en forma de tres. Por lo que sólo usaré ese en este ejemplo. Voy a estar cargando las 5 mil filas usando un par de bucles for. Por lo tanto, voy a necesitar un par de números o enteros. Si ya sabes familiar, estaré usando los enteros x e y como la fila y el puntero de columna en mis bucles completos. Por lo que el primer bucle for será para la fila. Por lo que va de la fila uno a la fila 5 mil. Y pasé de la columna a a la Z, así que eso es 26. Entonces eso será de uno a 26. Entonces en este bucle, como estamos en una fila y como estamos recorriendo la columna uno a 26 en la celda actual que se encendió dentro de este for loop usando el punto y, quiero imprimir un número aleatorio en esa celda, y quiero que ese número estar entre 15 mil. Voy a hablar rápidamente esto en un comentario para explicar cómo creamos un número aleatorio entre ciertos valores. Entonces, antes que nada, vamos a empezar con algunos corchetes. Y dentro de esos corchetes, lo que queremos hacer es que queramos tener el límite superior y el límite inferior más uno. Por lo que el límite superior es de 5 mil. Y ahora queremos restar el límite inferior, que es uno. Y entonces necesitamos más uno. Ahora, fuera de estos paréntesis, queremos tiempos que por la función R y D, que es un generador aleatorio. Ahora también queremos añadir de nuevo el límite inferior, así que esa es una. Pero no queremos ningún decimal, por lo tanto, necesitamos lanzar esto como un entero. Entonces si ahora solo tomo esto y lo llevo a la ventana inmediata, solo subiré la ventana inmediata para que no tenga acercar más adelante y hacer un signo de interrogación y luego interrogar qué devuelve este valor. Nos ha dado un número aleatorio. Y ese número nunca supera los 5 mil en él nunca va por debajo de uno. Entonces ahora vamos a usar eso y poblarlo en una celda. Sonidos, películas Identidad de ventana inmediata. Como lo hemos hecho en numerosas ocasiones y he escuchado, queremos abordar la hoja. Queremos abordar las celdas de esa hoja. Qué células queremos. Queremos x, y, porque tenemos el puntero de fila, tenemos el puntero de columna. El valor de punto es igual al número aleatorio, eso es costo como un entero. Entonces después de haber escrito todos los valores a las 5 mil filas y 26 columnas. Y yo quiero esencialmente hacer lo mismo, pero leer los valores y buscar un número específico. Y el número que quiero buscar es de 4,999. Entonces sólo voy a copiar esto muy rápido. Porque esencialmente estamos haciendo lo mismo. Vamos a empezar en la fila uno e ir a la fila 5 mil. Y en cada fila vamos a recorrer por la columna 12, colon 26. Y me voy a deshacer de esto por ahora. Entonces para interrogar un valor, solo voy a usar una declaración if. Si. Entonces, si la celda actual en la que estamos, si el valor de esa celda es igual a 4,999, bucles 4,999, entonces quiero hacer algo. Yo quiero reemplazar el valor en esa celda por el otoño encontrado. Y también voy a depurar sólo imprimir eso en la ventana inmediata. Y voy a entonces también incluir la dirección. Y esta vez lo copiaré. De acuerdo, ahora pasemos a nuestra matriz. Por lo que me limitaré a saltar de nuevo las declaraciones de la declaración de Ian Euro. Y voy a declarar nuestra matriz. Y te darás cuenta, a pesar de que estoy hablando de enteros, todavía me estoy refiriendo a ello como una cadena. Y esto es puramente por eficiencia, pero también hay una manera realmente rápida y fácil de comparar cadenas y enteros. Entonces ahora que hemos definido nuestra matriz, ahora podemos dimensionar la primera dimensión o declaración, que simplemente lo configura como una matriz. Ahora quiero proporcionar las dimensiones de esa matriz. Entonces, ¿qué tan grande es la tabla, cuántas columnas y cuántas filas? Ahora también puedo hacer eso en la declaración de declaración, pero siempre prefiero hacerlo por separado. La forma en que se asigna el tamaño de una variable de matriz es usando la sentencia read deem. Y enseñamos el nombre de la variable array. Ahora necesitamos proporcionar los números de columna y fila. Pero primero déjame solo comentar esto y te explicaré algo. Por lo que ya sabemos que las matrices se indexan de manera diferente a otros tipos de objetos, como celdas y rangos y hojas, etcétera, en que empiezan en 0, por lo que el 0 indexado. Ahora, las propiedades de indexación también son diferentes. Entonces, por ejemplo, cuando nos referimos a una celda en particular en un rango o en una hoja de cálculo. Primero necesitamos la fila. Y luego hicimos la columna. Pero en una matriz, realidad es al revés. Primero aplica la columna y luego suministra la fila. Y eso potencialmente puede volverse realmente confuso, pero en realidad es por una razón bastante sencilla. Y la razón es que mientras está ejecutando código, en realidad no puede agregar columnas a una matriz. Solo puedes agregar filas cuando piensas en una tabla de datos que estás usando en tiempo de ejecución, que tu calificación iraníes que están interrogando o tratando de encontrar un objeto en. Es muy raro que vayas a necesitar agregar columnas a ese título, pero es posible que tengas que agregar filas a ese título o agregar nuevos registros a esa tabla. Y debido a esto, en realidad no se puede expandir la propiedad de columna en una matriz sin primero destruir ese objeto y luego comenzar de nuevo. Entonces lee dimensión todo el asunto y luego cargarlo de nuevo. De todos modos. Entonces vamos a establecer el valor de la columna y sabemos que hay 26. Queremos un a Zed. Y debido a que la matriz comienza en 0, eso significa que necesita ser 25. Y sabemos que van a haber 5 mil filas por lo tanto, porque empieza en 0, son 4,999. Por lo que eso ha establecido nuestro tamaño de matriz en 5 mil filas y 26 columnas. Y así ahora que hemos establecido el tamaño de la matriz, podemos usar los límites de la matriz en bucles. Entonces solo haré eso ahora. Entonces lo primero que queremos hacer, que es idéntico a lo que hicimos aquí arriba con la hoja. Queremos primero cargarlo con números aleatorios, y luego queremos recorrer ese array y queremos encontrar 4,999. Entonces cuatro. Y sólo voy a usar 0 aquí. Ahora. Podría usar 4,999 porque ya sé que ese es el límite superior de la matriz. No obstante, también puedo usar el cálculo del límite superior, que está encuadernado. Y necesitamos abastecer qué límite superior estamos buscando. Entonces ese es Array Rand. Pero debido a que tenemos múltiples dimensiones, necesitamos abastecer qué dimensión queremos buscar. Y extrañamente este índice apunta a una. Por lo que estamos buscando las filas en esta instancia. Por lo que las columnas serán una y las filas serían dos. Entonces buscamos el índice de dos. No me pregunten por qué hicieron eso. Así es como lo hicieron. Y ahora podemos recorrer recorriendo la columna te va a usar de nuevo encuadernado. Y busco la columna, así que esa es una. Y no estoy solo copiando esto aquí arriba. Pero ahora voy a asignar. Y busco la columna, primera columna, fila. Voy a asignar el valor a eso. Entonces exactamente lo mismo al bucle completo aquí arriba. Lo que estamos haciendo es ir en bicicleta por estos dos para bucles, pasando por las filas y las columnas. Y estamos asignando un valor a cada celda individual dentro de cada fila y cada columna. Y ahora también exactamente lo mismo que el ejemplo. Lo que queremos hacer es querer recorrer el array y queremos buscar un valor específico. Entonces de nuevo, solo voy a copiar esto y pegarlo ahí. Se va a bajar un poco. Aquí vamos. Y voy a tener la misma declaración if, pero para la matriz. Ahora antes de continuar, tal vez recuerden que definí la matriz como una cadena, lo que significa que está sosteniendo solo cadenas. Entonces lo que eso significa es que digamos que tenemos el número nueve. Si tenemos un nueve, ese es un entero real, pero lo sostiene así, como una cadena. Entonces VB eye no lo ve como un carácter numérico o.Lo que eso significa es que si estoy usando un entero aquí y tengo una cadena aquí, estos nunca se compararán. Entonces lo que eso significa es que necesito costar lo que tengo aquí, que se mantiene como una cadena, como un entero. Y la forma en que soy capaz de costar una cadena como entero es ancho, el costo como función entera. Hay un par de problemas para hacer esto. Un problema que tenemos con hacer esto es que lo que sucede si esta columna en particular o, o este valor en particular no tiene un número, en realidad vamos a conseguir una era. Por lo que sólo te mostraré en la ventana inmediata. Digamos que enviamos a la función Sea INT un carácter alfa. Nos enseñan desajuste porque no se puede convertir. Eso en un entero porque es un carácter alfa. Hay numerosas formas de alrededor de esto usando funciones integradas de una sola línea muy similares, pero no voy a meterme en eso ahora mismo. Eso lo vamos a cubrir en otro momento. De acuerdo, así que exactamente lo mismo que nuestro bucle aquí arriba. Deseo reemplazar el valor que se mantiene en esa celda por artículo encontrado. Y también quiero depurar imprimir un mensaje en las ventanas inmediatas. Entonces solo haré eso ahora. Simplemente volviendo a ese desajuste enseñado antes. Si me siento esto o declaro una variable como un entero porque estamos sosteniendo enteros, esto no funcionaría. No sería capaz de enviarle una cuerda. Y esa es otra razón por la que uso cuerdas. Porque básicamente todos los demás tipos de datos se pueden convertir en una cadena y luego convertirla lejos de una cadena. Pero si lo configuras como un tipo de datos entero, no puedes poner nada más que enteros ahí, incluso números superiores a 32.5 mil, porque ese es el límite máximo de un número entero. De todos modos, pasando adelante, alteraremos la impresión de depuración. Voy a estar haciendo esto un poco diferente. Por lo que también voy a incluir el nombre de la matriz y el punto está en esta declaración de impresión. Ahora, yo también quería comparar la diferencia entre los dos. Y una buena comparación es cuánto tiempo se tarda en hacer una tarea. Entonces, cuánto tiempo se tarda en completar el ejemplo de hoja y cuánto tiempo se tarda en completar el ejemplo de matriz. Para poder hacer eso, voy a necesitar hacer algunas sumas de fecha. Entonces solo voy a agregar una variable de fecha. Y también voy a agregar un par de enteros. El primero estará sosteniendo el número de segundos que tarda en completar la primera parte. Y el segundo sostendrá el número de segundos que tarda en hacer el segundo bote. Entonces, ¿cómo voy a lograr esto es estableciendo el tiempo a una variable antes de que sean puntos y luego comparando ese tiempo con el tiempo actual después de que lo hayamos terminado para podamos ver cuánto tiempo ha transcurrido entre esos dos puntos. Por lo que comenzaremos poniendo la hora y la fecha actuales en la variable Date. Y recuérdalo ahora siempre devuelve la hora actual pase lo que pase. Y después que terminamos. Y ahora podemos usar otra función para contar el número de segundos que tardó en completar esta tarea y luego asignar ese número a esta variable aquí. Voy a parar con eso igual. Por lo que la función que usas para comparar la diferencia entre dos dietas es fecha DEF. Y se puede ver que es pedir intervalo una cadena. Así son las horas, minutos, segundos, días, semanas, meses, años, y luego así la primera fecha, Así que esa es la fecha más temprana y la segunda fecha, que es la hora actual o la fecha que desea comparar la luz de día que te gustaría comparar con la primera fecha. Y eso es lo que necesitas abastecer. Entonces quiero segundos. Y el primer dydt es D G dot. Y la segunda noche, bueno, eso es ahora mismo. Entonces ahora. Y vamos a estar aguantando entonces el número de segundos que tardó llegar de aquí a aquí. Y ahora podemos hacer lo mismo por este. Entonces reutilizaré esa acción porque ya no necesitamos eso. Ya hemos aguantado cuántos segundos se lleva. Y agarraré la otra variable entera. Y haré exactamente lo mismo. De acuerdo, entonces ahora que tengo esos dos enteros, solo depuraré imprimirlos en la Ventana Inmediata. Sólo copiaré eso. Si bien estamos ejecutando esto, Excel podría informar que en realidad no está respondiendo y eso se debe a que podría tardar mucho tiempo en hacerlo. Si lo piensas, estamos haciendo 5 mil filas y estamos haciendo 26 columnas. Entonces eso es como un 203,000 mil, sí, un 130 mil operaciones. Y entonces estamos haciendo otras 130 mil operaciones aquí mismo. Y luego estamos haciendo otras 130 y otras 130 mil operaciones porque es el número de filas veces el número de columnas. Y estamos haciendo algo específico para H1. Y el propósito de esto era realmente solo mostrarte la diferencia en el tiempo que se tarda sacar valores de una hoja frente a tirarlos de la memoria. Y cada vez que realmente pasamos por cualquiera de estos bucles con hacer algo a la celda donde leerle o escribirle. Entonces estamos leyendo de ella en esta instancia, que es comprobar el valor. Y también le estamos escribiendo. Por lo que le estamos brindando un valor. Y sin embargo tenemos proporcionándole un valor aquí cuando el valor de celda en realidad es igual a 4,999. Pero al mismo tiempo estamos haciendo lo mismo con la matriz. En realidad le escribimos un 130 mil veces aquí. Y estamos leyendo de ella unas 130 mil veces en esta. Entonces voy a esperar que esto va a tardar un tiempo en completarse, y definitivamente va a reportar que Excel no está respondiendo. Y eso se debe a que tiene un valor de tiempo de espera en su carbón procedimiento, lo que significa que no puede estar ocupado con tareas por más de una cierta cantidad de tiempo antes de que informe que no está respondiendo. Y después de que ejecutemos esto, en realidad te mostraremos una manera rápida de evitar que eso suceda. Pero sí viene a un costo de rendimiento. Por lo que querrías usarlo con mucha moderación. De acuerdo, empecemos esto ahora. Pon el cursor aquí arriba. Voy a pegarle a F5 en 321. De acuerdo, hemos hecho que los ventiladores de mi computadora giraran muy rápido. De acuerdo, así que sólo voy a mover esta ventana inmediata arriba por aquí. Y diremos, sólo me desharé de éste de aquí. Verá que sí encontró 4,999 en múltiples lugares y mantenerlos en sus números aleatorios. Entonces es, ya sabes, no siempre va a ser parejo, pero es una comparación razonable. Entonces si se encontró 4,999 en estas direcciones en el rango, y también encontró 4,999 en la matriz en estos punto es. Pero lo más importante, completó 260 mil iteraciones de lectura y escritura en una hoja en 20 segundos. Pero un completado la misma cantidad de iteraciones o 260 mil a una matriz en menos de 1 segundo. Entonces, como se puede imaginar, esta vez suma significativamente y esta reducción de tiempo es extremadamente notable. De acuerdo, así que sólo una última cosa antes de que terminemos. Por lo que como era de esperar, la ventana de VBA o Excel mostrada por completo no responde mientras este código se estaba ejecutando. Entonces hay una y que podemos evitar eso. Y eso es que estamos usando un comando llamado do events. Y lo que realmente hace el comando do events es que permite a Excel priorizar otros eventos en la cola, como actualizar la ventana, etcétera, etcétera. Y esto puede ser muy útil cuando tienes otros usos usando una macro que has construido. Y puede evitar un cierre de pánico por fuerza porque creen que estás aplicación se ha congelado. Pero por razones de rendimiento, no queremos usar do events en cada iteración del bucle, solo queremos usarlo con moderación. Entonces digamos aquí cada 1000 filas. Entonces si necesito poner do eventos en mis bucles, utilizo la función mod, la función MOD matemática para hacer eso por nosotros. Así que acabo de poner aquí una declaración if que asegura que el comando do events solo se ejecuta cada 11000 filas. Así que solo sigue adelante y agrega esta declaración if a nuestros bucles ANOVA. Y 11000 podría no ser suficiente porque podría tomar más que el valor de tiempo de espera para hacer cien, diez cientos filas. Por lo que en sus pruebas, establezca esto en un valor razonable. También lo va a agregar al bucle de Ri, solo para ser justos, porque en realidad estamos agregando tiempo extra a esto. Eso es podredumbre hacer eventos sí introduce tiempo extra. Vamos a correr eso otra vez. Voy a mover esto aquí abajo. Ojalá no debamos ver a Excel mostrándose como no respondiendo, pero ¿quién sabe? Echemos un vistazo. Ok, está terminado. Esos traen esto aquí arriba. Y no vimos la pantalla de Excel no está respondiendo, lo cual es bueno. Y tampoco vimos una reducción de rendimiento. Siguen siendo 20 segundos y 0 segundos, así que eso es positivo. Y eso me dice que creo que hacer, hago eventos comando cada 1000 filas es un intervalo bastante razonable para realmente hacer ese comando. De acuerdo, así que eso resume el segundo ejemplo práctico de esta lección, la introducción a matrices 2D o matrices multidimensionales, y una demostración de las diferencias de rendimiento entre usar solo rangos y matrices, que sostiene que datos en la memoria para un fácil acceso de lectura y escritura. Yo sólo quiero hacer un comentario final antes de terminar esta lección. Como usted presenció en el segundo ejemplo práctico, realizar operaciones iterativas de un rango de celdas agrega tiempo considerable a la ejecución de nuestro código. Y esta es una trampa común en la que VB me desarrollo con tanta frecuencia caen. En mi experiencia, he podido optimizar macros de crujido de datos que quiere tardó minutos o incluso horas en ejecutarme un par de segundos. Y eso es simplemente mediante el uso y manipulación de los conjuntos de datos dentro de las matrices en contraposición a en rangos de celdas. Obviamente, las operaciones de hoja de trabajo, leer y escribir son lo que lleva más tiempo. Y es inevitable que para cargar una matriz o depositar los datos de nuevo en una hoja de trabajo, necesario realizar lectura y escritura a o desde la hoja de trabajo. En el contenido avanzado, te mostraré cómo absorber todo un conjunto de datos fuera la hoja en una matriz con una sola operación de lectura y tenía un volcado toda la matriz de nuevo en la hoja con un solo Raj operación para ahorrar aún más tiempo. Entonces chicos, eso termina la lección de hoy. Si llegó hasta aquí, quiero decir felicitaciones, acabas de aprender el concepto único más útil en Visual Basic aparte las matrices de dimensión única y multidimensionales aprendidas en esta lección, también aprendió sobre la función de división, que le permite dividir cadenas en componentes pequeños utilizando un carácter especificado como delimitador. También aprendiste a usar la función R y D para generar un número aleatorio entre dos números. Y por último, aprendiste a devolver una diferencia entre dos dietas en un intervalo especificado, IA, segundos, minutos, horas, días, semanas, meses, o años. Me llamo Andrew. Gracias por mirar y nos vemos en la siguiente lección. 7. 07: lección de VBA 14: fechas: Bienvenido a la Lección 14. Fechas. Solo quería hablar los problemas que probablemente encontraras con las fechas mientras codificas y VBA, qué buscar y qué puedes hacer para mitigar estos problemas. Por lo que hoy hablaremos de cómo las fechas de las tiendas de Excel, cómo las fechas de las tiendas VBA, y sí, son diferentes. También repasaremos el problema mayor en la forma en que se implementan las fechas. Y te voy a mostrar un par de formas de abordar estos problemas. Es importante entender cómo Excel y VBA realmente almacenaban las fechas. Porque si comparas el formato de rollo de una fecha de Excel y una fecha de VBA, habrá una discrepancia. Explica puertas fechas como un número. Se trata de un número secuencial que representa cuántos días han pasado desde el primero de enero de 1900. lo que como ejemplo, el 11 de agosto de 2020 se almacenará como 44.054. Y esto se debe a que el 11 de agosto de 2020 es 44,054 días desde el primero de enero de 1900. Vba también almacena fechas como un número, y también es un número secuencial, pero expresado como cuántos días han transcurrido desde el 31 de diciembre de 1899. Por lo que el 11 de agosto de 2020 se almacena como 44,055, siendo 44,055 días después del 31 de diciembre de 1899. Completo tanto las fechas, horas, minutos y segundos de Excel como VBA se expresan como decimal del número dique. Entonces si por ejemplo, 0.5 es igual a 12 PM mediodía, o 0.25 es igual a seis AM. Por lo tanto, en VBA, el número 1.25 representa el 31 de diciembre de 1899 a las 6AM. Y en Excel, el número 1.25 representa el primero de enero de 1900 a las seis, estoy almacenando fechas de esta manera hace que sea sencillo para Excel y VB I para que ese meta realice cálculos en fechas. Por ejemplo, contando el número de días entre fechas, sumando fechas juntas, etcétera. Microsoft ve esto como un concepto muy simple pero eficaz. Cuando Excel presenta la fecha a un usuario en una hoja de cálculo o con VBA en el cuadro de mensaje Ventana inmediata o utiliza un formulario, etcétera, se realiza un cálculo que presenta los datos en un formato legible por el usuario. Y aquí es donde encontramos problemas porque hay tantas maneras en que se puede expresar una fecha. Por ejemplo, US Long Date, us short date, European long day, European short date, Julian date, Unix, timestamps, etcétera, etcétera. Todas estas diferentes formas de expresar dietas pueden confundir o incluso perturbar completamente el cálculo de fecha incorporado utilizado para tomar una representación de una fecha y almacenar en el formato de número secuencial. Si utilizas Excel como parte de tu vida laboral, sin duda tendrás experimentado esto. Para aquellos en EU que tratan con datos donde los datos almacenados en formato europeo y viceversa. Podría decirse que el problema es en realidad peor para aquellos de nosotros que no usamos el formato de fecha estadounidense ya que el cálculo incorporado parece favorecernos los formatos de fecha. También debe pero no siempre toma en consideración el Formato de Fecha y Hora local sentarse en su computadora. A continuación te mostramos un ejemplo de este problema de cálculo de fecha. Excel ha tratado esta fecha europea como una fecha estadounidense hasta el día 13 del mes, y luego se da la vuelta a una fecha europea. Aquí hay otro ejemplo de algún comportamiento errático inexplicable del cálculo de fecha en Excel. Cuando necesitamos leer o escribir datos hacia o desde hojas de trabajo con VBA y realizar nuestros propios cálculos en estas fechas. Esto es obviamente un problema enorme. Adicionalmente, si enviamos una fecha formateada a una celda, vuelve a estar sujeta al cálculo de fecha defectuoso de Excel porque Excel lo ve como una fecha y tiene que realizar su cálculo defectuoso en esa fecha para convertirlo en su formato numérica. Entonces, ¿qué podemos hacer? En pocas palabras, necesitas controlar tanto como sea posible. Y para poder controlar lo más posible, necesitas estar preparado por lo que necesitas entender a qué te podría enfrentar. En otras palabras, hacer tanto análisis como sea posible. Si sí requieres la entrada del usuario, no permitas que hablen en una Fecha. Utilice un control de selección de fecha para asegurarse de que la fecha sea precisa, sea posible, almacene sus datos como una cadena en la hoja. Esto evitará que Excel se desempeñe. Se trata de cálculos erróneos extravagantes en las fechas. Al escribir una fecha en una celda, simplemente coloca un solo apóstrofe antes de tu cadena de fecha. Esto impide que Excel realice un cálculo sobre él. Si debe almacenar datos como fechas en una hoja de trabajo, lo que sería necesario si los usuarios necesitan filtrar por fecha o usar una fecha en una fórmula, utilice un formato de fecha no ambiguo. Por ejemplo, utilice caracteres alfa como el mes, IA, AN como enero. Lo que esto hace es que se asegurará de que el cálculo de Excel de Florida pueda decir de inmediato cuál es el componente dy y cuál es el componente del mes. Por último, realice sus propios cálculos. Si estás recogiendo fechas de una hoja, no confíes en las funciones básicas incorporadas. Analiza tus datos como el primer paso en la construcción de tu aplicación. Y esto es para que puedas tener una mejor idea de qué formatos de fecha aleatoria te lanzará Excel. Tienen para realizar de manera confiable tus cálculos de fecha. Aquí hay un ejemplo de la vida real de un escenario con el que recientemente me enfrenté y los pasos que tomé para asegurarme de que las fechas fueran correctas, mi aplicación tuvo que importar datos de un CSV y como Excel abrió el archivo, se realizó es defectuoso cálculo en el campo de fecha, y este fue el resultado de los cálculos de Excel. Por lo que mi primer paso fue obtener el tamaño de muestra más grande que pudiera obtener y asistir las fechas posibles a las que potencialmente podría enfrentarme. De esa manera, puedo escribir mi propia función que pueda manejar todas esas fechas y convertirla en una fecha real. Entonces reconstruyamos esa función ahora. Entonces comencemos a construir función. Simplemente me detendré agregando un nuevo módulo de código. Módulo seis. Y yo solo definiré una función. Entonces lo estoy llamando se desprendió de cadena. Y lo que necesitamos para suministrar la función es el dydt como una cuerda. Y quiero devolver una fecha. Entonces el propósito de esta función es tomar la fecha que está en cualquier formato aleatorio y devolver eso como un muerto real. Entonces realizando mi propio cálculo de fecha en esa cadena. Por lo que ya he realizado mi análisis sobre el tamaño de muestra más grande de datos que posiblemente podría obtener. Y noté que en este ejemplo eran verdaderos formatos de fecha potenciales que posiblemente pude ver. También sé que este archivo es creado por una aplicación o una aplicación web. Por lo tanto, puedo más o menos garantizar que las dietas están recibiendo la entrada no van a cambiar terriblemente mucho porque el archivo se genera automáticamente por una pieza de software. Y en el gran tamaño de muestra que recibí, me di cuenta de que había verdaderos resultados potenciales de cómo Excel presentará estas fechas. Entonces lo que normalmente siempre hago es dejarlos pasar como comentarios en la parte superior para que pueda trabajar a partir de estos. Entonces lo primero que noté es que un formato de fecha tiene un espacio y el otro formato de fecha tiene bien, devs a especias aquí y otro espacio allá. Lo que he notado es que una de las dietas tiene una marca de tiempo de doce horas con él y pagarle al final. Y el otro está en un sello de tiempo de 24 horas. Entonces ahora que conozco estas cosas, puedo atender estos escenarios. Entonces lo primero que quiero hacer es manejar estos espacios dobles. Entonces la forma en que estoy pensando en hacer eso es usar la función Reemplazar para reemplazar un espacio doble por un solo espacio. Entonces, en primer lugar, solo declararé mi variable, solo llamándola fecha de intento STR. Y ahora sustituiré los espacios dobles por un solo espacio. Pero la función Reemplazar aquí y la expresión que queremos enviarla es la fecha de STI. Y lo que queremos encontrar son verdaderas especias. Y con lo que queremos reemplazarlo es con una sola especia. Por lo que podré enviar cualquiera de estas dietas a esta función de reemplazo, y sólo afectará a la S1. El siguiente paso es que necesito identificar la diferencia entre estos dos. Entonces obviamente tenemos uno que está en sello de tiempo de 24 horas y el otro no es una marca de tiempo de doce horas y contiene un IM OPM. Entonces lo que puedo hacer es buscar AM o PM en una cadena. Y si eso existe, entonces sé que tengo este formato. Y si no existe, entonces sé que tengo este formato. Entonces solo puedo usar una simple declaración if para eso. Entonces solo te estoy presentando esto en STI o en función de cadena. Entonces lo que esto hace es que buscará dentro de una cadena para una cadena que definas. Y si lo que estás buscando sí existe dentro de esa cadena, entonces devolverá la posición en esa cadena como un entero. Y si no existe en la cadena, devolverá 0. Entonces quiero empezar por el personaje uno. Por lo que puedes empezar en cualquier punto de la cadena. Y la cuerda uno es lo que lo estás enviando, que será esto. cuerda dos es lo que busco. Busco que soy y no necesito suplir nada más. Ahora bien, si eso es mayor a 0, entonces tenemos yo estoy en la cuerda. Entonces, ¿qué pasa si tienes PM en la cuerda? Bueno, sólo podemos usar una declaración oral y usar lo mismo. O y tendremos otra condición también. Entonces si ingresamos esta porción de la declaración if, eso significa que tenemos este tipo de dieta. Y si ingresamos esta parte del estado de cuenta if, tenemos este tope de fecha. Entonces lo primero que queremos hacer ahora es dividir esta fecha por especias. Y esa fue una razón por la que me deshice de estas especias dobles para empezar. Se dan el lujo Voy a necesitar una nueva variable, una variable array. Y lo llamo SPL spice, así que se está dividiendo por espacio. Vamos SPL spice es igual a split. ¿ Qué estamos dividiendo con poner la cadena de plantilla? Y lo estamos dividiendo por espacio. Lo que eso significa ahora es que ahora tengo una matriz que debería tener tres filas. primera fila es esta porción de la fecha, la segunda fila es esta porción de la fecha, y la tercera fila es esta porción del día. Trabajemos primero en esta porción del sitio, que es la fecha física real. Entonces ahora lo que puedo hacer es dividirme por carácter de barra invertida, que luego me llevará con otra matriz. Esa es esta porción. Esta porción. Y esta porción suma va a necesitar otra variable de matriz. Y voy a copiar eso y voy a pegar eso aquí. Ahora, sé que la porción dydt va a existir en la primera fila, que es el 0 inferior en esa matriz. Entonces estoy usando split otra vez. ¿ Y qué me voy a dividir? Voy a dividir el espacio SPL. Y estoy usando la fila 0, que es la primera fila. Y el delimitador es una barras inclinadas hacia atrás. Entonces ahora en esto, sostendré tres filas. La primera fila es el día, segunda fila es el mes, y la tercera fila es la Gaea. A continuación, tratemos esta parte de la fecha, la hora. Y así sé que aquí tengo dos puntos y puedo separar eso por dos puntos. Y otro, este será el alfa y esos serán los minutos, y esos serán los segundos. Entonces yo sólo haré lo mismo aquí. Proporcionarle algunos corchetes. Y sé que el componente Tom existe en la fila dos, que es uno. Por lo que ahora puedo empezar a acoplar para dar fecha de lo que hemos separado de esta cuerda. Y voy a estar almacenando eso primero en una variable temp, que luego asignaré de nuevo a la variable de función, cual será devuelta de vuelta de la función. Por lo que sólo definimos eso ahora. Y ese top variable es un dite. Ahora les voy a presentar otra función a la que llamamos cereal de fecha. Y así lo que esto hace es convertir una fecha y podemos proporcionarle específicamente al mes Gaea un entero para que no tengamos que depender del cálculo de excel yankee. Entonces sé que el año está en matriz de barra invertida SPL, y sé que está en la tercera fila de esa matriz. Entonces el año está en SPL, contragolpe real, y está en R3, que es el ítem dos porque empieza en 0. Y recuerden, el mes también está en esa matriz, y eso está en la fila dos. Por lo tanto, abajo uno, terminar el día está en la primera fila. Apartado 0. Por lo que ahora tendré la fecha correcta almacenada como fecha en esta variable. Entonces ahora ¿qué pasa con la hora? Normalmente utilizaría una función similar a la fecha serial, que se llama cereal de tiempo. No obstante, la función serial de tiempo requiere un tiempo de 24 horas. Y desafortunadamente en este ejemplo, no tenemos un horario de 24 horas, pero eso en realidad está bien porque tenemos este componente del tinte a tiempo y tiene un yo soy y pm aquí. Sé que puedo enviar esto de manera confiable a una variable de fecha y tiene que convertir correctamente. Y eso es porque no tiene aquí nuestra muñeca de dietas europeas. Literalmente acaba de conseguir el tiempo con un IM y PM. Entonces solo crearé una variable que nos ayude a lidiar con eso ahora. Entonces chatarra que es igual. Por lo que normalmente en realidad estaba llamando esto. Por lo que normalmente estaría usando este componente aquí, pero en esta instancia, en realidad no necesito hacer eso. Entonces solo comentaré eso por ahora. Porque lo que voy a estar usando dentro de esta matriz es en realidad en formato de 12 horas. Y no puedo usar ese serial de acusación. Entonces, por tanto, sólo concatenaré unas cuerdas juntas para generar esto. Y voy a asignar eso a esta variable de fecha como espacio Beale. Y quiero la fila dos, que es una, porque me refiero a la matriz que está dividiendo la cuerda por especias, así que esa es la fila uno, y esto es R2. Y así solo estoy concatenando cuerdas aquí. Entonces lo que esto va a devolver es esto aquí. Y va a estar asignando eso a una variable de fecha. Entonces ahora es una simple cuestión de sumar estos juntos porque aquí tenemos una fracción, que es la fracción de un número entero que representa el die y el tiempo. Y entonces tenemos aquí un número entero que representa la fecha real. Por lo que simplemente puedo sumar estos juntos. Y tendremos un tiempo de fecha completa. Ahora volveré eso a una variable de función dos iguales. Y también funcionaré. Por lo que eso maneja esta fecha. Ahora hablemos de esta fecha. Entonces sé que esto contiene un espacio y puedo dividirlo por día y tiempo. Entonces solo voy a copiar este porque hicimos exactamente lo mismo. De igual manera, sé que tengo barras invertidas en mi componente de fecha, por lo que también puedo usar esto. Y sé que aquí tengo un valor de tiempo de 24 horas. Por lo que en realidad puedo usar mi división de colon ahora. Y ahora también puedo empezar a acoplar mis dietas. Entonces con esta fecha, similar a esta fecha, sé que es día, mes, año, así que en realidad puedo simplemente copiar eso directamente. Y aquí es donde empieza a diferir del anterior. Y van a usar cereal del tiempo, que es similar al cereal dydt para generar el valor del tiempo. De acuerdo, entonces lo primero que está pidiendo es alfa. alfa está en la primera fila, colon spiel, y es la primera fila, es decir 0. Y el minuto está en la fila dos. Y este dato arriba que tenía no contiene segundos, así que sólo voy a abastecer a 0. Por lo que ahora tenemos nuestra fracción de tiempo y también tenemos nuestra dieta como número completo. Por lo que sólo puedo sumarlos juntos. Y puedo devolver eso a una función. Y también quiero salir de la función aquí. De acuerdo, entonces vamos a probar esto. Simplemente voy a poner un punto de ruptura en el punto de entrada de una función. Y voy a copiar esta cadena de fecha aquí, la primera, y sólo voy a traer l Ventana Inmediata. Ahora, signo de interrogación, consigue fecha de string y voy a mandarle esa fecha. ¿Qué nos da? Oh, bien, eso está bien. Eso nos ha dado una función sabo no definida. Y eso es porque he escrito mal esto. Yo no controlaba el espacio. Contralora. Eso también significará que éste no es correcto porque lo copié desde arriba. ¿ Eso funciona? Sí. Está bien. Enfriar. Está bien. Entonces echemos un vistazo a esto aquí. Si vuelvo a saltar hacia abajo en la ventana inmediata, se puede decir signo de interrogación fecha de STI. Y está devolviendo la cuerda, lo cual es correcto. Y ahora sustituirá al doble espacio. Pero en esta instancia no tenemos que condimentar. Entonces como las cuerdas deben ser idénticas, si solo salto de nuevo hacia abajo en la Ventana Inmediata, will, deberíamos poder decir eso. Eliminemos, borremos esa línea para poder compararlos uno al lado del otro. Sí, idéntico. ¿ Verdad? Ahora lo que estamos esperando es que esto se salte esta afirmación if luego saltó hacia abajo a esta. Lo que sí. Está bien, eso está bien. Ahora nos estamos dividiendo por espacio. Entonces si ahora agrego esto a ver. Los contextos actuales están bien. De acuerdo, y en la ventana del reloj podemos ver ahora tenemos una cuerda dividida por especias. Entonces tenemos la primera fila que contiene la fecha real, y tenemos la segunda fila que contiene la hora. Eso es genial. Entonces de vuelta a nuestra ventana de código. Ahora se está dividiendo por barras inclinadas. Entonces vuelve a firmar, lo que voy a hacer es añadir un reloj. Y sólo me preocupan estos contextos lo cual es grande y no daña mi reloj, podemos decir que SPL barra invertida. Si abrimos eso, nos hemos dividido por barra invertida cambia el tinte en la fila uno, el mes en la fila dos, y el año en la fila tres. Perfecto. Sí, copia de seguridad a ventana de eco. Nos estamos dividiendo por colon. Y sólo voy a añadir un G9, voy a añadir un reloj. Y de nuevo, sólo están preocupados por estos contextos. Y podemos decir que tenemos el tiempo que responden que el nuestro, y tenemos el acta. Esta siguiente línea estamos utilizando la función serial con suministrada al año, que es 20-20. Y hemos suministrado en el mes que es julio. Y también hemos suministrado en el dique, que es el 21. Entonces si yo, si paso ese césped y un flotador por aquí, deberíamos ver es exactamente eso. El 21 de julio de 2020. De igual manera para esta fecha sello de tiempo al momento es de 12. Yo soy. Pero tenemos la función serial de tiempo lo estaba enviando nueve como las horas y lo estaba enviando 24 horas y minutos y estaba sentado a 0 es los segundos. Y como podemos ver, tenemos 924 yo soy. Y no segundos, lo cual es genial. Entonces ahora sólo puedo sumar estos dos juntos, lo que hará aquí. Podemos ver si pasamos por alto, decimos el 21 de julio, 20-20 a las 924 AM. Y luego asignaremos eso de nuevo a la variable de función para que podamos regresar eso hacia abajo a la Ventana Inmediata, golpear la función de salida. Y veremos que nos ha proporcionado la fecha y hora correctas. Está bien. Entonces solo eliminaré todo en la ventana inmediata y probaremos la otra fecha. Entonces solo voy a copiar este aquí y pegarle el signo de interrogación y lo escribo. Sí. Y tengo el soporte que una cuerda aquí y dentro del cuarzo y yo solo pegaré en eso. Y vamos a pegarle entrar. De acuerdo, entonces ahora estamos una vez más de nuevo en función. Lo primero que va a hacer es reemplazar las dos especias. Como podemos decir es que flotamos, pasamos por las especias entre la olla caliente y la olla del tiempo. Entonces ahora no sólo tenemos un espacio porque hemos sustituido dos caracteres por uno. Ahora esperamos que el código en esta parte de la declaración porque en la cadena tenemos AM o PM. Eso es genial. Sí, nos vamos a dividir por Spice y alfa saltó hacia abajo a la ventana de Watch. Todavía debe contener esos relojes. Agregamos la matriz de especias SPL contiene tres filas, lo cual es genial. Tenemos la fecha, tenemos la hora, y tenemos PM, y todos están almacenados como cadenas. A continuación, copia de seguridad en la ventana Código, voy a dividir el primer bote por barra invertida. Se puede decir que hemos dividido esa cadena por barra diagonal contraria. Entonces tenemos fuera día, mes y año. Excelente. Ahora voy a asignar eso a una variable de fecha usando serial. Lo hemos enviado el año, lo hemos enviado a mes. Nosotros hemos enviado en el día. Y sin embargo primero de julio de 2020. Y esta línea aquí es la línea más arriesgada en toda nuestra rutina. Y eso se debe a que estamos confiando en el cálculo de sobresaltos para convertir esta cadena en esta variable de fecha. Pero porque solo estamos hablando de un tiempo a nivel de confianza es extremadamente alto porque no tenemos ningún formato de fecha extraño de que preocuparnos. Entonces solo lo haré ahora si altura y deberíamos ver eso. Sí, 7058 PM. Genial. En realidad se ha convertido eso en un tiempo. Por lo que ahora sólo vamos a sumar esos dos juntos como lo hacemos nosotros. Y estoy regresando eso a la variable de función y saliendo de la función. Y deberíamos ver que aparecen en la ventana inmediata. Vete tú. Entonces eso es sólo un ejemplo rápido de cómo me ocupé de ese problema. Por lo que el primer paso fue analizar mis datos. Y noté que tenía uno de dos formatos de fecha. Y luego construí esta función que manejaba un uno de esos formatos. De acuerdo chicos, eso termina esta lección. Entonces en esta lección hablamos de cómo Excel almacena fechas y cómo fechas VB ay stores. Hablamos de los numerosos problemas que podrías encontrar con las dietas gracias al cálculo dydt de Excel. Y te acompañé a través de cómo hago para prevenir o minimizar estos temas. También te presenté un par de nuevas características y funciones de UVB I. El primero es la función Reemplazar, que es esencialmente exactamente la misma que fond y replace en Microsoft Word. Y también te presenté en string o un STR, que buscará una cadena en particular dentro de otra cadena. Y si existe, devolverá un número que representa qué número de carácter existe la cadena que estás buscando dentro del de una cadena. Y si no existe, devolverá 0. Y por último, también miramos el cereal de fecha y hora. Y eso nos permite especificar qué es el día y cuál es el mes, a diferencia de usar el método de cálculo predeterminado de Excel? Un tipo, chicos, mi nombre es Andrew. Gracias por verlo y nos vemos en el siguiente video. 8. 08: lección de VBA 15: formularios de usuario y experiencia del usuario: Bienvenido a la Lección 15, formularios de usuario e Introducción a la Experiencia del Usuario. En esta lección, solo quiero presentarte a construir formularios de usuario y proporcionarte un par de consejos de experiencia de usuario que ayudarán a hacer del uso de tus formularios una experiencia más convincente. Empecemos de nuevo en el IDE. Entonces lo primero que queremos hacer es que queremos agregar un formulario de usuario. Entonces voy a hacer clic derecho aquí en la ventana del proyecto. Y voy a seleccionar insertar y voy a seleccionar formulario USA, cual se puede ver ha mostrado el uso de ventana de diseño de formularios. Y esto es básicamente lo que se ve es lo que se obtiene editor. Entonces así es como diseñas tus formularios en esta vista aquí. Y notarás que también se trae aquí una pequeña caja de herramientas, que contiene todos los controles o al menos algunos de los controles que queremos estar usando. Ahora después de agregar mi formulario, la primera vez que vamos a hacer es que le voy a dar un nombre. Y para hacer eso, solo voy a traer la ventana de propiedades aquí arriba, y voy a llamar a esta f RAM underscore dirección nombre. Entonces ese es el nombre del objeto. Eso es lo que vamos a estar refiriendo a esta forma como en código, si RM subrayan nombre, dirección. Y también le voy a dar un título, que es lo que se muestra arriba en la parte superior izquierda de la ventana. Y así la propiedad de subtítulos aquí, va a cambiar eso. Y como puedes ver, se ha cambiado el texto que está en la leyenda de este uniforme. Entonces, ¿qué estamos tratando de hacer con esta forma? Lo que queremos hacer es capturar la entrada del usuario y luego poner eso en una hoja de cálculo. Y en una lección anterior, solo mencionaré Excel. Teníamos la ficha técnica de costos. Sólo voy a subir el fondo de eso para que podamos, para que podamos decir que la ficha de datos de costos y que tiene el nombre, apellido, ciudad y país. Y simplemente despreciar la sentencia porque esa es la fórmula que construimos la cual sólo consigue sentencia. Pero lo que quiero hacer es crear una forma que capture el nombre, apellido, ciudad y país, luego poblar eso en una nueva fila de esa hoja. Entonces pensando en lo que necesitaremos, vamos a necesitar cajas de texto. Y van a contener el nombre, el apellido, la ciudad y el país. También vamos a necesitar cuatro etiquetas para etiquetar cada uno de los libros de texto. Y eso para que el usuario sepa qué ingresar una edad de los cuadros de texto. Por último, vamos a necesitar un botón de guardar. Y el botón de citar luego va a ejecutar algún código que va a poblar lo que han entrado en la hoja de cálculo. Entonces sólo voy a minimizar eso y vamos a volver aquí. Entonces, ¿dónde está mi caja de herramientas aquí? Sí, así que primero lo primero, voy a añadir algunos cuadros de texto. Entonces cómo voy a hacer eso es desde la caja de herramientas, solo tienes que hacer clic en él y luego arrastrarlo a través del formulario en sí. Y yo sólo voy a arrastrar por cruz. No están alineados ni nada por el momento, eso está bien. Por ahora, también ajusta el tamaño usando un trackpad en este video para que la agilidad masiva sea bastante baja. Y también queremos añadir algunas etiquetas. Entonces, llevemos esto a través. Y voy a añadir algunas etiquetas. Y sólo voy a hacer un pequeño trackpad es molesto. Yo en realidad sólo incluso sólo el tamaño y luego copiar y pegar días. Por lo que copiar y pegar ve exactamente lo mismo, solo Control-C, Control-V. Primero lo primero que quiero hacer después de que hayamos agregado días es que les voy a dar una convención de nomenclatura. Por lo que me refiero a las convenciones de nomenclatura. Y cuando lleguemos al código, te mostraré por qué es muy útil usar una convención de nomenclatura. Por lo que empezaremos con unos cuadros de texto. Voy a llamarlos t, x t. Y el primero era de nombre. Yo soy el nombre de la escuela. Podría incluso darnos una etiqueta también. Lbl, FirstName, y le daré una leyenda. Sí. Y así es y le doy a eso una leyenda a ¿qué más tenemos? Teníamos nombre, apellido, ciudad y país. Genial. Así que vuelve a aquí, ciudad TXT y habrá LCD y dale a eso un subtítulo también. Y país TXT, dale a eso una etiqueta. Por lo que más adelante en el video, te explicaré más sobre la experiencia del usuario, pero solo quiero que pienses en esto, ¿verdad? Entonces, cuando estés diseñando tus formularios, piensa en el viaje del ratón y el viaje de los usos ojos. Entonces en el mundo real, definitivamente debes ver una etiqueta a la izquierda de un cuadro de texto. Pero cuando piensas en cómo la usas, digiere esa información, primero necesitan mirar la etiqueta y luego pasar al propio cuadro de texto. Entonces, teniendo eso en cuenta, realidad es mucho mejor. Simplemente voy a mover estos hacia abajo para poner la etiqueta directamente encima del propio cuadro de texto. Y eso hace que sea más fácil de usar. Es digerir porque simplemente pueden mirar hacia abajo la forma en lugar de mirar hacia la izquierda y luego a la derecha y luego a la izquierda y luego a la derecha y luego a la izquierda y luego a la derecha. Entonces solo haré eso por todos estos. Trae eso un poco más. También puedo ampliar el tamaño de cada uno de estos cuadros de texto ahí un poco pequeño el momento, así que solo podría hacer un poco más grande. Y ahora puedo hacer forma más pequeña. Y ahora vamos a agregar un botón de comando y eso es para activar el código que se ejecuta que toma lo que hay en el formulario y se rellena en la hoja. Pongámoslo ahí abajo. Otra vez. Voy a llamar a esto C y B y sólo ir a ahorrar. Y también le daré una leyenda. Seguro. Podría simplemente hacer que también el ancho de l cajas de texto. Retrayendo eso de nuevo. De acuerdo, así que ahora tenemos nuestra queja básica de diseño de formularios, y también tenemos convenciones de nomenclatura para nuestros controles. Y eso es muy útil como te mostraré ahora mismo. Entonces solo bajaré un poco esta ventana de propiedades. Entonces ahora voy a entrar en el módulo de código de este objeto, que es el objeto de forma. Por lo que tiene su propio módulo de código privado dentro de él. Entonces si solo voy a ver código, y ese es el módulo de código dentro de este formulario. Entonces lo siguiente es cómo asignamos código al evento siendo el clic del botón de citar. Entonces hay un par de formas de hacer esto. El primer camino te mostraré que el camino ACS. Por lo tanto, vuelve al diseño del formulario. Basta con hacer doble clic en eso. Y si selecciono esto y hago doble clic en el objeto, generará automáticamente un sub, un Sub Privado que atrapa el evento del click para que podamos ejecutar código al clic de ese. Entonces como puedes ver, tiene el nombre del botón de comando y luego también tiene el evento después de eso. Por lo que la otra forma es usar estos cuadros desplegables en la parte superior. Entonces como pueden ver, tenemos los controles que están en esa forma, que está dentro del objeto uniforme. Y si golpeo CMB save en el lado izquierdo , automáticamente crea click. Pero también hay en el lado derecho, un montón de otros eventos que podemos atrapar también. Entonces si hago doble clic en él, si se arrastran, etcétera, etcétera, dejémoslo con Click. Entonces lo primero que queremos hacer es uno de validar lo que el usuario ha ingresado. No quiero ingresar filas en blanco en nuestra hoja de trabajo. Eso en realidad es bastante importante cuando se está construyendo código basado en la información ingresada por el usuario que usted valida lo que el usuario ha ingresado. Entonces voy a hacer eso es que primero que nada voy a mirar los cuadros de texto y voy a medir la longitud del valor, que es lo que el usuario ha ingresado, y asegurarme de que realmente hayan ingresado texto en todos los campos. Por lo que en este caso, todos los campos sobre este ex obligatorio. Entonces déjame mostrarte cómo voy a hacer eso. Entonces primero voy a crear un objeto en blanco. Y este tipo es sólo un objeto que es un tipo de objeto genérico. Por lo que puedes asignarle prácticamente cualquier objeto. Y voy a usar este objeto dentro de un bucle for. Y ya hemos usado este tipo de folatos antes. Pero para explicación, lo que estamos haciendo es que estamos recorriendo todos los controles en la forma y cada iteración del bucle, se va a asignar el control actual a este objeto para que podamos interrogar a ese objeto y luego realizar alguna lógica sobre ella. Entonces detengamos eso para bucle. Por lo que el método controles del objeto formulario es una colección de controles. Por lo que sólo especificar controles será una colección de controles. Pero también se puede especificar un control individual suministrándolo en índice o nombre. Pero en esta instancia, sólo quiero la colección de controles. Y vamos a recorrer cada objeto en esa colección de controles. Ahora, dentro de esta colección de controles, contendrá todos los controles de este formulario. Por lo que incluirá las etiquetas, incluirá los cuadros de texto, incluirá el botón y cualquier otro control que haya agregado al formulario. Y esto es cuando las convenciones de nomenclatura son muy útiles. Entonces porque hemos nombrado todo sobre cajas de texto, TXT en la escuela, y luego el nombre del control. Sabemos que si el nombre del control comienza con TXT, Es un cuadro de texto. Por lo que sólo voy a añadir el siguiente. Entonces ese es nuestro bucle. Por lo que ahora voy a interrogar a los tres primeros personajes de cada uno de los controles. Estoy usando la izquierda como los primeros tres personajes. Por lo que ahora puedo interrogar la longitud del valor IA, lo que el usuario ha entrado en ese campo. Entonces si no han ingresado nada, entonces si la longitud de lo que han ingresado en el campo es 0. Y también quiero salir de la Sabah no quiero seguir si hemos llegado a este punto de la validación. Y el it es un cuadro de texto que no contiene una pieza de información porque todos los campos son obligatorios. Por lo que sólo haré un comentario rápido. Ellos son ciertos. Por lo que valido todos los campos. Por lo que ahora podemos empezar en el proceso de resolución. Por lo que pensar en lo que hará definitivamente necesitará el libro de trabajo y el objeto de hoja de trabajo. Por lo que sólo declararé esos. Y yo los pondré. Y sólo los voy a sentar después de la validación porque no quiero sólo desperdiciar recursos. Y la hoja que buscamos son datos de costos. Por lo que ahora quiero introducir la información en la hoja de trabajo. Entonces voy a confiar en el método de recuento de filas de rango usado de la propia hoja de trabajo. Pero voy a asignar eso a una variable o a un número. Entonces estoy usando un top largo aquí. Por lo que es un número entero sin decimal, pero potencialmente podría ser mayor a 32.5 mil. Y eso es porque en esta instancia, marchamos con el tiempo, tenemos un usuario en más de 32.5 mil filas. Y no quiero limitarlo a sólo 32.5 mil. Entonces en esta instancia voy a usar un largo y voy a asignar eso usando el método de recuento de filas de rango usado. Y así este método, usaron método de rango, punto ROS conteo de puntos nos va a devolver la fila actual que contiene la última pieza de información. Entonces en esta instancia nos va a devolver un seis porque seis es el último recuento de filas del rango usado. Pero debido a que queremos agregar los valores en el siguiente duro abajo, sólo estaré agregando uno a eso cuando una información de llenado en la hoja de trabajo. Entonces hagámoslo ahora. Ya lo hemos hecho muchas veces antes. Entonces x más uno. Entonces ese es el número de fila y la columna es uno. Y en realidad sólo voy a copiar y pegar estos temas seguros y conocí un montón de veces. Pero sólo voy a ajustar los números de las columnas. Y también voy a ajustar los controles reales ellos mismos. Apellidos. Ct. Entonces después de haber ejecutado estas líneas, hemos guardado ese registro en la hoja de trabajo. Y ahora también quiero restablecer el formulario. Entonces, en realidad solo voy a usar este método, que es un bucle completo. Y sólo voy a pasar por cada uno de los controles que empiezan con TXT y vamos a poner los valores a nada. Entonces me desharé de eso. Entonces vamos a probar esto ahora. Por lo que acabo de configurar una ventana que podamos ver la hoja de trabajo debajo para que podamos decirlo agregando a medida que vamos. Y traeré esto aquí abajo. Y volveré a saltar a la forma. Cierra por ahora. Jugar. De acuerdo, entonces antes que nada, probemos las validaciones. Si golpeo guardar, debería ver un cuadro de mensaje. Dice por favor ingrese cuadros de texto antiguos o valor en todos los cuadros de texto. Y tiene, vamos, he deletreado valoración correctamente. Y sólo vamos a entrar uno por uno. John. Sí. Y ahora deberíamos ver esta nueva fila poblada. Boom, ahí vamos. Eso está poblado una nueva fila en esa hoja de trabajo. Y también ha despejado todos los valores. Y eso es para que si golpeamos guardar varias veces seguidas, no lo haga en múltiples filas del mismo registro. De acuerdo, cierra eso. Ahora, trayendo esto de nuevo arriba, salta de nuevo al código. Sólo vamos a explicarlo una vez más. Entonces en un paso de validación, lo que estamos haciendo es primero agarrar la lista completa de controles en el formulario. Y en cada iteración de este for loop, asignamos el control actual a este objeto en blanco. Y luego estamos interrogando a ese objeto para ver si queda del nombre de ese objeto, o los primeros tres caracteres del nombre del objeto es TXT. Y luego si lo es, entonces estamos probando el valor, pero estamos probando la longitud del valor. Y si ese valor es 0, entonces si la longitud de lo que se ingresa en ese cuadro de texto es 0, entonces vamos a presentar al usuario un cuadro de mensaje y eso va a decir, por favor ingrese una mentira val. Esto cambia ese valor en todos los cuadros de texto. Y así entonces una vez que hayamos completado los pasos de validación con sentar el libro de trabajo y el objeto hoja de trabajo. Forma agarrando el recuento de filas de rango usado, que será, que fue de seis nota siete. Y entonces estamos poblando eso en la propia hoja. Y entonces estamos usando el mismo método de bucle foreach aquí abajo para borrar los valores de ese cuadro de texto para refrescar el formulario y permitir que el usuario ingrese otra cosa. Entonces ahora que tenemos los conceptos básicos bajo control, empecemos a hablar de algunos consejos de experiencia de usuario. Consejo número uno, mantener las cosas simples y Cape cosas inteligentes. Eliminar cualquier campo innecesario en el formulario. Usar lógica condicional. Entonces si necesitas un campo, pero solo necesitas ese campo en ciertas condiciones, establece su estado predeterminado en oculto y muéstralos mediante programación. Es mucho mejor para nosotros poner en el esfuerzo escribiendo código para manejar la complejidad con el fin de mantener las cosas simples para el usuario. Punta número dos, similar a la punta uno, usa la lógica condicional tanto como puedas para mantener las cosas inteligentes. Utiliza los muchos eventos que están a tu disposición. Atrapa el evento de que un usuario ingrese algo y luego haz algo en base a lo que haya ingresado. Un buen ejemplo de esto que puede haber visto que en el mundo real está en algunos formularios de captura de direcciones, los cuadros combinados estatales se llenan automáticamente en función del país que se selecciona. Entonces, por ejemplo, si digo que estoy en Australia en el formulario no me va a mostrar estados estadounidenses en el cuadro combinado estatal. Punta número tres. Es mejor multipaso tu captura de datos sobre múltiples formularios, luego hacer una forma enorme que abruma al usuario con la cantidad de datos que necesita ingresar. Si bien VBA se forma sobre construido para este concepto moderno, es bastante fácil implementar esto de una manera sin fisuras. Por ejemplo, puedes construir numerosas pantallas a través múltiples formas y luego cambiar entre las pantallas programáticamente, dando la ilusión de una sola forma. Para hacer esto de manera efectiva, necesitarás construir una rutina de transición que tome en consideración cosas como la posición de la pantalla. A lo que me refiero con esto es tomar las coordenadas x e y que representa donde se muestra la forma en pantalla. Y luego asigne eso a la forma dos para que la siguiente forma aparezca exactamente en el mismo lugar que la anterior. Simplemente proporciona la ilusión de que las múltiples formas son en realidad una forma que está cambiando dinámicamente. punta número cuatro, como se indica en el ejemplo práctico, te pone unas etiquetas de campo por encima del campo no alineado a la izquierda o a la derecha. Lo que esto hace es que simplifica la comprensión de usos de la forma. También proporciona menos puntos de fijación, i, j, los lugares que el usuario necesita buscar en el formulario. Sugerencia número cinco, agrupar los campos relacionados en grupos lógicos. Si está utilizando más de seis campos, agrupe los campos de entrada en secciones lógicas. Adicionalmente, la investigación sugiere que los grupos lógicos deben orientarse en columnas. Punta número seis, tamaño que campos apropiadamente. No hay nada peor que entrar texto en un campo que es demasiado pequeño para mostrar lo que están entrando en una línea. Por el contrario, parece realmente extraño introducir una pequeña cantidad de texto en unos enormes libros de texto. Punta número siete, asegúrese de que el índice de tabulación sea correcto para todos los controles del formulario. Esto permite a los usuarios navegar fácilmente por el formulario con la tecla Tab. Puede ver y establecer el índice de tabulación en la ventana de propiedades de cada control. Punta número ocho. Si bien Excel y VBA no lo hacen particularmente fácil, el uso de imágenes o iconos puede convertirte en un mucho más atractivo, de marca y profesional. Pero realmente hay que tener cuidado aquí. Debido a la plataforma de formularios VBA, uso de imágenes como reemplazo de otros controles puede tener resultados indeseables. Y eso se debe a que los controles de imagen son literalmente sólo objetos estáticos y no se comportan de la misma manera que otros controles. En una lección avanzada carta, te mostraré cómo usar correctamente las imágenes como controles. Por ejemplo, cómo obtener un efecto de desplazamiento sobre, y cómo obtener una imagen para deprimirla como un control de botón y otras animaciones de control. Entonces eso resume esta lección y la primera serie intermedia de principiante VBA a Ninja. Quiero agradecerles por ver mis clases. Si hay algo específico que te gustaría ver, por favor deja un comentario. Además, si hay algo que estés teniendo problemas con Eva con el curso o tu propio proyecto personal de VBA, por favor siéntete libre de contactarme. Siempre estoy feliz de ayudar. La siguiente serie de videos también será de contenido intermedio. No obstante, profundizaremos problemas más basados en escenarios que sin duda encontrarán en el mundo real. Mi nombre es Andrew. Espero que hayas disfrutado de este curso y te veré en la próxima serie de VBA, principiante a ninja.