domingo, 20 de enero de 2013

ELIMINAR LA PROTECCION EN LIBROS Y HOJAS

Sé que existen miles de publicaciones al respecto pero siempre viene bien tenerlas a mano y entender cómo funciona.
Estos dos procedimientos son muy útiles cuando recibimos algún archivo protegido, y no nos comunican la contraseña para poder abrirlo. Sea como fuere, olvido o necesidad, cualquier problema de este tipo podemos solucionarlo gracias a estos dos procedimientos;

Para quitar la protección a un libro utilizaremos este procedimiento:

Sub DesprotegerLibro()
If MsgBox("Realmente desea desproteger el libro actual?", _
vbCritical + vbYesNo + vbDefaultButton2, "DesprotegerLibro") = vbYes Then
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveWorkbook.Unprotect Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & _
Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveWorkbook.ProtectStructure = False And ActiveWorkbook.ProtectWindows = False Then
MsgBox "El libro está ahora desprotegido", vbInformation + vbOKOnly, "DesprotegerLibro"
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End If
End Sub

Para quietar la  protección a una hoja utilizaremos este otro procedimiento:

Sub Quitar_contraseña()
Dim a As Integer, b As Integer, c As Integer
Dim d As Integer, e As Integer, f As Integer
Dim a1 As Integer, a2 As Integer, a3 As Integer
Dim a4 As Integer, a5 As Integer, a6 As Integer
On Error Resume Next
For a = 65 To 66: For b = 65 To 66: For c = 65 To 66
For d = 65 To 66: For e = 65 To 66: For a1 = 65 To 66
For a2 = 65 To 66: For a3 = 65 To 66: For a4 = 65 To 66
For a5 = 65 To 66: For a6 = 65 To 66: For f = 32 To 126
Contraseña = Chr(a) & Chr(b) & Chr(c) & Chr(d) & Chr(e) & Chr(a1) _
& Chr(a2) & Chr(a3) & Chr(a4) & Chr(a5) & Chr(a6) & Chr(f)
ActiveSheet.Unprotect Contraseña
If ActiveSheet.ProtectContents = False Then
MsgBox "¡Enorabuena!" & vbCr & "Se ha quitado la contraseña:" & vbCr & Contraseña
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

La única diferencia existente entre los dos procedimientos es la utilización del método Unprotect en los diferentes objetos;
ActiveSheet.Unprotect para desactivar la hoja.
ActiveWorkbook.Unprotect para desactivar el libro.

Este método no tiene efecto si la hoja o el libro no están protegidos.

domingo, 6 de enero de 2013

CLASES


En VBA una clase es algo tan sencillo como un procedimiento, que contiene datos para manejarlos, y con el que se puede crear objetos.
Para crear una clase primero debemos crearnos un módulo de clase, desde el menú insertar seleccionamos la opción Modulo de clase.

Los módulos de clase presentan dos eventos:

  • Initialize: ocurre cuando se crea una instancia de una clase. Se usa, generalmente para inicializar cualquier dato usado por la instancia de una clase en el código.
  • Terminate: ocurre cuando toda referencia a una instancia de una clase son removidas de memoria al establecer todas las variables que la refieren a un objeto a Nothing o cuando la última referencia al el objeto se encuentra fuera de alcance.

En el siguiente ejemplo creamos un módulo de clase donde declaramos públicamente las variables que utilizaremos en un módulo diferente y crearemos una función que nos devolverá en un mensaje el nombre completo de un supuesto empleado que estamos dando de alta.

Código del Módulo de Clase:
Option Explicit

Public Nombre As String
Public Apellido1 As String
Public Apellido2 As String
Public Direccion As String
Public Provincia As String

Public Function NombreCompleto() As String
NombreCompleto = Apellido1 & " " & Apellido2 & " " & Nombre
End Function

Código del Módulo:

Sub prueba_clase()
Dim empleado As New Clase1
    With empleado
        .Nombre = InputBox("Nombre: ")
        .Apellido1 = InputBox("Primer Apellido: ")
        .Apellido2 = InputBox("Segundo Apellido: ")
        .Direccion = InputBox("Dirección: ")
        .Provincia = InputBox("Provincia: ")
        MsgBox "Empleado: " & .NombreCompleto
    End With
End Sub



Al utilizar New en la variable empleado se crea una nueva instancia del objeto como primera referencia, de forma que no tenemos que utilizar la instrucción Set para asignar la referencia del objeto.



Como vemos en la imagen la variable empleado nos muestra todas las propiedades y métodos creados en el módulo de clase.

martes, 1 de enero de 2013

ESTADÍSTICA DEL BLOG 2012



CreateObject

Como ya sabemos por anteriores post  (Comunicación con Outlook y  COMPRIMIR ARCHIVOS) la función CreateObject nos sirve para crear y devolver una referencia a un objeto ActiveX.

En este caso utilizaremos esta función para abrir Internet Explorer e ir a la dirección que le indiquemos.

Asignamos el objeto (Internet Explorer) a una variable de objeto.

Utilizamos la referencia ExApp para tener acceso a la propiedad Visible de Internet Explorer  y después utilizamos el método Navigate  para ir a la dirección indicada por nosotros. Finalmente se libera la referencia.


Sub GetInternetExplorer()
Dim ExApp As Object

On Error GoTo Error

Set ExApp = CreateObject("InternetExplorer.Application")

    With ExApp

        .Visible = True

    End With

    With ExApp

        .Navigate URL:="http://vbaparaaplicacionesexcel.blogspot.com.es/"

    End With 
Error:

Set ExApp = Nothing

On Error GoTo 0

End Sub