Còdigo VisualBasic embebido en planillas Excel

Còdigo VisualBasic embebido en planillas Excel

En consecuencia a un comentario que se hizo en una nota anterior,  donde consultaron la forma de colocar código visual en una planilla de cálculo, es que surgió esta nota.

Se sabe que la planilla Excel es una poderosa herramienta que tiene un sinfín de utilidades, aplicaciones y facilidades. Tradicionalmente solo se utiliza un mínimo del poder de trabajo que tiene esta aplicación, pero a partir de la integración que ha hecho Microsoft con todos sus software, es que podemos insertar sentencias Visual Basic en planillas Excel de una manera bastante sencilla, potenciando aún más la planilla y dando un poder de programación casi sin limites. Con esto no se está queriendo decir que la planilla de cálculo reemplaza un proyecto desarrollado en Visual, pero si es posible darle mucha mas libertad de resolución a los datos vertidos sobre una hoja de cálculo.

Como primer paso, debemos habilitar la ejecución de macros, esto lo hacemos en el menú HERRAMIENTAS -> MACRO -> SEGURIDAD, aquí colocamos nivel medio o bajo para que al abrir la planilla nos pida autorización de habilitar las macros y ejecutarlas(si se pone nivel medio o directamente ejecutarlas si se colocó nivel bajo).

Un segundo paso es tener la barra Visual Basic, que la tendremos activa si en el menú VER -> BARRA HERRAMIENTAS, tenemos tildada esa barra, de esta manera podremos contar con herramientas de Visual Basic para agregar en nuestra planilla.

El último paso es armar la planilla en sí misma, para nuestro ejemplo(como se ve en la figura que tenemos por sobre estas líneas), tenemos una planilla en donde agregamos un BOTON(desde la barra de visual) el cual activará la ejecución del código visual que tipeamos. Para agregar dicho código, debemos entrar en la opción HERRAMIENTAS->MACRO->EDITOR DE VISUAL BASIC, aquí se nos abrirá el editor para comenzar a tipear el código fuente que queremos se ejecute, vale aclarar que en caso que grabemos una macro, la misma se verá como un módulo dentro del proyecto, o como en nuestro ejemplo que directamente lo tenemos sobre la planilla, cuando entramos directamente desde el editor.

Nuestro ejemplo es algo muy sencillito,  una planilla, un Botón(Ejecutar) y si escribimos la palabra “Hola”en la celda A1, al ejecutar el código se desplegará un mensaje(MsgBox de visual) mientras que si no está escrita esta palabra, dirá que no escribimos “Hola”, quedando siempre ubicado en la celda A1, luego de ejecutarse. A continuación dejamos el código fuente.

La idea de esta nota fue presentar el tema y dar una alternativa de cómo poder hacerlo, seguramente permite el debate y la exposición de otras ideas y aportes que pueden resultar de utilidad para todos.


8 Responses

  1. walter dice:

    hola queria preguntarte que como puedo hacer para unir dos textbox a uno solo en Private Sub WORKSHEET_BEFOREDOUBLECLICK(ByVal TARGET As Range, Cancel As Boolean)

    Private Sub WORKSHEET_BEFOREDOUBLECLICK(ByVal TARGET As Range, Cancel As Boolean)

    Application.ScreenUpdating = False
    Application.ScreenUpdating = False

    Cancel = True
    Cancel = True

    If Not Intersect(TARGET, Range(“D33:D5001,” – “,G33:G5001″)) Is Nothing Then

    TextBox1.Text = ActiveCell.Text
    TextBox2.Text = ActiveCell.Text

    Range(“D30″).Value = WorksheetFunction.Match(TextBox1.Text, Sheets(“CLIENTES1″).Range(“B3:B5001″), 0)
    Range(“J40″).Value = WorksheetFunction.Match(TextBox2.Text, Sheets(“CLIENTES1″).Range(“G3:G5001″), 0)

    ActiveSheet.PivotTables(“Tabla dinámica1″).PivotFields(“NAME”).ClearAllFilters
    ActiveSheet.PivotTables(“Tabla dinámica1″).PivotFields(“NAME”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=”"

    ActiveSheet.PivotTables(“Tabla dinámica3″).PivotFields(“NAME”).ClearAllFilters
    ActiveSheet.PivotTables(“Tabla dinámica3″).PivotFields(“NAME”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=”"

    Columns(30).ColumnWidth = 20.29
    Columns(40).ColumnWidth = 20.29

    TextBox1.Activate
    TextBox2.Activate

    End If

    End Sub

    Private Sub WORKSHEET_Change(ByVal TARGET As Range)

    Application.ScreenUpdating = False
    Application.ScreenUpdating = False

    On Error Resume Next
    On Error Resume Next

    If Not Intersect(TARGET, Range(“D30″)) Is Nothing Then
    If Not Intersect(TARGET, Range(“G30″)) Is Nothing Then

    If Range(“D30″).Text “” Then
    If Range(“J40″).Text “” Then

    TextBox1.Text = WorksheetFunction.VLookup(Range(“G30″), Sheets(“CLIENTES1″).Range(“D3:N5001″), 2, False)
    TextBox2.Text = WorksheetFunction.VLookup(Range(“J40″), Sheets(“CLIENTES1″).Range(“G3:N5001″), 7, False)

    ActiveSheet.PivotTables(“Tabla dinámica1″).PivotFields(“NAME”).ClearAllFilters
    ActiveSheet.PivotTables(“Tabla dinámica1″).PivotFields(“NAME”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=”"

    ActiveSheet.PivotTables(“Tabla dinámica3″).PivotFields(“NAME”).ClearAllFilters
    ActiveSheet.PivotTables(“Tabla dinámica3″).PivotFields(“NAME”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=”"

    Else

    TextBox1.Text = “”
    TextBox2.Text = “”

    End If

    Columns(30).ColumnWidth = 20.29
    Columns(40).ColumnWidth = 20.29

    Range(“D30″).Select

    Range(“J40″).Select

    End If
    End If
    End If

    End Sub

    • Marcelo Luques dice:

      Hola Walter, gracias por tu consulta. No entiendo el sentido que tiene unir dos Textbox….Si quisieras unir dos mensajes en todo caso, luego de producido el segundo mandaría un textbox indicando ambos errores…….Un cordial saludo.

  2. walter dice:

    esque estan en dos filas diferentes y busvcan nombres de dos paises y quiero ocupar la misma funcion para las dos

    • Marcelo Luques dice:

      Bien Walter y si cargas los valores en variables y luego utilizas el carácter de concatenación(“&”) para desplegar el mensaje con los valores? Gracias nuevamente.

  3. walter dice:

    ESQUE SON DOS WORKSHEET_BEFOREDOUBLECLICK(ByVal TARGET As Range, Cancel As Boolean)

    PERO ME SALE QUE HAY UN NOMBRE AMBIGUO
    Y NO PUEDO HACER QUE FUNCIONEN LOS DOS WORKSHEET_BEFOREDOUBLECLICK(ByVal TARGET As Range, Cancel As Boolean)

  4. walter dice:

    ME AN DICHO QUE PUEDO OCUPAR UN Worksheet_Activate()
    PARA QUE ME FUNCIONE PERO NO SE COMO SE USA ESTA PALABRA

    • Marcelo Luques dice:

      Walter yo tampoco he usado esta función. Las veces que he tenido algo similar lo he solucionado según te sugerí en otras respuestas. Cordialmente, marcelo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© VB-MUNDO – Visual Basic y mucho más
CyberChimps