Mostrando entradas con la etiqueta VBA. Mostrar todas las entradas
Mostrando entradas con la etiqueta VBA. Mostrar todas las entradas

Creando barra de progreso en UserForm paso a paso

Si bien es cierto las barras de progreso implementadas en nuestro proyecto VBA nos ayudan a informar al usuario final de cuánto tiempo va a demorar una rutina específica, PERO...esto es una carga adicional en memoria al momento de compilar y ejecutar dichos procesos.



Sin embargo, en casos excepcionales, como rutinas que pueden llegar a tardar muchísimo tiempo, lo cual puede dar la impresión al usuario final que Excel se ha quedado congelado y lo cierra de forma forzada, pues en esos casos sí es muy necesario crear una barra de progreso para informarle que la rutina está trabajando de forma normal y que pronto va a finalizar.

Pues en esta ocasión te traigo este paso a paso y lo sencillo y práctico que es, crear una barra de progreso la cual puedes adaptar a esas rutinas que suelen tardar mucho tiempo para cumplir con una tarea específica.

Puedes ver el vídeo a continuación...






Descarga el archivo base desde AQUÍ




Cómo crear Controles ActiveX en tiempo de ejecución
























Si bien es cierto el entorno VBA ya proporciona todos los controles ActiveX, solo para insertarlos en un UserForm y únicamente dedicarnos a realizarle la automatización requerida…. Sin embargo, también tenemos la posibilidad de crearlos en tiempo de ejecución... Sí, esto llevaría mayor trabajo, pero en ciertas circunstancias podríamos necesitar hacerlo de esa manera.

Ok, veamos cómo hacerlo...


Para este ejemplo únicamente insertaremos un UserForm en el entorno VBA...

















Y procedemos a insertar el siguiente código de programación en su evento Initialize 

Dim btn1 As MSForms.CommandButton
Dim btn2 As MSForms.CommandButton
Dim TextBox1 As MSForms.TextBox

    Set btn1 = Me.Controls.Add("Forms.CommandButton.1", "btn1")
    btn1.Caption = "Boton 1"
    btn1.Top = 15
    btn1.Left = 75

    
    Set btn2 = Me.Controls.Add("Forms.CommandButton.1", "btn2")
    btn2.Caption = "Botón 2"
    btn2.Top = 50
    btn2.Left = 75

    
    Set TextBox1 = Me.Controls.Add("Forms.TextBox.1", "TextBox1")
    TextBox1.Top = 100
    TextBox1.Left = 75
    
   
Ahora... para hacer funcionales estos controles, debemos crear un módulo de clase en donde definiremos cada uno de los eventos de dichos controles.

Te invito a que veas el vídeo completo, en donde te explico a detalle los pasos que debes seguir.

Ver vídeo AQUÍ











Creando Funciones UDFs para Excel desde Visual Basic.net Parte 3

Click para reproducir vídeo






















En la publicación anterior vimos cómo crear UDFs (User Defined Functions) para Excel desde Visual Basic.net





Sin embargo, en esa ocasión, dicho proyecto únicamente nos permite acceder a las funciones desde la interfaz de usuario y no desde el entorno VBA, lo cual es necesario, si tenemos que hacer desarrollos que contengan UserForms o algún procedimiento en particular.







En esta ocasión, retomaremos ese proyecto y lo modificaremos con el propósito de poder tener acceso a las UDFs desde el entorno VBA.

Recuerden que estamos utilizando la extensibilidad ExcelDna, lo cual es una contribución de terceros y es totalmente gratuita. Esta integración nos permite crear complementos que contengan UDFs, ya que Visual Studio de forma nativa no nos permite crear UDFs en los complementos que se desarrollan para Excel, por lo que tenemos que hacer uso de esta integración, que en el tutorial anterior vieron lo simple que es implementarlo.

Si bien es cierto, ya tenemos un Módulo público en donde tenemos todas las funciones, pero únicamente son accesibles desde la interfaz de usuario. Por lo que la clase que dejamos sin utilizar en nuestro proyecto, la modificaremos de tal forma que quedará de la siguiente manera:



























Además, modificaremos el archivo con extensión .dna, al cual le aplicamos unos pequeños cambios, lo que nos permitirá acceder a las funciones insertadas en la clase, que previamente debemos preparar para tal objetivo.







En la clase estamos identificando nuestro Add-In como "excelymas", que cuando ya nos encontremos en el entorno VBA y creemos el objeto para acceder a dicha clase, tendremos que identificarlo de esa forma.













Observa la rutina de testeo y lo simple que es crear la instancia a nuestro objeto "excelymas" y hacer la llamada a todas las funciones que tenemos almacenadas en nuestra librería.







A continuación te dejo dos paquetes ZIP para descargar; 1) El proyecto sin modificación, que únicamente se puede acceder a las funciones UDFs desde la interfaz de usuario, y 2) El proyecto ya modificado, con el cual ya podemos acceder a las funciones desde el Editor de Visual Basic de Excel.
El escenario utilizado para este ejemplo, es Excel con una arquitectura de 64 bits y Windows 10 Pro de 64 bits. No olvides que el paquete de Excel Dna, incluye soporte para 32 y 64 bits, por lo que debes tener cuidado, cuáles son los archivos que vas a utilizar de ese paquete


Proyecto sin modificar

Proyecto modificado


Espero que esta tutoría sea de tu interés, que si es así, te invito a compartirlo con un amigo o amiga.
Además, en los siguientes enlaces, puedes ver los vídeos de los capítulos anteriores en YouTube, junto con el vídeo más reciente sobre este tema.

Contenido en YouTube
Creando Funciones UDFs para Excel desde Visual Basic.net



Recursos necesarios:



Recuerda que en youtube.excelymas.com encontrarás mucho contenido de tu interés y totalmente gratuito.

Nos vemos en la próxima entrega.
¡Saludos cordiales!

Save and Retrieve Files from SQL Server using Excel VBA


Guardar y Recuperar Ficheros desde SQL Server usando Excel VBA























Cuando trabajamos en bases de datos, y dependiendo de la información que manejemos, así tendremos la necesidad de agregarle algún tipo de archivo que le dé una mayor descripción al registro almacenado.
Como por ejemplo si llevamos un control de inventarios, será muy útil tener la fotografía de cada uno de los productos. O si manejamos los datos del personal de la empresa, pues obviamente necesitaremos consultar la fotografía de cada empleado y así conocerlos a cada uno de ellos, no solo como un nombre en la base de datos, sino, poniendo un rostro a dicho nombre.

Pues bien… esta vez he creado una rutina que nos permite almacenar archivos en una tabla… pero no como documento adjunto… sino, como un archivo convertido en formato binario, lo cual nos da la flexibilidad de recuperar esa información, ya sea, en una red local, o desde una red remota.

Es un sencillo UserForm que consta de dos botones, con las rutinas necesarias para lograr nuestro objetivo.
















En el siguiente enlace encontrarás la primera transmisión que realicé en vivo y ahí vimos el funcionamiento de este proyecto, dando recomendaciones específicas de lo que debemos hacer, cuando tendremos que guardar ficheros en un servidor remoto de Microsoft Azure


emitido el 21 de Junio de 2017

En dicha transmisión vimos lo fácil que es recuperar ficheros desde un servidor remoto de Azure, los cuales se encuentran en un campo del tipo varbinary





















El siguiente Query es el que utilicé para crear la base de datos y la tabla correspondiente, haciendo uso de un Procedimiento Almacenado para realizar la inserción de cada registro.
La importación masiva de datos binarios desde un servidor remoto, la hace posible la función OPENROWSET y la instrucción BULK INSERT. Checa el quiery, y puedes ver la forma en que hago la inserción de un fichero en particular.
Copia y pega todo el script en una nueva consulta de tu servidor SQL y ejecútala.

Haz pruebas insertando ficheros de forma local mediante el procedimiento almacenado, pasándole los argumento que te solicita y verás lo simple que es. 

Checa la transmisión en vivo que realizamos según el enlace que te he dejado más arriba, y podrás ver la forma de hacerlo hacia un servidor remoto de Azure.

create database inventario
GO

use inventario
GO

create table archivos
(
id_archivo int identity primary key,
tipo_archivo varchar(4) not null,
descripcion varchar(100) not null,
fichero varbinary(max)
)
GO

CREATE PROCEDURE SP_AlmacenarArchivo
@TipoArchivo varchar(4),
@Descripcion varchar(100),
@Fichero varchar(max)
as
exec ( 'insert into archivos values(''' + @TipoArchivo + ''','''+ @Descripcion +''', 
(SELECT * FROM OPENROWSET(BULK N''' + @Fichero + ''', SINGLE_BLOB) as x));' );
GO

--Con esta línea hago una prueba de inserción de un registro mediante el procedimiento almacenado
exec SP_AlmacenarArchivo 'PDF','LISTADO DE PRODUCTOS POR COMPRAR', 'C:\img\inventario.pdf'



En la siguiente entrega en YouTube, realicé otra transmisión en vivo, en donde les entregué a los asistentes en primicia, el proyecto de Excel completo, el cual contiene las rutinas que gestionan los datos mediante código de programación VBA

emitido el 26 de Junio de 2017

El siguiente es el código de programación contenido en el UserForm que te mostré al inicio de este Post.

Cada rutina está insertada en su respectivo botón del Formulario.


Option Explicit

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

Dim RutaFichero As String
Dim TipoArchivo As String

Private Sub btnGuardaFichero_Click()
Dim FdBox As FileDialog
Dim Selection As Boolean
Dim sDescription As String


On Error GoTo Salir

If Me.btnGuardaFichero.Caption = "Seleccionar fichero" Then
        Set FdBox = Application.FileDialog(msoFileDialogFilePicker)

        FdBox.Filters.Clear
        FdBox.Filters.Add "Imágenes jpg", "*.jpg"
        FdBox.Filters.Add "Imágenes png", "*.png"
        FdBox.Filters.Add "Imágenes pdf", "*.pdf"
        FdBox.Filters.Add "Libro de Excel xlsx", "*.xlsx"
        FdBox.Filters.Add "Libro de Excel habilitado para macros xlsm", "*.xlsm"

        FdBox.FilterIndex = 1
        
        FdBox.AllowMultiSelect = False
        
        
        Selection = FdBox.Show

                If Not Selection Then
                    Exit Sub
                End If

        RutaFichero = FdBox.SelectedItems(1)
        TipoArchivo = RutaFichero
        TipoArchivo = Mid(TipoArchivo, InStrRev(TipoArchivo, ".") + 1, 4)
 
        Me.btnGuardaFichero.Caption = "Guardar fichero"
        Me.btnRecuperarFichero.Caption = "Cancelar"
        Me.lbl_Msg.Visible = True
        Me.lbl_Msg.Caption = "Fichero seleccionado: " & RutaFichero
        
        Exit Sub
End If


If Me.btnGuardaFichero.Caption = "Guardar fichero" Then
    sDescription = InputBox("Escriba una descripción para el fichero:")
    
    If sDescription = Empty Then
        MsgBox "Debe escribir una descripción para del fichero"
        Exit Sub
    End If
  
    If MsgBox("Seguro que desea guardar este fichero en la base de datos", vbYesNo + vbQuestion) = vbYes Then
        
        Conn.Execute "exec SP_AlmacenarArchivo '" & TipoArchivo & "','" & sDescription & "','" & RutaFichero & "'"
        
        MsgBox "Fichero almacenado en la tabla Archivos"
        Me.btnGuardaFichero.Caption = "Seleccionar fichero"
        Me.btnRecuperarFichero.Caption = "Recuperar fichero"
        
        Me.lbl_Msg.Visible = False
        Else
            Me.btnGuardaFichero.Caption = "Seleccionar fichero"
            Me.btnRecuperarFichero.Caption = "Recuperar fichero"
            
            sDescription = Empty
            Me.lbl_Msg.Visible = False
            Exit Sub
    End If
End If


Salir:
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If

End Sub

Private Sub btnRecuperarFichero_Click()
Dim sql As String
Dim idArchivo As String
Dim x As Long

On Error GoTo Salir

If Me.btnRecuperarFichero.Caption = "Cancelar" Then
    Me.btnGuardaFichero.Caption = "Seleccionar fichero"
    Me.lbl_Msg.Visible = False
    Me.btnRecuperarFichero.Caption = "Recuperar fichero"
    Exit Sub
End If


Set Rst = New ADODB.Recordset
Set stm = New ADODB.Stream

    idArchivo = InputBox("Escriba el ID del fichero a recuperar:")
    If idArchivo = Empty Then Exit Sub

sql = "SELECT * FROM archivos WHERE id_archivo=" & idArchivo

Rst.Open sql, Conn

stm.Type = adTypeBinary
stm.Open
stm.Write Rst("fichero").Value
TipoArchivo = Rst("tipo_archivo").Value

stm.SaveToFile "C:\Temp\Temp." & TipoArchivo, adSaveCreateOverWrite
    If TipoArchivo = "xlsx" Or TipoArchivo = "xlsm" Then
        Workbooks.Open Filename:="C:\Temp\Temp." & TipoArchivo
    Else
        x = ShellExecute(0, "Open", "C:\Temp\Temp." & TipoArchivo, vbNullString, vbNullString, 1)
    End If
    

Salir:
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If

End Sub

Private Sub UserForm_Initialize()
    Me.lbl_Msg.Visible = False
    Me.btnGuardaFichero.Caption = "Seleccionar fichero"
End Sub

En la segunda parte de esta emisión te doy explicación de cada una de las líneas que involucran el guardar y recuperar ficheros desde SQL Server.

Ya para finalizar este breve sondeo, te dejo los enlaces de descarga del Query y el proyecto de Excel completo. Y te invito a ver el contenido en YouTube para que tengas una mejor percepción de cómo trabaja el cliente de conexión de Excel.


Enlaces de descarga:



Si esta publicación te gustó, compártela con tus amigos... y te invito a que te suscribas a youtube.excelymas.com en donde encontrarás contenido audivisual totalmente gratuito.

Nos vemos en la próxima entrega.

¡Saludos!