lunes, 24 de diciembre de 2012

Cursos Excel y Macros online (elearning) por Excelforo. Nueva edición 2013.

En primer lugar desearos a todos una Felices Fiestas y los mejores deseos para el próximo año 2013; que lo que llegue nos haga más felices!!!.

También anunciaros que comienza una nueva edición de Cursos de Excel y Macros en modalidad elearning (online) para el nuevo año 2013, donde podrás disfrutar y aprender de los cursos Excel que te ofrezco:

Curso Excel Financiero

(ver más)

Curso Tablas dinámicas en Excel

(ver más)

Curso Excel Avanzado para versiones 2007/2010

(ver más)

Curso Macros Iniciación

(ver más)

Curso Macros Medio

(ver más)

Curso preparación MOS Excel 2010 (Examen 77-882)

(ver más)


Esta nueva edición de Cursos de Excel y macros en modalidad elearning (online) dará comienzo el próximo día 1 de enero de 2013.
Con la confianza de siempre....Anímate!!


Informarte sin compromiso en cursos@excelforo.com o directamente en www.excelforo.com.

Recuerda que ahora también imparto clases particulares de Excel en Madrid te interesa?

viernes, 21 de diciembre de 2012

VBA: Controlar el acceso a un libro de Excel.

Hace unos días me llegó una curiosa solicitud, y me pareció interesante publicarla. La cuestión planteada fué:
...como puedo hacer para dotarle a los archivos excel de un codigo invariable que me permita relacionar un archivo especifico con un alumno especifico. El problema que quiero subsanar es que los alumnos se pasan los archivos le cambian el nombre y entregan...

El asunto parece claro, de qué manera poder controlar que el libro de trabajo de un alumno no pasa de mano en mano, simplemente cambiando el nombre del fichero o cambiando algo del aspecto de formato de la hoja.
Se me ocurrió incluir un evento WorkBook_Open sencillo que verificará el acceso al libro mediante una clave de identidad, y que una vez introducida por primera vez, las posteriores exigiera siempre esta misma, y en caso contrario el libro de trabajo se cerrara.

Para ello he empleado algo recientemente explicado en este blog, la propiedad de las hojas Visible: SheetVeryHidden, que permite ocultar una hoja de cálculo de ojos indiscretos (el de los alumnos).

El primer paso es sencillo, ya que prepararemos la celda A2 de la hoja que he llamado 'DatosCheck', para que reciba y controle el primer y siguientes accesos, que será además la que ocultaremos:

VBA: Controlar el acceso a un libro de Excel.


Dentro del Explorador de proyectos del Editor de VBA, buscamos ThisWorkBook e introducimos en él el siguiente código con el evento Open:

Private Sub Workbook_Open()
Dim identificacion As String
'forzamos la realización de una pregunta de verificación
identificacion = InputBox("Identificación", "Núm identidad")
'comprobamos que la celda A2 elegida está vacía
'lo que significaría que es la primera vez que se accede al libro
If Sheets("DatosCheck").Range("A2").Value = vbEmpty Then
    'si está vacía, entonces la rellenamos con el código introducido
    'y salimos del procedimiento
    Sheets("DatosCheck").Range("A2").Value = identificacion
    Exit Sub
    Else
    'en caso contrario, verificamos que el código es el mismo introducido
    'la primera vez, si fuera diferente, cerramos el libro sin guardar cambios.
    If Sheets("DatosCheck").Range("A2").Value <> identificacion Then
    MsgBox "No corresponde!!!"
    ActiveWorkbook.Close SaveChanges:=False
    End If
End If
End Sub



Nuestro trabajo de seguridad terminará, una vez oculta (VeryHidden) nuestra hoja 'DatosCheck', protegiendo nuestro proyecto (ver cómo).

El funcionamiento es bien sencillo, al abrir el libro, aparecerá un cuadro que pedirá tu número de indetidad personal, la primera vez que se abra admitirá cualquier valor, que automáticamente quedará registrado en una hoja oculta, y el alumno podrá seguir trabajando sin problemas sobre el ejercicio propuesto.
En posteriores accesos al libro, se solicitará igualemente el número de indentidad, sólo se permitirá trabajar sobre el libro si el código introducido corresponde con el primero grabado, en caso contrario el libro se cerrará.

miércoles, 19 de diciembre de 2012

VBA: Una función personalizada para mostrar el Número de página en una celda.


Hace bastante tiempo mostré cómo conseguir identificar el número de página impresa directamente en una celda de nuestra Hoja de cálculo; mediante funciones macro 4.0 de Excel conseguíamos identificar en una celda la numeración de la hoja correspondiente al área de impresión (ver).

Hoy veremos otra forma de obtener el mismo resultado, de una manera algo más sencilla, mediante una función personalizada en VBA.


La idea sigue siendo la misma, para una hoja con un área de impresión definida, con diferentes saltos de página insertados, mostrar en la misma hoja de cálculo, en las celdas correspondientes, cuál es el número de página de un total de ellas.
Partiremos de una hoja con diferentes saltos de página:

VBA: Una función personalizada para mostrar el Número de página en una celda.



Insertamos el siguiente código VBA de nuestro procedimiento Function en un módulo del Explorador de proyectos del Editor de VBA:

Function InfoPag()
Dim iPags As Integer, iPag As Integer
Dim iCols As Integer, iCol As Integer
Dim lfilas As Long, lfila As Long
Dim x As Long, y As Long

Application.Volatile
Dim direccion As Range
'controlamos la dirección de la celda donde se encuentra la función
Set direccion = Range(Application.Caller.Address)

'contamos saltos de página (horizontales y verticales)
With ActiveSheet
    lfilas = .HPageBreaks.Count
    iCols = .VPageBreaks.Count
End With
'calculamos el número total de páginas
iPags = (lfilas + 1) * (iCols + 1)

With ActiveSheet
    'recorremos columnas hasta que encontramos entre qué saltos verticales está.
    y = direccion.Column
    x = 0
    Do
        x = x + 1
    Loop Until x = iCols Or y < .VPageBreaks(x).Location.Column
    iCol = x
    If y >= .VPageBreaks(x).Location.Column Then
        iCol = iCol + 1
    End If
    
    'recorremos columnas hasta que encontramos entre qué saltos horizontales está.
    y = direccion.Row
    x = 0
    Do
        x = x + 1
    Loop Until x = lfilas Or y < .HPageBreaks(x).Location.Row
    lfila = x
    If y >= .HPageBreaks(x).Location.Row Then
        lfila = lfila + 1
    End If
    
    'Dirigimos y calculamos el número de pagina, según este la configuración de pagína
    'bien Hacia abajo y luego hacia la derecha
    'bien Hacia la derecha y luego abajo
    If .PageSetup.Order = xlDownThenOver Then
        iPag = (iCol - 1) * (lfilas + 1) + lfila
    Else
        iPag = (lfila - 1) * (iCols + 1) + iCol
    End If
End With
'devolvemos el valor a la hoja de cálculo
InfoPag = iPag & " de " & iPags
Set direccion = Nothing
End Function



El resultado es el esperado, obtenemos en nuestras celdas la numeración de página respecto del total de páginas dentro del área de impresión.
Ojo, la función está definida bajo el supuesto que existe al menos un salto vertical y uno horizontal!!!. En caso contrario devolvería un error.
Para controlar esta situación habría que condicionar el código para el caso que .HPageBreaks.Count y .VPageBreaks.Count fueran cero...

lunes, 17 de diciembre de 2012

VBA: Optimizar el doble loop FOR...NEXT.

Es de todos conocidos que muchas veces, aunque no queramos, no nos queda más remedio que emplear la instrucción FOR...NEXT para recorrer o 'barrer' listados o rangos de nuestras hojas de cálculo; y peor aún cuando tenemos que anidar un bucle dentro de otro, aparecen nuestras peores pesadillas: los dobles bucles (doble loop). Es aquí cuando nuestros procedimientos se ralentizan hasta términos insopechados, incluso llegando al bloqueo de nuestro equipo.
Lo que se busca con estos dobles bucles es verificar alguna condición anidada. Por ejemplo, en el ejercicio que planteo, trabajamos sobre un listado de 1.000 elementos, valores repetidos entre 1 y 50. Pretendemos obtener un primer listado de esos valores repetidos (en este caso es muy simple, son valores del 1 al 50), para luego recorrer nuevamente el listado de 1.000 elementos buscando coincidencias o cualquier otra cosa.

Es lógico, por tanto, que intentemos optimizar, en la medida de lo posible estas acciones dobles. La idea es lograr limitar el segundo recorrido únicamente a las celdas de nuestro listado a estudio, limitando por tanto el tiempo destinado a ese 'barrido' de datos.
En un doble bucle sin restricciones, lo que ocurre realmente es que recorremos todos y cada uno de los elementos del listado una y otra vez, siguiendo las indicaciones.

Vamos a ver a continuación dos procedimientos similares, un primer con un doble bucle al uso, mediante el cual recorremos una y otra vez la totalidad de los elementos, tantas veces como registros únicos hallamos contado.
Mientras que en el segundo procedimiento, restringiremos el recorrido únicamente por los elementos coincidentes (que son los que nos interesan), para lo cual emplearemos la función de VBA FIND.


Insertamos el siguiente código VBA en un módulo del Explorador de proyectos VBA para el doble bucle largo:

Sub LoopTotal()
Dim celda As Object, ID As Object
Dim i As Integer
Dim mirng As String

inicio = Timer
Set unicos = New Collection
'loop en todas las celdas y agregarlas a la coleccion
For Each celda In Sheets("Pfr").Range("IDE")
    On Error Resume Next
    unicos.Add celda.Value, CStr(celda.Value)
    On Error GoTo 0
Next celda

Application.ScreenUpdating = False
'escribir los datos en la Hoja de cálculo
For i = 1 To unicos.Count
    'con un loop general (requiere mucho tiempo...)
    For Each ID In Sheets("Pfr").Range("IDE")
        'incrementamos el contador de operaciones realizadas
        x = x + 1
        'acción de búsqueda e identificación (en este ejemplo no hace nada).
        If ID.Value = unicos(i) Then
        mirng = ID.Offset(0, 2).Address
        End If
    Next ID
Next i
Application.ScreenUpdating = True

Final = Timer
Sheets("Pfr").Range("D2").Value = Final - inicio
Sheets("Pfr").Range("D3").Value = x
End Sub



Insertamos el siguiente código VBA en un módulo del Explorador de proyectos VBA para el doble bucle restringido y más óptimo:

Sub LoopControlado()
Dim celda As Object
Dim i As Integer

inicio = Timer
Set unicos = New Collection
'loop en todas las celdas y agregarlas a la coleccion
For Each celda In Sheets("Pfr").Range("IDE")
    On Error Resume Next
    unicos.Add celda.Value, CStr(celda.Value)
    On Error GoTo 0
Next celda

Application.ScreenUpdating = False
'escribir los datos en la Hoja de cálculo
For i = 1 To unicos.Count
    'con un loop controlado sobre un rango más reducido
    Dim iLoop As Integer
    Dim j As Integer
    
    'definimos variables, para iniciar la búsqeuda FIND
    Set rNa = Sheets("Pfr").Range("A2")
    'y contamos los elementos coincidentes para el valor buscado
    iLoop = WorksheetFunction.CountIf(Sheets("Pfr").Columns(1), CStr(unicos(i)))
    'iniciamos la búsqueda restringida únicamente a los valores coincidentes
    For j = 1 To iLoop
        'acción de búsqueda e identificación (en este ejemplo no hace nada).
        Set rNa = Sheets("Pfr").Columns(1).Find(What:=CStr(unicos(i)), After:=Sheets("Pfr").Range(rNa.Address), _
         LookIn:=xlValues, LookAt:=xlWhole, _
         SearchOrder:=xlByRows, SearchDirection:=xlNext, _
         MatchCase:=True)
        'incrementamos el contador de operaciones realizadas
        x = x + 1
    Next j
Next i

Application.ScreenUpdating = True
Final = Timer
Sheets("Pfr").Range("E2").Value = Final - inicio
Sheets("Pfr").Range("E3").Value = x
End Sub



La diferencia fundamental entre uno y otro radica en que el segundo Loop, en el caso óptimo recorre únicamente los valores repetidos, miestras que en el caso Total, pasa por todos los registros una y otra vez.

Vemos en la imagen el listado de 1.000 elementos repetidos (de 1 a 50), y cómo hemos asociado cada procedimiento a un Botón. En las celdas D2:E3 mediante los procedimientos reflejaremos los tiempos empleados así como el número de operaciones realizadas:

VBA: Optimizar el doble loop FOR...NEXT.


Podemos observar el ahorro de tiempo y sobre todo operaciones realizadas de uno frente a otro procedimiento... y esto es sólo para mil registros, imaginemos si trabajaramos sobre 10.000.

jueves, 13 de diciembre de 2012

VBA: Algoritmo de ordenación tipo Burbuja en Excel.

Aprenderemos hoy un truco de ordenación de datos empleando una macro de Excel. En concreto replicaremos el Método Burbuja de ordenamiento. Podemos leer algo más al respecto en nuestra amiga Wikipedia.
Vamos a replicar es este método por el cual se revisan cada elemento de una lista de valores que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado (de mayor a meno o menor a mayor.
Lo que haremos será trabajar con los valores, asociándolos previamente a un Array, para luego replicar esa ordenación.

Para visualizar mucho mejor el funcionamiento de nuestra macro, comenzaremos viendo los datos a ordenar, vinculados a un gráfico de columnas:

VBA: Algoritmo de ordenación tipo Burbuja en Excel.



Insertamos el siguiente código VBA en un módulo del Explorador de proyectos VBA:

Option Base 1
Sub burbuja()
Dim NumEltos As Integer
Dim auxiliar As Integer
'definimos una Array de elementos a ordenar
Dim rng() As Integer
'Calculamos el número de elementos a ordenar
NumEltos = Range("B2:B22").Count

'Redefinimos la Array y la rellenamos de valores del rango B2:B22
ReDim rng(NumEltos) As Integer
For i = 1 To NumEltos
    rng(i) = Sheets("Grafico").Cells(i + 1, 2).Value
Next i

y = 0
Do
'Método de Burbuja (siguiendo algoritmo de ordenamiento)
For i = NumEltos To 1 Step -1
    For j = i To NumEltos
        'ordenamos de mayor a menor
        If rng(i) < rng(j) Then
        auxiliar = rng(i)
        rng(i) = rng(j)
        rng(j) = auxiliar
        End If
    Next j
Next i

'mostramos el resultado de la primera ordenación
'recorriendo el rango B2:B22
For x = 2 To NumEltos + 1
Sheets("Grafico").Cells(x, 2) = rng(x - 1)
Next x
'Actualizamos pantalla para mostrar resultado en el gráfico
Application.ScreenUpdating = True
y = y + 1
'la repetimos tantas veces como elementos tengamos a ordenar en el rango
Loop Until y = NumEltos
End Sub

Podemos ver en la siguiente animación el funcionamiento de la macro:

VBA: Algoritmo de ordenación tipo Burbuja en Excel.

lunes, 10 de diciembre de 2012

Localizar Referencias circulares en Excel.

Meses atrás explique en una entrada del blog (ver) una forma de trabajar con las referencias circulares mediante un método de cálculo iterativo.
En esta ocasión el asunto es más sencillo, se trata de aprender a localizar las referencias circulares con el fin de corregirlas y conseguir que los cálculos realizados en nuestras hojas de cálculo funciones correctamente (ojo con este punto, por que es frecuente que al trabajar con referencias circulares en nuestras hojas, los cálculos mostrados sean erróneos!!).

Partiremos de una sencilla tabla con algunas referencias circulares en ella:

Localizar Referencias circulares en Excel.



Tenemos como celdas con referencias circulares, esto es, celdas que se incluyen así mismas como parte de su propio cálculo, las correspondientes a la fila 6 de Impuestos (se calcula a partir del Resultado, que a su vez requiere determinar la suma de todos los gastos, incluido los 'Impuestos', lo que cierra el circulo, y hace nacer la Referencia circular), y también las celdas de la fila 7, donde el sumatorio del Total de gastos se incluye a sí mismo como parte del sumatorio.

Recordar, antes de seguir, que cuando una Referencia circular surge, Excel muestra un mensaje de advertencia:



La cuestión a explicar en esta entrada es cómo localizar esas referencias circulares. La respuesta es sencilla, tenemos una manera muy rápida en caso de que la hoja de trabajo activa sea la que contiene esas referencias circulares, dirigiendo nuestra mirada a la Barra de estado (esa barra olvidada en la parte inferior de nuestra hoja de cálculo). Lo vemos en la imagen siguiente:

viernes, 7 de diciembre de 2012

Ocultar Mostrar hojas y la propiedad VeryHidden de Excel.

Hoy hablaré de cómo poder Mostrar u Ocultar nuestras hojas dentro de un libro de trabajo, y de esa propiedad poco conocida que permite 'esconder' más profundamente una hoja de cálculo: la propiedad Visible: xlSheetVeryHidden.

El ocultar nuestras hojas está motivado por la necesidad de proteger información a ojos 'indiscretos', o simplemente simplificar el número de hojas visibles en el libro, mostrando únicamente las hojas con información relevante o final.


Para aquellos casos en los que ocultamos hojas para proteger información importante, podría ser suficiente realizar el proceso de Ocultar hojas. Lo que haremos desde la ficha Inicio > grupo Celdas > botón Formato > desplegable Visibilidad > Ocultar y mostrar.

Ocultar Mostrar hojas y la propiedad VeryHidden de Excel.


Vemos el proceso:

Ocultar Mostrar hojas y la propiedad VeryHidden de Excel.


La ventaja/desventaja de este procedimiento es la facilidad, precisamente, de mostrar u ocultar las hojas.

Para otros casos de extrema vigilancia o seguridad disponemos de la propiedad Visible: xlSheetVeryHidden, que bien desde la ficha Programador > grupo controles > botón Propiedades o bien desde el Editor de VBA podremos configurar.
Veamos una y otra manera.

La primera es con la hoja a ocultar activa, navegar hasta la ficha Programador > grupo controles > botón Propiedades, y dentro de esa ventana diálogo de Propiedades buscaremos la propiedad Visible, dentro de la cual seleccionamos: xlSheetVeryHidden.

Ocultar Mostrar hojas y la propiedad VeryHidden de Excel.


Esta acción automáticamente oculta la hoja, pero de tal forma que no aparecerá en el listado si intentaramos Mostrar hojas:

miércoles, 5 de diciembre de 2012

VBA: Maneras de acelerar nuestras macros de Excel.

Muchas veces nos hemos encontrado programando nuestras macros en Excel, y después de un tiempo incluyendo líneas y líneas de código, al ejecutarla, observamos como el tiempo de ejecución es extremadamente elevado, o muy lento (en ocasiones, incluso bloqueamos la aplicación).
En esta entrada contaré alguna de las buenas prácticas que agilizan y optimizan los tiempos de ejecución de nuestras macros... aunque a veces, ni yo mismo utilizo ;-)

Mis 15 consejos, no necesariamente por orden de importancia, serían:

1. Usar la propiedad .ScreenUpdating al inicio y final de nuestra macro, para evitar la actualización de la pantalla cada vez que se realiza una acción sobre la hoja de cálculo:

Application.ScreenUpdating=False
'... nuestro código VBA...
Application.ScreenUpdating=True



2. Emplear la propiedad .Calculation para evitar el recálculo de las operaciones de nuestra hoja:

Application.Calculation=xlCalculationManual
'... nuestro código VBA...
Application.Calculation=xlCalculationAutomatic
'o bien antes de cerrar el libro
Application.CalculateBeforeSave=True



3. Cuando sea posible usar la instrucción WITH...END WITH:

With MyLabel
    .Height = 2000
    .Width = 2000
    .Caption = "Esta es mi etiqueta"
End With



4. Liberar memoria cuando definamos variables con objeto:

Dim wsHoja as Worksheet
'Definimos la variable objeto
Set wsHoja = Hoja1
'... nuestro código VBA...
'Liberamos la memoria
Set wsHoja = Nothing



5. Este no siempre es posible, pero cuando lo sea, mejor no emplear la instrucción IF... THEN...ELSE. Por ejemplo, en lugar de:

Dim booSiNo As Boolean
Dim x As Long
If x = 13 Then
booSiNo = True
Else
booSiNo = False
End If
MsgBox booSiNo

podríamos usar:

Dim booSiNo As Boolean
Dim x As Long
booSiNo = (x = 13)
MsgBox booSiNo



6. Hacer uso de las funciones estándar de Excel en VBA en lugar de contruir procesos que hagan lo mismo. Por ejemplo utilizar el siguiente código:

MiSuma=Application.WorksheetFunction.Sum(Range("B2:C10"))

en lugar de:

For Each celda In Range("B2:C10")
MiSuma = MiSuma + celda.Value
Next celda



7. Especificar/concretar lo máximo posible a la hora de definir variables, evitando las variables tipo Variant o Object. Por ejemplo:

>Dim MiHoja As Worksheet
'mucho mejor que...
Dim MiHoja As Object 
''''''
Dim filas As Long
'mucho mejor que...
Dim filas As Variant



8. No seleccionar un rango para trabajar sobre él, si no es estrictamente necesario:

Range("C13").Font.Bold = True
'mucho mejor que...
Range("C13").Select
Selection.Font.Bold=True



9. Evitar Copiar y Pegar (Copy and Paste), empleando otras instrucciones similares, pero algo más eficientes. Por ejemplo, es mejor usar:

Range("A1:A13").Copy Destination:=Range("B1")
'O si únicamente necesitamos los valores:
Range("B1:B13").Value= Range("A1:A13").Value



10. Emplear los índices para los elementos de las colecciones, en lugar de los nombres que definen estos elementos. Por ejemplo:

Worksheets("Hoja3") 
'mejor usar
Worksheets(3)

Ojo, por que por contra, estos índices pueden cambiar, lo que generaría problemas de identificación futuros...no hay nada perfecto, verdad?.


11. Otro caso muy frecuente, el uso de "" en lugar de la variable vbNullString, mucho más efectiva.
Mejor usar

If Range("A1").Value = vbNullString Then
'...
Else
'...
End If

en lugar de

If Range("A1").Value = "" Then
'...
Else
'...
End If



12. Otra forma muy útil cuando trabajamos con eventos sobre nuestras hojas o libros (o controles), desactivar los Events al inicio de nuestra programación y activarlos de nuevo al final:

Application.EnableEvents = False
'... nuestro código VBA...
Application.EnableEvents = True



13. Intentar reducir el número de líneas de código, empleando para ello la posibilidad de escribir en una misma línea usando el separador ':' (dos puntos). Por ejemplo:

With Selection
.WrapText = True: .ShrinkToFit = False
End With
'más rápido que...
With Selection
.WrapText = True
.ShrinkToFit = False
End With



14. Declarar las variables OLE directamente. Un ejemplo:

Dim xls As Excel.Application
'mejor que...
Dim xls As Object
Set xls = CreateObject("Excel.Application")



15. Y uno más, el último pero no el menos importante (quizá sea el más utilizado). Cuando se haga necesario emplear bucles del tipo FOR, es más óptimo emplear FOR EACH...NEXT que FOR...NEXT cuando recorremos colecciones 'indexadas'. Por ejemplo, es más rápido el primero que el segundo:

Dim wsHoja as Worksheet
For Each wsHoja In Worksheets
    MsgBox wsHoja.Name
Next wsHoja
'más rápido que el siguiente..
Dim i as Integer
For i = 1 To Worksheets.Count
    MsgBox Worksheets(i).Name
Next i



Por supuesto existen otras acciones que mejoran la eficiencia de nuestras macros, pero en algún punto hay que parar, y es que la optimización del VBA no tiene fin...

lunes, 3 de diciembre de 2012

VBA: Cómo cambiar las propiedades de un documento de Excel.

Tiempo atrás comenté en este blog la manera de listar las propiedades de un documento de Excel, era una forma sencilla de visualizar estas propiedades (ver).

En esta ocasión aprenderemos una manera, igualmente sencilla, de modificar estas propiedades de un documento de Excel desde valores contenidos en celdas de nuestra hoja de cálculo.

Para ello, insertamos el siguiente código VBA en un módulo del Explorador de proyectos VBA:

Function CambioDocProp(DocProp As String, NuevoVal As String) As Boolean
Application.Volatile
On Error GoTo SalirProceso
ActiveWorkbook.BuiltinDocumentProperties.Item(DocProp) = NuevoVal
'verificamos el éxito del cambio
CambioDocProp = True
Exit Function

SalirProceso:
CambioDocProp = False
End Function



El listado completo de las propiedades de un documento de Excel sería el siguiente (ojo por que estas propiedades se definen en inglés!!!):
Title, Subject, Author, Keywords, Comments, Template, Last author, Revision number, Application name, Last print date, Creation date, Last save time, Total editing time, Number of pages, Number of words, Number of characters, Security, Category, Format, Manager, Company, Number of bytes, Number of lines, Number of paragraphs, Number of slides, Number of notes, Number of hidden Slides, Number of multimedia clips, Hyperlink base, Number of characters (with spaces), Content type, Content status, Language, Document version.


Esta función tal cual exige que al completar los dos argumentos DocProp:= propiedad a cambiar y NuevoVal:= nuevo valor de la propiedad, o bien se refieran a una celda o bien se escriban entre comillas:
=CambioDocProp("Comments";"Cambiamos los comentarios")

El resultado de la función devuelve un VERDADERO si el cambio se ha producido o un FALSO si algo falla.

Podemos ver cómo actúa realmente esta función sobre cambios en algunas propiedades. Para ello sacaremos la venta de propiedades (Panel de documentos) a la hoja de cálculo (Menú Archivo > Información > Propiedades > Mostrar Panel de documento):

VBA: Cómo cambiar las propiedades de un documento de Excel.


A continuación escribimos algunas funciones CambioDocProp que actue sobre alguna de las propiedades, viéndo como inmediatamente modifica éstas:

VBA: Cómo cambiar las propiedades de un documento de Excel.