viernes, 25 de noviembre de 2011

23. DATOS VINCULADOS PARA LA GESTIÓN DE ALUMNOS – Control Docente

INSTRUCCIONES
He desarrollado para demostración un sistema de control de Alumnos mal llamado “Control Docente”. Este Libro Gestiona la inscripción, inserta nuevos alumnos y controla la asistencia, prácticosexámenes y entrega la Nota Final. Ordena los alumnos por Curso, Apellido Paterno, Apellido Materno.
Private Sub CommandButton1_Click() ‘Boton Insertar Alumno Nuevo
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Dim fil As Long: Dim col As Long: Dim nro As Integer
  Me.TextBox1.SetFocus
  nro = 1
  fil = [B8].Row
  col = [B8].Column
  If ([B8] <> "") Then
    Do While (Cells(fil, col).Value <> "")
      fil = fil + 1
      nro = nro + 1
    Loop
  End If
  Call copiarFila("asistencia", fil, 32, nro)
  Call copiarFila("practicos", fil, 33, nro)
  Call copiarFila("examenes", fil, 31, nro)
  Call copiarFila("notasFinales", fil, 11, nro)
  Call ordenar("notasFinales", fil, 9)
  Call ordenar("examenes", fil, 28)
  Call ordenar("practicos", fil, 28)
  Call ordenar("asistencia", fil, 28)
  UserForm1.Hide
  Call limpiarFormulario
  With Worksheets("notasFinales")
    .Range("G8").FormulaLocal = "=SIERROR(REDONDEAR(Asistencia!AE8*K$2;0);0)"
    .Range("H8").FormulaLocal = "=SIERROR(REDONDEAR(Practicos!AF8*K$3;0);0)"
    .Range("I8").FormulaLocal = "=SIERROR(REDONDEAR(Examenes!AC8*K$4;0);0)"
    .Range("G8:I8").AutoFill Destination:=Range(Cells(8, 7), Cells(fil + 1, 9)), Type:=xlFillDefault
  End With

  Worksheets("Asistencia").Select
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub
Private Sub copiarFila(hoja As String, fil As Long, col As Long, nro As Integer)
  Dim miRango As String
  Worksheets(hoja).Activate
  Worksheets(hoja).Range(Cells(fil, 2), Cells(fil, col)).Copy Destination:=Range(Cells(fil + 1, 2), Cells(fil + 1, col))
  Application.CutCopyMode = False
  Cells(fil, 2).Value = nro
  Cells(fil, 3).Value = StrConv(TextBox3.Text, vbProperCase)
  Cells(fil, 4).Value = StrConv(TextBox4.Text, vbProperCase)
  Cells(fil, 5).Value = StrConv(TextBox2.Text, vbProperCase)
  Cells(fil, 6).Value = StrConv(TextBox1.Text, vbProperCase)
End Sub
Private Sub limpiarFormulario()
  TextBox1.Text = ""
  TextBox2.Text = ""
  TextBox3.Text = ""
  TextBox4.Text = ""
End Sub
Private Sub CommandButton2_Click() ‘Boton de Cancelar
  Me.TextBox1.SetFocus
  Me.Hide
  Call limpiarFormulario
End Sub
Private Sub ordenar(hoja As String, fil As Long, col As Long)
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Range(Cells(8, 3), Cells(fil, col)).Select
  With ActiveWorkbook.Worksheets(hoja).Sort
    .SortFields.Clear 'SortOn=xlSortOnValues ordena por valores
    .SortFields.Add Key:=Range("F8:F17"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("C8:C17"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("D8:D17"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("E8:E17"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range(Cells(8, 3), Cells(fil, col))
    .Header = xlNo 'sin encabezado
    .MatchCase = False 'no distingue entre mayusculas y minusculas
    .Orientation = xlTopToBottom
    '.SortMethod = xlPinYin
    .Apply
  End With
  'Worksheets(hoja).Range("AC4").Value = Application.WorksheetFunction.CountIf(Range("G8:AB8"), "")
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub


VIDEO DEMOSTRATIVO:

lunes, 14 de noviembre de 2011

22. ACTIVAR O INSTALAR COMPLEMENTOS EN EXCEL


El modulo estará disponible para cualquier libro de Excel.
INSTRUCCIONES
1. Clic en Archivo/Opciones/Complementos:

2. Clic en Ir y active Aliteral y Aceptar

3. Ahora la función aLiteral estará disponible para cualquier Libro de excel

21. CREAR COMPLEMENTOS VBA


INSTRUCCIONES
1. En la ventana VBA:
Archivo/Guardar
2. Guarde con el Tipo Complemento de Excel:


3. Clic en Guardar. Note que se guarda en la carpeta de Complementos pero deberá activar el complemento con los pasos indicados en tema siguiente 22. Activar o Instalar Complementos

20. FUNCIÓN QUE DEVUELVE EL LITERAL DE UN NUMERO


Función que devuelve el literal de un número entero entre 0 y 100
Ej. 98 -> Noventa y Ocho
INSTRUCCIONES
1. Cree un nuevo Libro y Modulo nuevo
2. Transcriba el siguiente código:

Function aLiteral(ByVal valor As Double) As String
  Dim literal As String
  valor = Round(valor, 0)
  valor = Abs(valor)
  Dim numeros(100) As String
  numeros(0) = "cero"
  numeros(1) = "uno"
  numeros(2) = "dos"
  numeros(3) = "tres"
  numeros(4) = "cuatro"
  numeros(5) = "cinco"
  numeros(6) = "seis"
  numeros(7) = "siete"
  numeros(8) = "ocho"
  numeros(9) = "nueve"
  numeros(10) = "diez"
  numeros(11) = "once"
  numeros(12) = "doce"
  numeros(13) = "trece"
  numeros(14) = "catorce"
  numeros(15) = "quince"
  numeros(20) = "veinte"
  numeros(30) = "treinta"
  numeros(40) = "cuarenta"
  numeros(50) = "cincuenta"
  numeros(60) = "sesenta"
  numeros(70) = "setenta"
  numeros(80) = "ochenta"
  numeros(90) = "noventa"
  numeros(100) = "cien"
  If (valor = 0) Then
    literal = numeros(valor)
  Else
    Do
      If (valor >= 100) Then
        If (valor = 100) Then
          literal = numeros(100)
          valor = valor - valor
        Else
          valor = 0
          On Error GoTo salir
        End If
      End If
      If (valor >= 10 And valor < 100) Then
        If (valor < 16) Then
          literal = literal & numeros(valor)
          valor = valor - valor
        Else
          literal = literal & numeros(Int(valor / 10) * 10)
          valor = valor - (Int(valor / 10) * 10)
          If (valor > 1) Then
            literal = literal & " y "
          End If
        End If
      End If
      If (valor > 0 And valor < 10) Then
        literal = literal & numeros(valor)
        valor = valor - valor
      End If
    Loop Until (valor = 0)
  End If
salir:
  aLiteral = literal
End Function

3. Guarde o siga con los siguientes temas (Crear un complemento e Instalarlo)
Nota.- Como puede verse esta función podría mejorarse para las centenas, unidades de mil, decenas de mil, etc. y podría agregarse soporte para decimales o usarse para otro tipo de literales.

VÍDEO DEMOSTRATIVO:

19. FUNCIONES VBA Y PARÁMETROS POR VALOR Y REFERENCIA


Las funciones son métodos que devuelven solo un tipo de resultado en contraste con los procedimientos que pueden devolver ningún o más de un resultado.
Ej.
Function nombreFuncion (ByVal [parámetros]) As tipoDato ‘función con parámetros por valor
[Sentencias]
nombreFuncion = [ResultadoDevuelto]
End Function

Sub nombreFuncion (ByRef [parámetros])  ‘procedimiento con parámetros por Referencia
[Sentencias]
End Function
LOS PARÁMETROS VBA
Pueden ser por valor o por referencia.
Por valor, quiere decir que se pasa una copia del valor original y cualquier cambio en esta no afecta a la original
Por referencia, se crea un apuntador a la variable original por lo que cualquier cambio en el valor de la variable local afectara a la variable original

viernes, 4 de noviembre de 2011

18. EVENTOS EN VBA - VALIDAR CON VBA


Vamos a validar las celdas en general para valores mayores o iguales a Cero y menores o iguales a 100 es decir entre Cero y Cien
INSTRUCCIONES
1. Cree un nuevo Libro
2. Doble Clic(izq) en ThisWorkbook
3. Cambie la lista desplegable de (General) por Workbook
4. Cambie Open por SheetChange
5. Transcriba el código VBasic:

Dónde:
Target es una variable tipo Range
Si es menor a cero, mayora a cien o no es numérico el dato Entonces
Limpiamos el rango, lo seleccionamos y mostramos un cuadro de dialogo

Nota.- No debemos guardar este método en un botón ya que es una macro de evento esto quiere decir que se ejecutará realizada una acción por parte del usuario en tiempo de ejecución de Excel
6. Guarde como practico18.xlsm

jueves, 3 de noviembre de 2011

17. DEPURACIÓN - PUNTO DE INTERRUPCIÓN, VENTANA INSPECCIÓN Y EJECUTAR PASO A PASO



Aremos una inspección de los valores de las variables en las sentencias de Control y Repetitivas anteriores.
INSTRUCCIONES
1. Abra el ejercicio anterior practico16.xlsm
2. PUNTO DE INTERRUPCIÓN
2.1 Haga clic(izq) a la izquierda de la sentencia siguiente, para crear un punto de interrupción:


3. AGREGAR INSPECCIÓN
3.1 Seleccione la variable c
3.2 Clic en el Menú Depuración\Agregar Inspección\Aceptar

4. DEPURACIÓN
4.1 Presione la tecla F8 reiteradamente para ejecutar sentencia a sentencia, observe como cambia el valor de la variable c en la ventana de Inspecciones
5. DETENER DEPURACIÓN
5.1 Clic en el botón Restablecer  para finalizar la Depuración Paso a Paso


VIDEO DEMOSTRATIVO(En construcción):




16. GESTIONAR ESTRUCTURAS – DO LOOP UNTIL, DO WHILE UNTIL, IF THEN Y SELECT CASE


Haremos un recorrido por la gestión de Estructuras Repetitivas (Bucles) y Condicionales (SI-Entonces) If Then,
INSTRUCCIONES
1. Cree un nuevo Libro y Modulo nuevo
2. Transcriba las macros y asigne un botón a cada una:
2.1 Estructura repetitiva Do Loop Until se repite hasta q la condición lógica es Verdadera, Ej:

2.2 Estructura repetitiva Do While Loop se repite mientras que la condición sea Verdadera, Ej:

2.3 Estructura condicional If Then ejecuta una u otra sentencia de acuerdo a que la condición sea Verdadera o Falsa Ej:

2.4 Condición Select Case de acuerdo a un valor ejecuta múltiples Case
3. Guarde como practico16.xlsm

martes, 1 de noviembre de 2011

15. GESTIÓN DE RANGOS – SELECCIONAR, ELIMINAR, INSERTAR, PROTEGER Y COPIAR RANGO


Haremos un recorrido por la gestión de Celdas y sus Rangos
INSTRUCCIONES
1. Cree un nuevo Libro y Modulo nuevo
2. Transcriba las macros y asigne un botón a cada una:
Note las distintas formas de referenciar un rango:
Range(“A1”), rango de A1
[A1], abreviada idéntica a la anterior
Range(“A1:B5”), rango desde “A1” hasta “B5”
[A1:B5], idem al anterior
fila = 1
columna = 5
Cells(fila, columna), idem al anterior más usada para valores variables

14. GESTIONAR HOJAS – CREAR, ABRIR, CERRAR, GUARDAR, IMPRIMIR Y PROTEGER HOJA


INSTRUCCIONES
1. Cree un nuevo Libro y Modulo nuevo
2. Transcriba las macros y asigne un botón a cada una
eliminarHoja(), elimina pidiendo el numero en una serie de hojas con el mismo nombre (Hoja1, Hoja2, etc) y desactivamos los cuadro de dialogo de alerta.
ocultarHoja(), si cambiamos False por True hacemos visible la Hoja otra vez



ALTERNATIVA PARA CREAR UN NUEVO LIBRO CON NOMBRE CONSTANTE:

3. (opcional) Guarde como practico13.xlsm



13. ASIGNAR UNA MACRO A UN BOTÓN U OBJETO


Con un botón de formulario:
INSTRUCCIONES
1. Ficha Programador (Cinta de Opciones)/Insertar/Botón (Controle de formulario):

2. Clic(izquierdo) sobre la Hoja
3. Clic(izq) sobre el nombre de Macro que se desea asignar
4. Clic (izq) en Aceptar
5. (opcional), clic(izq) sobre el botón y escriba un nuevo el nombre
6. Clic fuera del botón para activar el botón, Listo para probar su macro asignada al botón

lunes, 31 de octubre de 2011

12. GESTIONAR LIBROS


INSTRUCCIONES
1. Cree un nuevo Libro y Modulo nuevo
2. Transcriba las macros y asigne un botón a cada una
ALTERNATIVA PARA CREAR NUEVO LIBRO Y GUARDARLO COMO XLSM

PROCEDIMIENTOS DE GESTIÓN DE LIBROS:

3. (opcional) Guarde como practico39.xlsm

11. MACROS DE EVENTOS


Crearemos una Macro de evento cuando se active el Libro activo
INSTRUCCIONES
1. En un nuevo Libro de Excel abra el editor VB y en Macros de Evento de Libro haga doble clic en ThisWorkbook, Cambie las Listas Desplegables (General) por Workbook y (Declaraciones) por Activate.
2. Transcriba el siguiente código faltante:
Private SubWorkbook_Activate()
   MsgBox "Se ha activado el Libro: " &ActiveWorkbook.Name  ‘muestra un cuadro de dialogo
End Sub

Crearemos otra Macro de Evento pero a la Hoja
INSTRUCCIONES
1. Macros de Hoja, haga doble clic sobre la Hoja1(Hoja1), cambie (General) por WorkSheet y SelectionChange por Activate
2. Transcriba el siguiente código faltante:
   MsgBox "Se ha activado la Hoja: " & ActiveSheet.Name  ‘muestra un cuadro de dialogo con el nombre de la hoja
3. (opcional) Guarde como practico7.xlsm

OTROS EVENTOS IMPORTANTES:
Private Sub Worksheet_Activate()
' El código que escribas aquí se ejecutará automáticamente al activar la hoja

Private Sub Worksheet_Calculate()
' El código que escribas aquí se ejecutará automáticamente al calcular la hoja

Private Sub Worksheet_Deactivate()
' El código que escribas aquí se ejecutará automáticamente al desactivar la hoja

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' El código que escribas aquí se ejecutará automáticamente al moverte entre las celdas de la hoja (cada vez que seleccionas y te posicionas en una nueva celda)

Private Sub Worksheet_Change(ByVal Target As Range)
' El código que escribas aquí se ejecutará automáticamente al producirse un cambio en la hoja (por ejemplo al introducir un dato en una celda, seleccionar una opción de una lista desplegable, etc.)

10. VARIABLES Y CONSTANTES


INSTRUCCIONES
1. Cree un nuevo Módulo y transcriba el siguiente código Visual Basic:


Donde:
Const c As String = “VBA”, define una constante (Const) c como(As) Cadena (String)
Sub mostrarTexto(), Sub crea un procedimiento mostrarTexto() nombre del proyecto note que es texto sin espacios termina en paréntesis ()
Dim txt As String, definición de la variable txt tipo Cadena (String)
txt = “mundo”, asignación de la cadena “mundo” a la variable txt
MsgBox prompt:=”hola ” & txt & ” ” & c, crea un ventana de dialogo con el texto “hola mundo”

TABLA DE TIPO DE DATOS (PARA DEFINIR LAS VARIABLES):
Tipo de datos
Tamaño
Intervalo
Byte
byte
0 a 255
Boolean
bytes
True o False
Integer
bytes
-32,768 a 32,767
Long (entero largo)
bytes
-2,147,483,648 a 2,147,483,647
Single (coma flotante/ precisión simple)
bytes
-3,402823E38 a -1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores positivos
Double (coma flotante/ precisión doble)
bytes
-1.79769313486231E308 a -4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos
Currency (entero a escala)
bytes
-922.337.203.685.477,5808 a 922.337.203.685.477,5807
Decimal
bytes
+/-79.228.162.514.264.337.593.543.950.335 sin punto decimal; +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el número más pequeño distinto de cero es +/-0,0000000000000000000000000001
Date
bytes
1 de enero de 100 a 31 de diciembre de 9999
Object
bytes
Referencia a tipo Object
String (longitud variable)
bytes + longitud de la cadena
0 a 2.000 millones
String (longitud fija)
longitud de la cadena
1 a 65.400 aproximadamente
Variant (con números)
bytes
valor numérico hasta el intervalo de un tipo Double
Variant (con caracteres)
bytes + longitud de la cadena
mismo intervalo que para un tipo String de longitud variable
Definido por el usuario  (utilizando Type)
número requerido por los elementos
Intervalo de cada elemento es el mismo que el intervalo de su tipo de datos.