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



domingo, 30 de diciembre de 2012

COLECCIONES

¿Qué es una colección?
Una colección es un objeto utilizado para agrupar y administrar objetos relacionados. Las colecciones son un buen método para hacer un seguimiento de los objetos que una aplicación puede necesitar crear o destruir dinámicamente.
Una colección se parece a una matriz, en el sentido que podemos acceder a sus elementos mediante un índice.
Ventajas de utilizar colecciones frente a las matrices:
  • Utilizan menos memoria.
  • El acceso a los elementos de la colección es mas flexibe.
  • Las colecciones tienen métodos para añadir nuevos elementos y eliminar otros.
  • El tamaño de la colección se ajusta automáticamente.
  • Pueden tener simultáneamente elementos de diferentes tipos.

La palabra clave New en la declaración de la variable produce un objeto Collection que se va a crear cuando el control pasa a la instrucción de declaración.

Dim loteria As New Collection

El objeto Collection tiene los siguientes métodos:
  • Add: Agrega un elemento a un objeto Collection de VBA.
  • Remove: Quita un elemento de un objeto Collection de VBA.

Y las siguientes propiedades:
  • Count: Devuelve un valor Integer que contiene el número de elementos en una colección.
  • Item: Devuelve un elemento concreto de un objeto Collection de VBA por posición o por clave.

El siguiente procedimiento creamos la colección lotería con cinco elementos (números  aleatorios de 0 a 9) que presentamos concatenados dentro de una variable string en un mensaje.


Sub loteriaNiño()

Dim loteria As New Collection
Dim numero As Integer, n As Integer
' Llenamos el objeto colección de números enteros aleatorios.
    For n = 1 To 5
        numero = Int(rnd * 9)
        loteria.Add numero
    Next n

' Recorremos el objeto de colección para presentar el numero.
Dim premio As String
    For n = 1 To loteria.Count
        premio = premio & loteria.Item(n)
    Next n

MsgBox "El numero premiado es... " & Chr(13) & premio

End Sub

domingo, 16 de diciembre de 2012

DATOS DUPLICADOS

En esta publicación vamos a explicar cómo podemos eliminar la fila donde nos encontramos dos datos iguales, es decir, tenemos por ejemplo en la columna "A" referencias de nuestros productos y en la columna "D" tenemos referencias del proveedor, se nos da el caso de que alguna de las referencias son coincidentes y las necesitamos eliminar.




Al mismo tiempo vamos a provechar y vamos a incluir la aplicación StatusBar para ver la evolución de nuestro procedimiento.




Option Explicit

Sub EliminarFilas()   
Dim Rango As Range, Fila As Long, ÚltimaFila As Long   
Application.ScreenUpdating = False

Range("A1").Select

ÚltimaFila = Range("A:A").End(xlDown).Row   
For Fila = 1 To ÚltimaFila

    Application.StatusBar = "Procesando fila " & Fila & " / " & ÚltimaFila

        If Range("A" & Fila).Value = Range("D" & Fila).Value Then

            If Rango Is Nothing = True Then

                Set Rango = Rows(Fila)

            Else

                Set Rango = Application.Union(Rango, Rows(Fila))

        End If

    End If

Next Fila

If Rango Is Nothing = False Then

    Rango.Select

    Selection.Delete

    Range(1, 1).Select

End If  
Application.StatusBar = "Proceso finalizado"

Application.ScreenUpdating = True
End Sub



domingo, 10 de junio de 2012

COMPRIMIR ARCHIVOS

Los archivos en formato ZIP probablemente sean los tipos de archivos mas utilizados, este ejemplo muestra como crear un archivo ZIP de un grupo de archivos seleccionados por el usuario con el método (Application.GetOpenFilename). Después crea un archivo llamado PruebaComprimir.zip en el directorio donde este guardado el Excel que contenga el siguiente procedimiento.

Sub ComprimirArchivos()
    Dim ShellApp As Object
    Dim FileNameZip As Variant
    Dim FileNames As Variant
    Dim i As Long, FileCount As Long

'   Obtener los nombres de los archivo
    FileNames = Application.GetOpenFilename _
        (FileFilter:="Todos los archivos. (*.*),*.*", _
         FilterIndex:=1, _
         Title:=" Seleccione los archivos para comprimir. ", _
         MultiSelect:=True)

'   Salir si se cancela el cuadro de diálogo
    If Not IsArray(FileNames) Then Exit Sub
  
    FileCount = UBound(FileNames)
    FileNameZip = Application.DefaultFilePath & "\PruebaComprimir.zip"
   

  
'   Crear archivo Zip vacío...
    Open FileNameZip For Output As #1
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #1

    Set ShellApp = CreateObject("Shell.Application")

'   Copia los archivos a la carpeta comprimida
    For i = LBound(FileNames) To UBound(FileNames)
        ShellApp.Namespace(FileNameZip).CopyHere FileNames(i)
    Next i

    On Error Resume Next
    Do Until ShellApp.Namespace(FileNameZip).items.Count = FileCount
        Application.Wait (Now + TimeValue("0:00:01"))
    Loop
   
    If MsgBox(FileCount & " Los archivos se han comprimido en:" & _
       vbNewLine & FileNameZip & vbNewLine & vbNewLine & _
       " Quieres ver el archivo zip?", vbQuestion + vbYesNo) = vbYes Then _
       Shell "Explorer.exe /e," & FileNameZip, vbNormalFocus
End Sub