VBA

PROGRAMACIÓN ORIENTADA A OBJETOS  (OOP) CON VBA.
((nota: con F1 del Excel se pueden obtener mucha ayuda sobre este lenguaje.))

NOTA: EN EL COPIA PEGA HAY QUE MODIFICAR LAS COMILLAS " Y ALGUNAS COMAS POR PUNTOS. 


1.-PROGRAMACIÓN ORIENTADA A OBJETOS:
• VBA  simplemente  manipula  OBJETOS,  y  cada  producto  (Excel, Word, Access, PowerPoint y demás) posee un modelo de objeto único propio.
• Por ejemplo EXCEL expone varios OBJETOWS de análisis de datos muy potentes  como:  las  hojas  de  cálculo,  gráficos,  tablas  dinámicas, escenarios  y  numerosas  funciones  matemáticas,  financieras  y temas generales. Con VBA se puede trabajar con estos objetos y diseñar procedimientos automatizados.



2.- CLASES.OBJETOS.PROPIEDADES Y MÉTODOS:
- OBJETOS:  Son las instancias de una "clase". Combinación de código y datos que se pueden tratar como una unidad, por ejemplo, un control, un formulario o un componente de una aplicación. Cada objeto se define por una clase.

Cuando en el mundo real nos referimos a objeto significa que hablamos de algo abstracto que puede ser cualquier cosa. Por ejemplo podemos referirnos a OBJETOS  como coche, silla, casa, etc.

Cuando decimos que la CLASE COCHE representa a todos los coches del mundo significa que define como es un coche, cualquier coche. Es decir, en el argot informático, la clase coche define algo que tiene: cuatro ruedas, un motor, un chasis,... entonces, cualquier objeto real de cuatro ruedas, un motor, un chasis,... es un objeto de la clase coche.

Libros, hojas, rangos, rectángulos, ...son OBJETOS de Excel.
WorkSheet (OBJETO HOJA de cálculo)
Rang(OBJETO CELDA o rango de celdas).
Los objetos están definidos por una CLASE, que son los moldes para crear un objeto: Math, Time, etc. son CLASES en Excel.

Cualquier objeto tiene características o propiedades como por ejemplo el color, la forma, peso, medidas, etc. Estas PROPIEDADES se definen en la clase y luego se particularizan  en  cada  objeto.  Así,  en  la  clase  coche  se  podrían  definir  las propiedades Color, Ancho y Largo, luego al definir un objeto concreto como coche ya se particularizarían estas propiedades a, por ejemplo, Color = Rojo, Ancho = 2 metros y Largo = 3,5 metros.

 Entre las propiedades de un objeto Range están VALUE, que contiene el valor de la celda, 0 también las propiedades COLUMN Y ROW que contienen respectivamente la fila y la columna de la celda, Font que contiene la fuente de los caracteres que muestra la celda, etc.

Range, como objeto, también tiene MÉTODOS, recordemos que los métodos sirven llevar a cabo una acción sobre un objeto. Por ejemplo el MÉTODO ACTIVATE, hace activa una celda determinada, CLEAR, borra el contenido de una celda o rango de celdas, COPY, copia el contenido de la celda o rango de celdas en el portapapeles.

Para referenciar EL OBJETO de una celda se usa la instrucción RANGE: 
Workbooks("libro1").worksheet("hoja1").Range("A1")
Y para referenciar una de sus PROPIEDADES, como el valor de la celda A1:

WorkSheets(“Hoja1”).Range(“A1”).Value=12345
Y para referenciar un MÉTODO como borar el contenido de un conjunto de celdas:
Range (“A1:C3”).ClearContents


Excel es un objeto llamado Applcation y contiene otros objetos como WorkBook y CommandBar. El objeto WoorkBook puede contener otros objetos como WorkSheet y Chart. Un objeto WoorkSheet puede contener objetos como Range, PivotTable y demás. Todo ello jerarquizado y separado mediante un punto.

- OBJETOS DE OBJETOS: Es muy habitual que una propiedad de un objeto sea otro objeto. Siguiendo con el coche, una de las propiedades del coche es el motor, y el motor es un objeto con propiedades como caballos, número de válvulas, etc. y métodos como aumentar_velocidad, coger_combustible, etc.
En Excel, el objeto WorkSheets tiene la propiedad Range que es un objeto, Range tiene la propiedad Font que es también un objeto y Font tiene la propiedad Bold (negrita). Hay que tener muy presente esto porque utilizaremos propiedades de un objeto que serán a su vez objetos. Dicho de otra forma, hay propiedades que devuelven objetos, por ejemplo, la propiedad Range de un objeto WorkSheet devuelve un objeto de tipo Range.



3.-EL EDITOR DE VBA:
  1. -Presionar ALT+F11 o
  2. -Seleccionar HERRAMIENTAS>MACRO>EDITOR DE VISUAL BASIC o
  3. -Hace clic sobre el botón EDITOR DE VISUAL BASIC, sitiado en la barra de herramientas de Visual Basic
El Editor de Visual Basic está compuesto de varias VENTANAS:
  • Barra de MENÚS
  • Barras de HERRAMIENTAS
  • Explorador de PROYECTOS. Presenta un diagrama de árbol que contiene cada libro de trabajo que está actualmente abierto en Excel. Cada libro de trabajo es un proyecto. Si esta ventana no está abierta hay que presionar CONTROL+R.     Y para esconder la ventana, hay que hacer clic en el botón Cerrar de su narra de título.
  • CÓDIGO. Una ventana de código, o ventana de módulo, contiene un código VBA. Cada elemento de un proyecto tiene asociada una ventana de código. Para visualizar una ventana de código para  un objeto, hay que hacer doble clic sobre el objeto en la ventana del Explorador de proyectos.
  • Ventana INMEDIATO. Esta ventana es útil para ejecutar instrucciones de VBA directamente, probar las instrucciones y limpiar el código. Para abrir esta ventana presione CONTROL+G, para ocultarla basta hacer clic sobre el botón Cerrar de su barra de título.


4.-CÓDIGO. MÓDULOS. PROCEDIMIENTOS. FUNCIONES.
Las  acciones  de  VBA  se  realizan  mediante  la  ejecución  del CÓDIGO VBA. El código VBA se escribe (o se graba) y se guarda en un MÓDULO DE  VBA. Un módulo sirve para agrupar procedimientos y funciones. El procedimiento y la función son entidades de programación que sirven para agrupar instrucciones de código que realizan una acción concreta.

Los módulos se guardan en un libro de trabajo de Excel pero se editan o visualizan en el editor de Visual Basic. Para insertar un nuevo módulo: programador>insertar módulo>"módulo1".
En propiedades se puede cambiar su nombre (caption).

Para añadir un nuevo MÓDULO de VBA a un proyecto, hay que seleccionar el nombre del proyecto en la ventana Explorador de proyectos y seleccionar INSERTAR MODULO. 
Para quitar un módulo hay que seleccionar el nombre del módulo en la ventana del Explorador de proyectos y elegir ARCHIVO QUITAR.

En general una ventana de código puede soportar cuatro tipos de código:

  • PROCEDIMIENTO SUB: Conjuntos de instrucciones que ejecutan alguna acción.
  • PROCEDIMIENTO FUNCTION: Es un conjunto de instrucciones que devuelven un solo valor.
  • PROCEDIMIENTO PROPERTY: Son procedimientos especiales que se usan en módulos de clase.
  • DECLARACIONES: Es información acerca de una variable que se le proporciona aVBA.

Un solo módulo de VBA puede guardar cualquier cantidad de procedimientos Sub, procedimientos Function y declaraciones.

Un módulo VBA se compone de PROCEDIMIENTOS. Un procedimiento es un bloque de instrucciones de código que sirven para llevar a cabo alguna tarea específica. Un procedimiento empieza siempre con la instrucción Sub Nombre_Procedimiento y termina con la instrucción End Sub.

Un PROCEDIMIENTO es básicamente un código de ordenador que realiza alguna acción sobre los objetos o con ellos.

Sub Prueba() 
Sum= 1+1
MSGBox “La respuesta es” & Sum
End Sub

FunctionProperty y Sub son todos tipos de procedimientos. Las FUNCTION devuelven un valor y son llamadas desde un procedimiento previamente definido. Mediante la ventana inferior de "inmediato" se puede ver el resultado del código rápidamente para depurar errores (los procedimientos se escriben directamente con enter y las funciones con ?funcion(parámetros)).  Las funciones también quedan definidas en fx de la hoja de cálculo.


Un procedimiento FUNCTION devuelve un solo valor. Se puede llamar una función desde otro procedimiento VBA o usar una fórmula de hoja de cálculo.

Function  AñadirDos(arg1, arg2)
 AñadirDos= arg1 + arg2
End Function


Function Promedio(n1,n2)
  p=(n1+n2)/2
End Function


Exit Function. Opcional. Una instrucción que fuerza una salida inmediata del procedimiento Function antes de su conclusión formal.End Function. Requerido. Indica el final del procedimiento function

EJECUCION DE UNA FUNCIÓN DESDE UN PROCEDIMIENTO:

Function SumaMatriz (matriz() As Integer)
   Dim i As Integer , suma As Integer suma = 0
   For i = LBound(matriz) To UBound(matriz)
        suma = suma + matriz(i)
   Next
   SumaMatriz = suma
End Function
Sub LlamarSumaMatriz() 
   Dim mat(5) As Integer
   Dim SumaTotal As Integer
    mat (1) = 4: mat (2) = 5: mat (3) = 8: mat(4) = 1: mat(5) = 2
    SumaTotal = SumaMatriz(mat)
    MsgBox "La suma de la matriz es: " & SumaTotal
End Sub



Escribamos ahora un procedimiento Sub  llamado Hola y ejecutémoslo
Para ejecutar el procedimiento Hola es necesario asegurarse que el cursor está situado en cualquier parte del texto introducido. Después se puede optar por uno de los siguientes métodos:

  • Presionar F5, o
  • Seleccionar Ejecutar, Ejecutar Sub/UserForm, o
  • Hacer clic sobre el botón Ejecutar, Ejecutar Sub/UserForm

Sub Hola()
Msg = “Su nombre es “ &Application.UserName & “?” 
Ans = MsgBox(Msg, vbYesNo)
If Ans = VbNo Then
MsgBox “No se preocupe”
 Else
End If
End Sub


5.-LAS MACROS:
Otra forma de programar en VBA es usando el GRABADOR  DE MACROS.
Cuando se graba una macro, Excel inserta automáticamente un módulo VBA para contener el código grabado.
• Las macros ayudan en la Automatización de tareas repetitivas. Algunas de las entradas de datos y formatos que realiza en Microsoft Excel pueden ser repetitivas. Por ejemplo, podría diseñar la mayoría de sus hojas con las mismas cabeceras básicas, o formatear todas sus cabeceras de la misma forma. En lugar de ejecutar la misma secuencia de tareas una y otra vez, puede crear una macro.
• Una macro consta de una serie de instrucciones escritas en el lenguaje VBA. Aunque para crear algunas macros no es necesario conocer el lenguaje VBA.

Para ello se utiliza la opción HERRAMIENTAS MACRO GRABAR NUEVA MACROS.
 Las macros se pueden grabar:
•  En el libro activo, para que tengan vigencia solo en ese libro.
• En un libro nuevo
• En el libro de macros personal para que tenga vigencia siempre que se abre Excel

El siguiente ejemplo muestra la forma de grabar una macro que simplemente cambia la configuración de página de orientación vertical a horizontal. Esta secuencia de comandos generará por sí solo los  códigos necesarios para este procedimiento (a veces  el código generado por este procedimiento es excesivo)
1) Activar una hoja de cálculo del libro activo
2) Seleccionar el comando HERRAMIENTAS MACRO GRABAR NUEVA MACRO
3) Hacer cli en Aceptar para aceptar las opciones predeterminadas
4) Seleccionar el comando ARCHIVO CONFIGURAR PÁGINA
5) Seleccione la opción Horizontal y haga clic en Aceptar
6) Haga clic en el botón detener grabación
Sub Macro1()
' Macro1 Macro
' Macro grabada el 15/11/00 por PRI00
With ActiveSheet.PageSetup
.Orientation = xlLandscape
End With
End Sub


6.-LAS VARIABLES:
Un lugar de almacenamiento con nombre que puede contener cierto tipo de datos que puede ser modificado durante la ejecución del programa. Cada variable tiene un nombre único que la identifica dentro de su nivel de ámbito. Puede especificar un tipo de datos o no.
Nombres de variable deben comenzar con un carácter alfabético, deben ser únicos dentro del mismo ámbito, no deben contener más de 255 caracteres y no pueden contener un punto o carácter de declaración de tipo.
El propósito principal de VBA es manipular datos. Algunos residen en objetos tales como rangos de hojas de cálculo. Otros se guardan en las variables que se crean.
Una variable es una localización de almacenamiento con nombre, dentro de la memoria del ordenador.
Los tipos de datos son: byte (1byte: 0 a 255), boolean (2 bytes: v/f), integer (2bytes: -32768 hasta 32767), long (4bytes: +/-2147483648)), single (4bytes), single(8bytes),date, ob jetc, string.

VARIABLES LOCALES/PÚBLICAS. Una variable local es una variable declarada dentro de un procedimiento. Estas variables se pueden usar sólo en el procedimiento en que se declararon. Cuando el procedimiento finaliza, la variable deja de existir y Excel libera su memoria.
El ámbito de una variable puede ser :  un procedimiento (bajo las instrucciones DIM, Static o Private), a nivel módulo (con DIM antes del primer procedimiento de un módulo), o para todos los módulos (con la instrucción Public antes del primer procemiento de un módulo).

Ejemplo de variables locales:
Sub MiSub()
DIM x As Integer
DIM First As Long
DIM InerestRate As Single
DIM TodaysDate As Date
DIM UserName As String * 20
´Aquí se sitúa el código del procedimiento
End Sub

Declarar constantes.
Las constantes se declaran usando Const.
Const NumTrim As Integer = 4
Const Interés = 0.05, Periodo = 12
Const Nombre Mod as String = “Macros Presupuestos”
Public Const NombreApp As String = “Aplicación Presupuestos”

LAS CADENAS
Existen dos tipos de cadenas en VBA:
Cadenas de longitud fija, que se declaran con un número específi co de caracteres. La máxima longitud es de 65.536 caracteres.
Cadenas de lingitud variable, que teóricamente pueden tener hasta 2.000 milones de caracteres.
Dim MiCadena As String * 50
Dim SuCadena As String

LAS FECHAS
Dim Hoy As Date
Dim HoraInicio As Date
Const PrimerDía As Date = #1/1/2001# Const MedioDía As date = #12:00:00#

ASIGNACIÓN
Una expresión de asignación es una instrucción de VBA que realiz a evaluaciones matemáticas y asigna el resultado a una variable o aun objeto.
VBA usa el signo igual “=“ como operador de asignación.
x = 1
 x = x + 1
x = (y * 2) / (z * 2)
FileOpen =  true Range(“Año”). Value = 1995

LOS OPERADORES MATEMÁTICOS
+ Suma, - Resta, * Multiplicación, / División, \ División entera, Mod Resto, ^ exponencial, & Concatenación

LOS OPERADORES COMPARATIVOS
= Igual, < Menor, > Mayor, <= Menor o igual, >= Mayor o igual, <> Distinto

LOS OPERADORES LÓGICOS
Not (negación lógica, And (conjunción lógica), Or (disyunción lógica), XoR (exclusión lógica), Eqv (equivalencia en dos expresiones), Imp (implicación lógica)



LAS MATRICES (ARRAYS)
Una matriz es un grupo de elementos del mismo tipo que tienen un nombre común; para referirse a un elemento específico de una matriz se usa el nombre de la matriz y un número de índice.
Se puede declarar una matriz con DIM o Public como cualquier variable.
DIM MiMatriz(1 To 100) As Integer
DIM MiMatriz (100)
MiMatriz(1) = 20
DIM MiMatriz(1 To 100, 1 to 10) As Integer MiMatri z(1,2) = 20

LAS VARIABLES DE OBJETO
Una variable de objeto es una variable que representa un objeto entero, como puede ser un rango o una hoja de cálculo.
Las variables de objeto son importantes por dos razones:
•Pueden simplificar el código y Pueden hacer que el código se ejecute más de prisa.
Se declaran con DIM o Public.

Por ejemplo, la expresión siguiente declara AreaEntradaDatos como un objeto Range. Para ver como simplifican el código, veamos un ejemplo sin usar variables de objeto:
Sub VarSinObj();
Worksheets(“Hoja1”).Range(“A1”).Value = 124
Worksheets(“Hoja1”).Range(“A1”).Font .Bold = True
Worksheets(“Hoja1”).Range(“A1”).Font . Italic = True
End Sub
Esta rutina introduce un valor en la celda A1 de la HOJA1, del libro de trabajo activo, y después aplica Negrita y cursiva a su contenido. Para reducir el código se puede condensar la rutina con una variable de objeto.
Sub VarObj();
Dim MiCelda As Range
Set Micelda = Worksheets(“Hoja1”).Range(“A1”)
MiCelda.Value = 124
MiCelda.Font .Bold = True
MiCelda.Font . Italic = True
End Sub





7.-SENTENCIAS Y FUNCIONES HABITUALES:
  • Option Explicit:  esta instrucción obliga a definir todas las variables que se vayan a usar en el programa.
  • Dim...As [Integer,Double,String,Boolean...]:  Es una instrucción que sirve para definir una variable perfectamente. Si no se usa no pasaría nada pero se utilizaría una mayor cantidad de memoria de la necesaria, con el tipo genérico de Value.El ámbito de una variable determina el módulo y el procedimiento en el que se puede usar una variable. Con las instrucciones Dim, Static o Private dentro del procedimiento se declaran para establecerse dentro de un procedimiento.Con Dim antes del primer procedimiento para establecer la variable dentro de de un módulo. Y para todos los módulos se usará Public antes del primer procedimiento de un módulo. Para las variables locales, se deberán declarar dentro del módulo con DIM, de esta forma cuando el procedimiento finaliza esa variable deja de existir y se liberaliza esa parte de memoria. Las variables estáticas (Static) son un caso especial. Se declaran a nivel de procedimiento y retienen su valor después de que el procedimiento finaliza
  • If ...Then....Else....: Es una estructura de control  que hace que se ejecuten una serie de instrucciones siempre y cuando se cumpla una determinada condición. Cuendo  se utiliza una condición dentro de otra se dice que  es un anidamiento de condiciones. 
Sub Positivos()
a = InputBox("Ingrese un número") If a > 0 Then
MsgBox "Número Positivo"
End If
End Sub

Sub Positivos_Negativos()
a = InputBox("Ingrese un número")
if a > 0 Then MsgBox "Número Positivo" Else _ MsgBox "Número negativo"
End Sub

Sub Positivos_Negativos_Cero()
a = InputBox("Ingrese un número") If a > 0 Then
MsgBox "Número Positivo" ElseIf a < 0 ThenMsgBox "Número negativo "
ElseIf a = 0 Then
MsgBox " Cero " End If
End Sub

Sub Descuento()
MsgBox IIf(Range("A1") = 0, "Cero", "Distinto de Cero")
End Sub


  • Select Case...: Es una estrucura de control que hace que se ejecuten unas eeterminadas instrucciones según  el  tipo de condición que se cumpla. Es un  caso de múltiples condiciones, para evitar repertir muchos IF. Dependiendo del valor de una expresión condición a cumplir, podrá o no ejecutarse una  serie de instrucciones.
Sub Positivos_Negativos_Cero()
  a = InputBox("Ingrese un número")
  Select Case a
           Case Is > 0
                 Msg = "Número Positivo" 
          Case Is < 0
               Msg = "Número negativo"
          Case Else
              Msg = "Cero" End Select MsgBox Msg
End Sub


Sub Descuento1() 
Cantidad = InputBox("Introducir cantidad: ") Select Case Cantidad
Case "": Exit Sub
Case 0 To 24: Descuento = 0.1Case 25 To 49: Descuento = 0.15
Case 50 To 74: Descuento = 0.2
Case Is >= 75: Descuento = 0.25
End Select
MsgBox "Descuento: " & Descuento
End Sub



  • For ...To...Next: Es una  estrucura de control que hace repetir unas instrucciones un número determinado de veces hasta agotar el intervalo de acumulación del contador que le hayamos establecido.La cuenta se puede especificar con STEP. Es necesario usar variables para la acumulación y éstas deberán ser diferentes en el caso de bucles anidados. 
Sub SumaNúmeros
   Sum = 0
  For Count = 0 To 10
       Sum = Sum + Count
   Next Count
   MsgBox Sum
End Sub



Sub SumaNúmerosPares
Sum = 0
For Count = 0 To 10 Step 2
      Sum = Sum + Count
Next Count
MsgBox Sum 
End Sub


Sub BuclesAnidados
Dim MiMatriz (1 To 3, 1 To 3) 
For i = 1 To 3
  For j = 1 to 3
    MiMatriz (i,j) = 2
   Next j
Next i
End Sub



  • Do  While...Loop: Es una estructura de control que hace repetir unas instrucciones un número indefinido de veces mientras que se cumpla una determinada condición. En esta ocasión para que el bucle se inicie por primera vez es necesario que la condición se cumpla previamente. Puede ocurrir  que ni siquiera se inicie el bucle. Es este tipo de bucles es necesario declarar y asignar un valor a las variables del contador, previamente.
Mienrtras la celda esté vacía va desplazandose hacia abajo y asigando el valor 0.
Sub DoWhileDemo()
   Do While IsEmpty(ActiveCell) 
   ActiveCell. Value = 0
  ActiveCell.Offset (1, 0).Select
Loop
End Sub


  • Do Until... Loop: Es una estructura de control que hace repetir  unas instrucciones un número indefinido de veces hasta que una condición llegue a ser True. Hay que tener cuidado en poner claramente el contador que delimite cuando debe salir del bucle, de lo contrario se puede quedar sin salida. 
Sub DoUntilDemo() Do
ActiveCell. Value = 0
ActiveCell.Offset (1, 0).Select
Loop Until Not IsEmpty (ActiveCell) 
End Sub


  • With: Es una estructura de control que permite ejecutar una serie de instrucciones sin necesidad de recalificar un objeto, es decir, sobre le mismo objeto cada vez. 
Sub CambiarFuente()
With Selection.Font
.Name = “Times New Roman”
.FontStyle = “ Bold Italic”
.Size = 12
.Underline = xlSingle
.ColorIndex = 5
End With
End Sub

  • InputBox("Dime un número"): Es una instrucción que se usa para a través de un mensaje popup poder introducir datos para su posterior  uso en el programa.
  •  MsgBox("Hola"): Es una salida de texto utilizando una ventaja de mensajes del tipo popup. Vemos como el siguiente procedimiento lee el valor de la cenda A1 y representa su contenido en una ventana de mensaje tipo MsgBox.
Sub LecturaValorCelda()
   MsgBox Worksheets("Hoja1").Range("A1").Value
End Sub
  • Application.Max(Rango): Aplicación que calcula el valor máximo de un  rango de celdas. 
  • Selection.Interior.ColorIndex=34: es un código que daría a al celda activa un valor determinado de grado de color. 
  • Selection.Interior.Pattern=xlsolid: es un código que daría a al celda activa un valor determinado formato de texto.





DESARROLLO DE EJEMPLOS EN EL EDITOR DE VBA:

1.- "Hola Mundo".

REM Mi primer procedimiento HolaMundo
Sub MiPrimerProcedimiento
  Range("A1").Value = "Hola"
End Sub



En este caso podríamos haber puesto lo siguiente (es más larga pero especifica todos los objetos afectados):

WorkSheets(1).Range("A1").Value = "Hola"

O también si queremos hacer referencia a la hoja activa:

ActiveSheet.Range("A1").Value = "Hola"


O si se quiere poner en la hoja activa de la celda activa:
ActiveSheet.ActiveCell.Value = "Hola"

Y si quisieramos toda la jerarquía completa:

Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"


2.- "Hola Mundo" con un BOTÓN.
 



Primero activamos en Excel:
Archivo>Opciones>MásFrecuentes>VisualizarProgramador.

Después:
Insertar>ActiveX>Botón
Es necesario activar la opción de Excel de "Controloes de ActiveX", ya que de esta forma se podrá cambiar el color y otras opciones del propio botón.

Seleccionamos dentro de los procedimientos de Controles de ActiveX el botón y modificamos su código a:

Private Sub CommandButton_Click()
 Hoja1.Cells(1,1)="Hola Mundo"
End Sub


 2.b.- "Hola Mundo" recursivamente...con un BOTÓN.
Ahora modificaremos el código para que aparezca el texto en la misma celda de forma recursiva tantas veces comos se pulse el botón:

Private Sub CommandButton_Click()
 Hoja1.Cells(1,1)=Hoja1.Cells(1,1)+"HOLA"
End Sub


Y por último, modificarmos el cógido para que aparezca el código en varias celdas en diagonal sucesivas:

Private Sub CommandButton1_Click()
Dim i As Integer
Dim j As Integer
Hoja1.Cells(1, 1) = "BIENVENIDO"
  For i = 2 To 8
     For j = 1 To i
          If ((i + j) Mod 2) = 0 Then
              Hoja1.Cells(i, j) = Hoja1.Cells(1, 1)
          End If
     Next j
  Next i
End Sub


3.- REPRESENTACIÓN DE SERIES.
(en este caso te pedirá grabar la macro con un nombre)

Vamos a representar LA SERIE DE FIBONACCI: a(n+2)=a(n+1)+a(n)

Private Sub CommandButton1_Click()
Hoja1.Cells(1, 1) = Int(Rnd() * 10)
Hoja1.Cells(2, 1) = Int(Rnd() * 10)
i = 1
Do While i < 21
  Hoja1.Cells(i + 2, 1) = Hoja1.Cells(i + 1, 1) + Hoja1.Cells(i, 1)
  Hoja1.Cells(i, 1).Select
  i = i + 1
Loop
End Sub



Y lo mismo pero con un poco de color:

Private Sub CommandButton1_Click()
Hoja1.Cells(1, 1) = Int(Rnd() * 10)
Hoja1.Cells(2, 1) = Int(Rnd() * 10)
i = 1
Do While i < 21
Hoja1.Cells(i + 2, 1) = Hoja1.Cells(i + 1, 1) + Hoja1.Cells(i, 1)
Hoja1.Cells(i, 1).Select
With Selection.Interior
.ColorIndex = Int(Rnd() * 10)
.Pattern = xlSolid
End With
i = i + 1
Loop
End Sub




4.- NÚMERO PRIMO
Private Sub CommandButton1_Click()
Dim valor As Integer
valor = InputBox("Dime un número:")
Dim primo As Boolean
If EsPrimo(valor) Then MsgBox ("Es PRIMO") Else MsgBox ("No es primo")
End Sub

Function EsPrimo(x) As Boolean
 Dim n As Integer
 EsPrimo = True
 n = 2
 Do While EsPrimo And n <= Sqr(x)
 If (x Mod n = 0) Then
 EsPrimo = False
 End If
 n = n + 1
 Loop
End Function




5.-COORDENADAS POLARES CON BOTÓN:

Private Sub CommandButton1_Click()
Hoja1.Cells(1, 1) = "Coordenada x:"
Hoja1.Cells(2, 1) = "Coordenada y:"
If Hoja1.Cells(2, 1) <> "" And Hoja1.Cells(2, 2) <> "" Then
c1 = Hoja1.Cells(1, 2)
c2 = Hoja1.Cells(2, 2)
d = c2 / c1
hipotenusa = Sqr((c1 ^ 2) + (c2 ^ 2))
alfa = Atn(d) * (180 / 3.141516)
Hoja1.Cells(1, 3) = "Argumento:"
Hoja1.Cells(1, 4) = hipotenusa
Hoja1.Cells(2, 3) = "Ángulo:"
Hoja1.Cells(2, 4) = alfa
End If
End Sub




EJEMPLOS SENCILLOS:

CÓDIGO ESCRITO EN EL CUADRO DE CONTROL (ACTIVEX)

REM pregunta (con asignación)
 Sub Pregunta()
    Dim suNombre As String
    suNombre = InputBox("¿Cómo se llama?")
    MsgBox "Su nombre es " & suNombre
End Sub

REM pregunta (con la instrucción de asignación SET para objetos)
Sub DarFormato()
Dim miCelda As Range
Set miCelda = Worksheets("Hoja1").Range("A1")
    With miCelda.Font
        .Bold = True
        .Italic = True
    End With
End Sub



REM Celda con texto y formato
Sub Segundo
ActiveSheet.Range("A1").Value = "Hola"
ActiveSheet.Range("A1").Font.Bold = True
ActiveSheet.Range("A1").Font.Color = RGB(255,0,0)
End Sub

REM Rango con texto y formato
Sub Segundo_b
 ActiveSheet.Range("A1:A8").Value = "Hola"
ActiveSheet.Range("A1:A8").Font.Bold = True
ActiveSheet.Range("A1:A8").Font.Color = RGB(255,0,0)
End Sub

REM Introdución de texto
Sub Entrar_Valor
Dim Texto As String
 ' Chr(13) sirve para que el mensaje se muestre en dos Líneas
Texto = InputBox("Introducir un texto " & Chr(13) & "Para la celda A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Texto
End Sub

REM Introducción de texto sin usar variables
Sub Entrar_Valor
ActiveSheet.Range("A1").Value = InputBox("Introducir un texto " & Chr(13) & "Para la celda A1", "Entrada de datos")
End Sub


REM Introducción texto y elección celda
Option Explicit
Sub Entrar_Valor
Dim Celda As String
Dim Texto As String
Celda = InputBox("En que celda quiere entrar el valor", "Entrar Celda")
 Texto = InputBox("Introducir un texto " & Chr(13) & "Para la celda " & Celda , "Entrada de datos") ActiveSheet.Range(Celda).Value = Texto
End Sub

REM Sumar
Option Explicit
Sub Sumar()
Dim Numero1 As Integer
Dim Numero2 As Integer
Numero1 = InputBox("Entrar el primer valor", "Entrada de datos")
Numero2 = InputBox("Entrar el primer valor", "Entrada de datos")
Range("A1").Value = Numero1 + Numero2
End Sub

REM Suma
Sub suma()
 s = 4 + 6
 MsgBox "la suma es:" & s
End Sub


REM Hola en un rango
Sub obj()
Dim R As Range
Set R = ActiveSheet.Range("A10:B15")
R.Value = "Hola"
R.Font.Bold = True
End Sub

REM Hola con condicional
' Declara un procedimiento llamado ObtenInformacion
' Este procedimiento Sub no acepta argumentos
Sub ObtenInformacion()
' Declara una variable de cadena llamada respuesta
Dim respuesta As String
' Asigna el valor que devuelve la funcion InputBox a la variable respuesta
respuesta = InputBox(Prompt:="¿Cómo se llama?")
        ' Instrucción condicional If...Then...Else
    If respuesta = Empty Then
        ' Llama a la función MsgBox
        MsgBox Prompt:="No ha escrito su nombre."
    Else
        ' Función MsgBox concatenada con la variable respuesta
        MsgBox Prompt:="Su nombre es " & respuesta
        ' Fin de la instrucción If...Then...Else
    End If
        ' Fin del procedimiento Sub
End Sub



REM Descuento
Sub Condicional()
ActiveSheet.Range("A1").Value = 0
' Poner las celdas donde se guardan los
valores 0.
ActiveSheet.Range("A2").Value = 0
ActiveSheet.Range("A3").Value = 0
ActiveSheet.Range("A1").Value = Val(InputBox("Entrar el precio", "Entrar"))
' Si el valor de la celda A1 es mayor que 1000, entonces, pedir descuento
If ActiveSheet.Range("A1").Value > 1000 Then
ActiveSheet.Range("A2").Value = Val(InputBox("Entrar Descuento", "Entrar"))
End If
ActiveSheet.Range("A3").Value = ActiveSheet.Range("A1").Value - _
ActiveSheet.Range("A2").Value
End Sub


REM Descuento2
Option Expl icit
Sub Condicional()
Dim Precio As Integer
Dim Descuento As Integer
Precio = 0
Descuento = 0
Precio = Val(InputBox("Entrar el precio", "Entrar"))
' Si el valor de la variable precio es mayor que 1000, entonces, pedir descuento
If Precio > 1000 Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
End If
ActiveSheet.Range("A1").Value = Precio
ActiveSheet.Range("A2").Value = Descuento
ActiveSheet.Range("A3").Value = Precio – Descuento
End Sub


REM descuento3
Sub Condicional_Else()
Dim Precio As Single
Dim Descuento As Single
Precio = 0
Precio = Val(InputBox("Entrar el precio", "Entrar"))
' Si el valor de la variable precio es mayor que 1000, entonces, aplicar
descuento del 10%
If Precio > 1000 Then
Descuento = Precio * (10 / 100)
ActiveSheet.Range("A2").Value = 0,1
Else ' Sino ? Aplicar descuento del 5%
End If
Descuento = Precio * (5 / 100)
ActiveSheet.Range("A2").Value = 0,05
ActiveSheet.Range("A1").Value = Precio
ActiveSheet.Range("A3").Value = Descuento
ActiveSheet.Range("A4").Value = Precio - Descuento
End Sub


Sub Condicional_Else2()
ActiveSheet.Range("A3").Value = AvtiveSheet.Range("A1").Value - _
ActiveSheet.Range("A2").Value
If ActiveSheet("A3").Value < 0 Then
Else
End If
End Sub
ActiveSheet.Range("A3").Font.Color = RGB(255,0,0)
ActiveSheet.Range("A3").Font.Color = RGB(0,0,255)



Sub Condicional()
If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value Then
Else
End If
End Sub
ActiveSheet.Range("A3").Value = "Los Valores de A1 y A2 son iguales"
If ActiveSheet.Range("A1").Value > ActiveSheet.Range("A2").Value Then
Else
ActiveSheet.Range("A3").Value = "A1 mayor que A2"
ActiveSheet.Range("A3").Value = "A2 mayor que A1"
End If





REM DESCUENTO CONDICIONAL
Sub Ej12()
Dim Producto As String
Dim Cantidad As Integer
Dim Precio As Single
Dim Total As Single
Dim Descuento As Single
Dim Total_Descuento As Single
Producto = InputBox("Entrar Nombre del Producto", "Entrar")
Precio = Val(InputBox("Entrar el precio", "Entrar"))
Cantidad = Val(InputBox("Entrar la cantidad", "Entrar"))
Total = Precio * Cantidad
ActiveSheet.Range("A1").Value = Producto
ActiveSheet.Range("A2").Value = Precio
ActiveSheet.Range("A3").Value = Cantidad
ActiveSheet.Range("A4").Value = Total
' Si total mayor que 10.000 y el producto es Patatas, aplicar descuento.
If Total > 10000 And Producto = "Patatas" Then
End If
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
Total_Descuento = Total * (Descuento / 100)
Total = Total - Total_Descuento
ActiveSheet.Range("A5").Value = Total_Descuento
ActiveSheet.Range("A6").Value = Total
End Sub





Sub Ejemplo_13()
Dim Producto As String
Dim Cantidad As Integer
Dim Precio As Single
Dim Total As Single
Dim Descuento As Single
Dim Total_Descuento As Single
Precio = 0
Producto = InputBox("Entrar Nombre del Producto","Entrar")
Precio = Val(InputBox("Entrar el precio", "Entrar"))
Precio = Val(InputBox("Entrar la cantidad", "Entrar"))
Total = Precio * Cantidad
ActiveSheet.Range("A1").Value = Producto
ActiveSheet.Range("A2").Value = Precio
ActiveSheet.Range("A3").Value = Cantidad
ActiveSheet.Range("A4").Value = Total
If Total > 10000 Or Producto = "Patatas" Then
End If
Descuento = Val(InputBox("Entrar Descuento", "Ent rar"))
Total_Descuento = Total * (Descuento / 100)
Total = Total - Total_Descuento
ActiveSheet.Range("A5").Value = Total_Descuento
ActiveSheet.Range("A6").Value = Total
End If
End Sub





Sub Ejemplo_14()
Dim Precio As Integer
Dim Descuento As Integer
Precio = 0
Descuento = 0
Precio = Val(InputBox("Entrar el precio", "Entrar"))
' Si el valor de la variable precio NO es menor igual 1000, entonces, pedir
descuento
If Not (Precio <= 1000) Then
End If
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
ActiveSheet.Range("A1").Value = Precio
ActiveSheet.Range("A2").Value = Descuento
ActiveSheet.Range("A3").Value = Precio - Descuento
End Sub




Sub Ejemplo_15()
Dim Signo As String
Dim Valor1 As Integer, Valor2 As Integer, Total As Integer
Valor1 = ActiveSheet.Range("A1").Value
Valor2 = ActiveSheet.Range("A2").Value
Signo = ActiveSheet.Range("B1").Value
Total=0
If  Signo = "+" Then
End if
Total = Valor1 + Valor2
If  Signo = "-" Then
End if
Total = Valor1 - Valor2
End if
If  Signo = "x" Then
End if
Total = Valor1 * Valor2
If Signo = ":" Then
End if
Total = Valor1 / Valor2
ActiveCell.Range("A3").Value = Total
End Sub


REM FACTORIAL (usando la recursividad, solo permitida en estos casos)
Function Factorial(N)
    If N <= 1 Then        ' Se ha llegado al fin de las llamadas recursivos.
        Factorial = 1    ' (N = 0) abandona las llamadas.
    Else                    ' Llama nuevamente a Factorial si N > 0.
        Factorial = Factorial(N - 1) * N
    End If
End Function




EJEMPLO: Comisión condicional
Una primera forma de hacerlo en excel sería esta:

=si(Y(A1>00,A1<=9999,99),A1*0,08, si(Y(A1>=10000,A1>=19999,99),A 1*0,105, si(Y(A1>=20000,A1<=39999,99),A1*0,12, si(A1>=40000,A1*0,14,0))))
Pero resulta demasiado larga y compleja de entender... lo mejor sería hacerlo por código:

Function Comision(Ventas)
Const porcentaje1 = 0.08
Const porcentaje2 = 0.105Const porcentaje3 = 0.12
Const porcentaje4 = 0.14
Select Case Ventas
   Case 0 To 9999.9: Comision = Ventas * porcentaje1
   Case 1000 To 19999.9: Comision = Ventas * porcentaje2
    Case 20000 To 39999.9: Comision = Ventas * porcentaje3
    Case Is >= 40000: Comision = Ventas * porcentaje4
End Select
End Function

Sub CalcComm()
   sales = InputBox("Introducir Ventas: ")
   MsgBox "La comisión es: " & Comision(sales)
End Sub