sábado, 10 de marzo de 2012

Trabajar con colores

Tratar con los colores en Excel no es un asunto trivial, admito que es algo complicado, grabar una macro mientras se cambia el color en una celda u objeto solo genera confusión.
Ahora podemos acceder en un libro a una cantidad de colores prácticamente ilimitada  (16.777.216 colores), nadie puede conocer el valor de casi 17 millones de colores.
Podemos cambiar el color de la celda activa a verde utilizando la siguiente instrucción.

Sub colorVerde()
ActiveCell.Interior.color = 62280
End Sub

Una buena manera de cambiar los colores es especificar el color de acuerdo con sus componentes  rojo, verde y azul, el sistema de colores RGB.

El rango de cada uno de estos colores va desde el 0 al 255, por lo tanto el número total de colores posibles seria 256x256x256= 16.777.216 colores.

Para especificar los colores en VB mediante RGB utilizamos la función RGB que nos devuelve un número  que representa un valor de color.

Para representar el color del ejemplo anterior con RGB lo haríamos de la siguiente forma.

Sub colorVerde()
ActiveCell.Interior.color = RGB(0, 255, 0)
End Sub

La siguiente tabla muestra algunos colores estándar y sus valores de rojo, verde y azul:


Color
Valor de rojo
Valor de verde
Valor de azul
Negro
0
0
0
Azul
0
0
255
Verde
0
255
0
Cián
0
255
255
Rojo
255
0
0
Magenta
255
0
255
Amarillo
255
255
0
Blanco
255
255
255


El siguiente procedimiento nos muestra las 60 variantes de los colores de la paleta de colores (Colores del Tema).

Quedaría más, menos así:



Sub TemaColores()
  Dim r As Long, c As Long
  For r = 1 To 6
    For c = 1 To 10
        With Cells(r, c).Interior
        .ThemeColor = c
        Select Case c
            Case 1
            Select Case r
                Case 1: .TintAndShade = 0
                Case 2: .TintAndShade = -0.05
                Case 3: .TintAndShade = -0.15
                Case 4: .TintAndShade = -0.25
                Case 5: .TintAndShade = -0.35
                Case 6: .TintAndShade = -0.5
            End Select
        Case 2
            Select Case r
                Case 1: .TintAndShade = 0
                Case 2: .TintAndShade = 0.5
                Case 3: .TintAndShade = 0.35
                Case 4: .TintAndShade = 0.25
                Case 5: .TintAndShade = 0.15
                Case 6: .TintAndShade = 0.05
            End Select
        Case 3
            Select Case r
                Case 1: .TintAndShade = 0
                Case 2: .TintAndShade = -0.1
                Case 3: .TintAndShade = -0.25
                Case 4: .TintAndShade = -0.5
                Case 5: .TintAndShade = -0.75
                Case 6: .TintAndShade = -0.9
            End Select
        Case Else
            Select Case r
                Case 1: .TintAndShade = 0
                Case 2: .TintAndShade = 0.8
                Case 3: .TintAndShade = 0.6
                Case 4: .TintAndShade = 0.4
                Case 5: .TintAndShade = -0.25
                Case 6: .TintAndShade = -0.5
            End Select
        End Select
        Cells(r, c) = .TintAndShade
        End With
    Next c
  Next r
End Sub

Cells(x,x).Interior.TintAndShade
Devuelve o establece un valor que aclara u oscurece un color se escribir un número comprendido entre -1 (más oscuro) y 1 (más claro) para la propiedad TintAndShade; el cero (0) corresponde al valor neutro.

domingo, 4 de marzo de 2012

Suma Selectiva

En este post, hemos creado un procedimiento que pueda realizar una suma selectiva de acuerdo a una serie de condiciones. Por ejemplo, es posible que quieran sumar las cifras que han alcanzado el objetivo de ventas. 
Este procedimiento puede resumir los valores que estén por debajo o por encima de un valor dado.

Este procedimiento se iniciara cuando presionemos un botón creado en nuestra hoja, para insertar el botón nos vamos a la ficha programador insertar controles, en controles Activex presionamos en el icono del botón.


Lo pegamos donde nos sea mas accesible, seleccionamos el botón, presionamos sobre el botón derecho del ratón y en el cuadro de dialogo presionamos propiedades.

En el cuadro de propiedades seleccionamos la propiedad Caption y la cambiamos por el nombre que identifique la función del botón, por ejemplo Suma Selectiva.


Hacemos doble click sobre el botón y directamente nos sale el editor de VB con el evento predeterminado del botón que hemos creado, a este evento le añadimos nuestro procedimiento.

Private Sub CommandButton1_Click()
Dim rng As Range, i As Integer, a As Integer
Dim temporal, sumFallida, suma, valorLimite As Single
sumFallida = 0
suma = 0
valorLimite = 0
Set rng = Application.InputBox("Por favor seleccione el rango de calculo!", _
"SeleccionarRango", Selection.Address, , , , , 8)
On Error Resume Next
valorLimite = InputBox("Por favor establezca el valor limite!", "SeleccionarValor", , , 6)
a = rng.Count
    For i = 1 To a
            temporal = rng.Cells(i).Value
        Select Case temporal
        Case Is < valorLimite
            sumFallida = sumFallida + temporal
        Case Is >= valorLimite
            suma = suma + temporal
        End Select
    Next i
MsgBox "La suma de los valores menores de " & valorLimite & " es: " & Str(sumFallida) & vbCrLf & _
"La suma de los valores mayores de " & valorLimite & " es: " & Str(suma)
End Sub

Cerramos el editor y quitamos el modo diseño de la ficha programador, presionamos sobre el botón y si todo ha salido correctamente nos deberá de salir algo parecido a la siguiente imagen:



martes, 21 de febrero de 2012

El Objeto QueryTable

El Objeto QueryTable (Tabla de consulta) representa un rango de datos externos en una hoja de calculo, las fuente externas pueden provenir de un servidor de SQL, una base de datos de Microsoft Access o una consulta Web. 

El siguiente procedimiento crea una consulta web para importar una tabla específica.

Si copiamos el siguiente procedimiento en un modulo y le damos a ejecutar observaremos que se ha creado una tabla de datos automáticamente, procedente de la pagina web eleconomista, dicha tabla se actualiza automáticamente cada minuto.

Sub IBEX()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.eleconomista.es/indice/IBEX-35", Destination:=Range("$A$1"))
        .Name = "IBEX-35"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 1
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingRTF
        .WebTables = "3"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = True
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

Este procedimiento lo podemos dividir en tres partes principales, donde creamos la consulta con ActiveSheet.QueryTables.Add , las propiedades de la tabla importada donde indicamos con RefreshPeriod la periodicidad con la que queremos que se actualice la tabla desde la página web, y por ultimo las opciones de importar, que como parte importante tenemos la opción WebTables  donde indicamos el número de índice de tabla que queremos importar.


domingo, 12 de febrero de 2012

Eventos no asociados a Objetos

Cada objeto lleva asociados unos determinados eventos que le pueden ocurrir, por ejemplo a un botón o una hoja,  puede ocurrir que al activar la hoja  queramos que se produzca una determinada acción, este evento seria  Private Sub Worksheet_Activate(), al cual nosotros le añadiremos el código de lo que queremos que haga la aplicación cuando se active la hoja.

Los dos eventos que vamos a comentar no están asociados a un objeto. En su lugar se accede a ellos mediante métodos del objeto de Application.

Evento OnTime:

El evento OnTime  tiene lugar en una hora concreta en el futuro, lo que podemos utilizar para lograr la ejecución automática de macros de Excel, por ejemplo.

La siguiente instrucción ejecuta el procedimiento de Alarma a las 07:00 a.m. del próximo 14 de Febrero (día de los enamorados).

Sub Ejec_Alarma()
Application.OnTime DateSerial(2012, 2, 14) + TimeValue("07:00:00"), "Msg_Alarma"
End Sub

Mensaje de alarma..

Sub Msg_Alarma()
Dim n As Integer
For n = 1 To 20
Beep
Next n
MsgBox "Hoy es el día de los enamorados..", vbInformation, "ALARMA"
End Sub

Para cancelar el evento OnTime utilizaremos la siguiente instrucción.

Application.OnTime DateSerial (2012, 2, 14) + _
TimeValue("07:00:00"), "Msg_Alarma", , False

Evento OnKey:

El evento OnKey ejecuta un procedimiento específico cuando una tecla o combinación de teclas se pulsan.
A continuación os relaciono una matriz con los códigos que representa cada tecla en el teclado.


Clave
Código
RETROCESO
{RETROCESO} o {BS}
BREAK
{PAUSA}
CAPS LOCK
{} BLOQ MAYÚS
CLEAR
{CLEAR}
SUPR o DEL
{DELETE} o {DEL}
FLECHA ABAJO
{DOWN}
FIN
{END}
ENTER (teclado numérico)
{ENTER}
ENTER
~ (tilde)
CES
Salir} o {ESC}
AYUDA
{AYUDA}
INICIO
{HOME}
INS
{INSERT}
FLECHA A LA IZQUIERDA
{Left}
BLOQ NUM
{BLOQ NUM}
PÁG
{} PGDN
PÁG
{} PGUP
REGRESAR
{Return}
FLECHA A LA DERECHA
{Derecha}
SCROLL LOCK
{} ScrollLock
TAB
{TAB}
FLECHA ARRIBA
{UP}
F1 a F15
{F1} a través {F15}

También se pueden especificar en combinación con las teclas SHIFT , CTRL y ALT.

Para combinar con las teclas
Precede el código clave por
SHIFT
+ (signo más)
CTRL
^ (acento circunflejo)
ALT
% (signo de porcentaje)

Pegue las siguientes instrucciones en un módulo:

Sub DemoOnKey()
      Application.OnKey "{TAB}", "Message"
End Sub

Sub Message()
    MsgBox "Hola"
End Sub

Vemos que al pulsar el tabulador se ejecuta el mensaje.

domingo, 5 de febrero de 2012

Forzar Cierre

Los procedimientos que se relacionan a continuación son complementos que puedes utilizar en cualquier código realizado por ti, de modo que cuando el procedimiento se complete, se apague automáticamente tu sistema.

En suma, es una muy buena aplicación que nos puede ayudar de muchas maneras. 

El comando shutdown permite a un usuario apagar un equipo desde la línea de comandos de Windows (cmd),  los argumentos son los siguientes:


Sin argumentos
Mostrar este mensaje (lo mismo que -?)
-I
Mostrar interfaz GUI, debe ser la primera opción
-L
Cierre la sesión (no se puede utilizar con la opción-m)
-S
Apagar el equipo
-R
Apagar y reiniciar el equipo
-Una
Anular el apagado del sistema
-M \ \ equipo
El equipo remoto para apagar / reiniciar / cancelar
-T xx
Ajuste de tiempo de espera de apagado en xx segundos
-C "comentario"
Comentario de apagado (máximo de 127 caracteres)
-F
Fuerza el cierre de aplicaciones sin previo aviso
-D [u] [p]: xx: yy
El código de motivo de apagado
u es el código de usuario
p es un proyecto de código de parada
xx es el código de las principales razones (entero positivo menor que 256)
yy es el código secundario del motivo (entero positivo menor que 65536)


Este comando lo utilizaremos en nuestro código con distintas combinaciones para forzar a nuestro sistema al cierre, al igual que utilizamos shutdown también podríamos utilizar cualquier otro comando del cmd, esto lo dejo a vuestra imaginación...


Sub ApagarPC()
      ActiveWorkbook.Save
      Application.DisplayAlerts = False
      Application.Quit
      Shell "shutdown -s -t 02", vbHide
End Sub


Sub ReiniciarPC()
      ActiveWorkbook.Save
      Application.DisplayAlerts = False
      Application.Quit
      Shell "shutdown -r -t 02", vbHide
End Sub


Sub ForzarPC()
      ActiveWorkbook.Save
      Application.DisplayAlerts = False
      Application.Quit
     Shell "shutdown -r -f -t 02", vbHide
End Sub


Espero que os sea de utilidad…..