martes, 6 de diciembre de 2016

Proteger y Desproteger Hojas VBA - Excel


'La siguiente macro permite proteger y desproteger todas las hojas de un libro

Const myClave = "MyClave123"

'for each
'Protect---> clave
'unprotect--->clave
'...

'excel vba macro:proteger todas las hojas
Sub protegerHojas()

Dim sht As Worksheet

For Each sht In Sheets

sht.Protect Password = myClave

Next

End Sub

'excel vba macro:Desproteger todas las hojas
Sub DesprotegerHojas()

Dim sht As Worksheet

For Each sht In Sheets

sht.Unprotect Password = myClave

Next

End Sub



lunes, 28 de noviembre de 2016

Excel VBA - Usar Compare Text

Usar compare text

Incluya la Opción compare text en la parte superior de cada módulo
para comparar texto sin importar las mayúsculas o minúsculas
*El valor por defecto diferencia entre mayúsculas y minúsculas

Al comparar el valor de una celda hará diferencia entre  “YES”, o “Yes” o “YeS”.

Por defecto en VBA las comparaciones son binarias. Ósea, "sí" ≠ "Sí

De igual forma podrías colocar Ucase  al  valor de la celda a comparar. Así tenemos los 2 valores en mayúsculas.

If UCASE(Target. Value) = "SI" Then

'hacer esto

End if

De todas formas me parece, más simple colocar

Option Compare Text


en la primera línea de cada módulo

miércoles, 16 de noviembre de 2016

VBA Tips

1-Abrir la ventana de inmediato, ubíquese sobre el explorador de proyectos VBA presionar CTRL+G
Esta ventana nos permite inspeccionar el valor de las variables sin tener que ejecutar una macro.

?numeroValue

2-Abrir explorador de objetos, presionar F2
Esta ventana nos permite conocer toda la jerarquía de objetos de Excel VBA
ObjetoParent.ObjetoHijo.ObjetoHijoHijo

Realice las siguientes pruebas en la ventana de inmediato
?ActiveCell.Parent.parent.parent.name
Microsoft Excel
Libro1
Hoja1

Luego corrobore la jerarquía en el explorador de objetos F2

3-Evitar que se cierre un libro habilitado para macros
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
MsgBox "No se puede cerrar Excel."

End Sub


lunes, 14 de noviembre de 2016

Excel 2016 - Cómo solucionar el error "falta api-ms-win-crt-runtime-l1-1.0.dll" para Excel

Mensaje de error en Excel 2016-Instalación: El programa no se puede iniciar porque api-ms-win-crt-runtime-l1-1.0.dll falta en su computadora ...

Cómo solucionar el error "api-ms-win-crt-runtime-l1-1.0.dll falta" para Excel 2016:
1.Cerrar Excel. Intente instalar todas las actualizaciones de Windows pendientes. Vaya a Inicio; Panel de control; Windows Update ...Revise las actualizaciones e instale todas las actualizaciones pendientes y reinicie el equipo.
2. Intente volver a instalar o reparar la office (Excel) para solucionar este problema,
3.Solución recomendada:
Ir...Actualización para Universal C Runtime en Windows 
https://support.microsoft.com/en-us/kb/2999226
Seleccione la actualización para su versión de Windows (32 o 64 bits) ... y finalmente reinicie su Excel.

miércoles, 9 de noviembre de 2016

Excel VBA Code Macro : Recuperar unidades de Disco duro mediante Macros

Para conseguir recuperar las particiones en Excel debe realizar las siguientes acciones:

-Agregar la referencia a Microsoft Scripting.FileSystemObject
-Recuperar y navegar en la colección de los discos y escribir las propiedades en las celdas.


Sub Read_Drives_In_Excel_VBA()

'Excel VBA CODE-MyExcelTools.com

On Error Resume Next

Dim fso
'Declare the variable

'Set the object type Scripting
Set fso = CreateObject("Scripting.FileSystemObject")

'Set the drives collection
Set Drives = fso.Drives

Dim count As Byte

For Each u In Drives
'Recorremos la colección

'Drive
Columns(1).Cells(1).Offset(count, 0).Value = u.DriveLetter

'Free Space
Columns(2).Cells(1).Offset(count, 0).Value = FormatNumber(u.AvailableSpace / 1024 / 1024 / 1024, 2, , , -1)


count = count + 1


Next

'clear the objects
Set Drives = Nothing
Set fso = Nothing
End Sub




lunes, 7 de noviembre de 2016

Excel VBA Macro: Ejecutar una macro para control de versiones

Tal vez compartes el trabajo sobre un modelo Excel en particular con varias personas (y deseas saber quién modifico el archivo)

Mediante el objeto FileSystemObject  agregaremos una referencia ..esto nos permite trabajar con archivos
Cualquier instalación de Excel con las características VBA instaladas puede acceder a esta libreria.
Podemos  leer, escribir, borrar, etc.,  archivos y carpetas.

Obtendremos información como:
Fecha de creación de un fichero Excel.
Fecha de la última modificación de un archivo Excel
Fecha del último acceso a un fichero Excel (corriendo sobre el archivo abierto)

Además puedes capturar el usuario y grabarlo en una hoja muy oculta cada vez que presiona el botón guardar…
'¿Application.UserName
'Son Goku

Sub Check_File()
'Esto es solo una idea puedes hacer por tu propia cuenta y riesgo miles de mejoras cambios, pruebas,etc

On Error Resume Next

Dim o_file As Object, o_fso As Object, FullPath As String
Dim last_acces As String, last_change As String, date_creation As String

FullPath = ActiveWorkbook.FullName 'La ruta completa de mi libro
Set o_fso = CreateObject("Scripting.FileSystemObject") 'creo el objeto fso
Set o_file = o_fso.GetFile(FullPath)

date_creation = o_file.DateCreated
last_change = o_file.DateLastModified
last_acces = o_file.DateLastAccessed

Range("C1") = "Heading"

If Err.Number <> 424 Then

Range("C2") = "Date_creation: " & date_creation
Range("C3") = "Last_change: " & last_change
Range("C4") = "Last_acces: " & FormatDateTime(last_acces) ', vbShortDate)

Else
Range("C2") = "Creación: " & Err.Description
Range("C3") = "Modificación del fichero: " & Err.Description
Range("C4") = "Último acceso: " & Err.Description
End If

Set fso = Nothing
Set archivo = Nothing
End Sub





miércoles, 2 de noviembre de 2016

Buscar Valor en una lista VBA Excel Macro - WorksheetFunction

'Mediante la siguiente macro puede hallar un valor parámetro en una lista de datos
'adicionalmente podría mejorarla personalizar la macro y pintar cada coincidencia de un color 'diferente

Sub TestYisus()

'Dim LastRow As Long
'get last row used
'LastRow = Range("C1").End(xlDown).Row


'Buscar Valor en na lista VBA Excel Macro
Dim RangoLista As Range, CeldaParametro As Range

Set RangoLista = Range("B2:B5")

Set CeldaParametro = Range("C2")

If Application.WorksheetFunction.CountIf(RangoLista, CeldaParametro) > 0 Then
    MsgBox "Se encontro el parametro " & CeldaParametro.Value & ", Direccion: " & CeldaParametro.Address(False, False) & " en la lista " & RangoLista.Address(False, False)
Else
    MsgBox "Valor no encontrado"
End If

End Sub