Está en la página 1de 30

EXCELENTE  

 
 

 
¡Pero qué libro más bueno! 
jatrini 2018 
jatrini - Excelente - 12/MAR/2019

1 CONTENIDO
Contenido 1

Introducción 5

Fórmulas 6
Valores especiales 6
En caso de ERROR 6
Blancos y NA() 6
Números 6
Números positivos 6
Valor enésimo más pequeño de una lista 6
Valor enésimo más grande de una lista 6
Suma con SUBTOTAL 6
Suma condicional 7
Suma de valores de filas impares 7
Suma de valores de filas pares 7
Suma de valores cada tres filas 7
Tendencia 7
Cadenas 7
Suma de caracteres de una columna 7
Fechas 8
Día actual 8
Menor que fecha actual 8
Número de semana 8
Inicio del semestre siguiente 8
Fin de mes 8
Un mes más 8
Cuarto del año 9
Último día de la semana dada 9
Suma de días laborables 9
Imprimir fecha con formato 9
Cambiar idioma en las fechas impresas 9
Búsquedas 10

1
jatrini - Excelente - 12/MAR/2019

Devolver valor de columna a la derecha del valor buscado 10


Si coincidencia de subcadenas 10
Número de ocurrencias de un mismo valor 10
Referencias 10
Referencia al nombre de una hoja 10
Obtener nombre del fichero Excel 10
Obtener nombre de la hoja actual 11
Existencia de una hoja 11
Suma de celdas en distintas hojas 11
Función ADDRESS 11

Fórmulas matriciales 12
Máximos y mínimos 12
Máximo valor de una ocurrencia en array 12
Mínimo valor de una ocurrencia en array 12
Cadenas 12
Traducción de una cadena 12

Macros 12
Celdas 13
Ir a celda inicial 13
Valor de celda 13
Recalcular celda 13
Obtener última fila con valor 13
Rangos 13
Borrar el contenido de una hoja 13
Borrar un rango de celdas específico 14
Copiar varios rangos con formato en libro nuevo 14
Formatos 14
Formatear celdas 14
Escribir formato condicional 15
Borrar formatos condicionales 15
Contar Celdas por color 15
Cadenas 15
Función APLANAR texto 16

2
jatrini - Excelente - 12/MAR/2019

Elementos/Controles 16
Ajustar escalas gráfico a valores determinados cuando hay cambios 16
Aplicar misma escala a dos gráficos dinámicos 17
Modificar máximo y mínimo de SCROLLBAR en función de elemento seleccionado 18
Hyperlinks 18
Modificar hyperlinks 18
Modificar hyperlinks (versión RegExp) 19
Sistema 19
Referenciar variable de entorno 19
Ejecutar fichero BAT 19
Cargar XML desde web 19
Cargar información de varios ficheros excel 20
Activar y desactivar refrescos de pantalla 21
Grabar como y cerrar 21
Leer usuario y contraseña al abrir el libro 21
Borrar contraseña al cerrar el libro 22
Crear catálogo de nombres definidos en el libro 22
Crear PDF 22
Enviar correo formateado desde Outlook 23

Formatos condicionales 26
Destacar celdas con fecha menor a la actual 26
Destacar valores no encontrados en una lista 26
Construir un diagrama de Gantt con formato condicional 26

Trucos 26
Cambiar tipo de celda referenciada en la barra de fórmula 27
Evaluar fórmula en la barra de fórmula 27
Intercambiar visualización entre valores y fórmulas 27
Depuración de fórmula 27
Opciones de cálculo 27
Copiar/Duplicar rápidamente 28
Añadir un valor a un rango 28
Encontrar una referencia a libro externo 28
Fichero corrupto; tamaño grande 28

3
jatrini - Excelente - 12/MAR/2019

Reglas Formato Condicional duplicadas 28


Problemas al romper vínculos 29
Filtro avanzado (varios criterios) 29
Recursos Web 29

4
jatrini - Excelente - 12/MAR/2019

2 INTRODUCCIÓN

EXCELENTE: Mi libro de Excel.

Fecha de edición: 12/MAR/2019

Última versión siempre disponible en: ​https://url.jatrini.com/xls

5
jatrini - Excelente - 12/MAR/2019

3 FÓRMULAS

3.1 VALORES ESPECIALES

3.1.1 En caso de ERROR

=IFERROR(A1-A2;A1)

3.1.2 Blancos y NA()

=IF(ISBLANK(A1);NA();"-")

3.2 NÚMEROS

3.2.1 Números positivos

Devuelve A1 si es positivo, o cero en caso contrario.


=MAX(A1;0)

3.2.2 Valor enésimo más pequeño de una lista

Devuelve el tercer número más pequeño de la lista.


=SMALL(A1:A10;3)

3.2.3 Valor enésimo más grande de una lista

Devuelve el segundo número más grande de la lista.


=LARGE(A1:A10;2)

3.2.4 Suma con SUBTOTAL

Sobre ella pueden establecerse filtrados:


=SUBTOTAL(9;A:A)

6
jatrini - Excelente - 12/MAR/2019

3.2.5 Suma condicional

Suma de valores en columna “B” para los valores de la columna “A” que coinciden con “Valor”.
=SUMIF(A1:A10;"Valor";B1:B10)

o
=SUMPRODUCT(--(A1:A10="Valor");B1:B10)

“--“ se emplea para convertir valores binarios en números: --TRUE=1 y --FALSE=0. Así, cuando
la condición se cumple, el valor TRUE se convierte a 1.

3.2.6 Suma de valores de filas impares

=SUMPRODUCT(MOD(ROW(1:10);2);B1:B10)

3.2.7 Suma de valores de filas pares

=SUMPRODUCT(MOD(ROW(1:10)+1;2);B1:B10)

3.2.8 Suma de valores cada tres filas

=SUMPRODUCT(--(MOD(ROW(1:10);3)=1);B1:B10)

3.2.9 Tendencia

=TREND(B1:B10;{0;5;10;15;20;25;30;35;40;45};100)

3.3 CADENAS

3.3.1 Suma de caracteres de una columna

=SUMPRODUCT(LEN(A1:A10))

7
jatrini - Excelente - 12/MAR/2019

3.4 FECHAS

3.4.1 Día actual

=TODAY()

3.4.2 Menor que fecha actual

=A1<NOW()

3.4.3 Número de semana

=WEEKNUM(A1)

o
=WEEKNUM(A1;21)

=ISOWEEKNUM(A1)

Las dos últimas consideran como primera semana la que contiene el primer jueves del año (ISO
8601, empleado en Europa).

3.4.4 Inicio del semestre siguiente

=IF(MONTH(A1)/6<1;DATE(YEAR(A1);"7";"1");DATE(YEAR(A1)+1;"1";"1"))

o
=DATE(YEAR(A1);--((MONTH(A1)>5)+1)*6+1;"1")

3.4.5 Fin de mes

=EOMONTH(A1;0)

3.4.6 Un mes más

=EDATE(A1;1)

8
jatrini - Excelente - 12/MAR/2019

3.4.7 Cuarto del año

="Q"&INT((ISOWEEKNUM(A1)-1)/13+1)

3.4.8 Último día de la semana dada

Donde A2 es el año y A3 el número de la semana. Se tiene en cuenta que la primera semana


del año tenga cuatro días o más (ISO 8601). Se formatea la salida.
=TEXT(DATE(A2;1;1)+(A3+(WEEKDAY(DATE(A2;1;1);2)>=4))*7-WEEKDAY(DATE(A2;1;1);2)
;"dd-mmm")

3.4.9 Suma de días laborables

Tenemos en A1 el día “26/03/2018”. Si sumamos 10 días laborables a esa fecha:


=WORKDAY(A1;10)

Obtenemos el “09/04/2018”.

Pero además, podemos especificar días festivos adicionales:


=WORKDAY(A1;10;Festivos)

Obteniendo el “11/04/2018”.

Siendo “Festivos”, por ejemplo, la etiqueta para el rango: “=Festivos!$B$1:$B$20”. Dentro de


este rango tendríamos las fechas: 29/03/2018 y 30/03/2018, por eso la última fórmula suma
dos días laborables más.

3.4.10 Imprimir fecha con formato

=TEXT(A1;"aaaa-mmm")

o
="Informe generado el: "&TEXT(NOW();"dddd dd/mm/aaaa hh:mm:ss")

3.4.11 Cambiar idioma en las fechas impresas

Se debe especificar el “locale code”, en hexadecimal. Por ejemplo, con el código 409, inglés de
Estados Unidos, aparecerán las etiquetas “Mon, Monday, Nov, Novembre”, etc.

=TEXT(F13;"[$-409]mmm")

9
jatrini - Excelente - 12/MAR/2019

3.5 BÚSQUEDAS

3.5.1 Devolver valor de columna a la derecha del valor buscado

El valor buscado se encuentra en A1, C es la columna en la que buscar, y se devuelve un valor


de la columna B.
=IFERROR(INDEX(B:B;MATCH(A1;C:C;0));"-")

3.5.2 Si coincidencia de subcadenas

=IF(SUM(COUNTIF(A1;{"Dispatched";"Cancelled";"Closed";"Transferred"}))>0;"SI";
"NO")

o
=IF(SUM(COUNTIF(A1;{"*pe*";"*ss*"}))>0;"NO";"SI")

3.5.3 Número de ocurrencias de un mismo valor

=SUMPRODUCT(--(A1:A10="Open"))

3.6 REFERENCIAS

3.6.1 Referencia al nombre de una hoja

=IFERROR(SUM(INDIRECT(A1&"!A:A"));"")

Las comillas simples permiten espacios en el nombre:


=INDIRECT("'"&A1&"-OK'!A1")

3.6.2 Obtener nombre del fichero Excel

Nombre completo, con ruta:


=CELL("filename";A1)

o solamente el nombre del fichero:


=MID(CELL("filename";A1);FIND("[";CELL("filename";A1))+1;FIND("]";
CELL("filename";A1))-FIND("[";CELL("filename";A1))-1)

10
jatrini - Excelente - 12/MAR/2019

3.6.3 Obtener nombre de la hoja actual

=MID(CELL("filename";A1);FIND("]";CELL("filename";A1))+1;255)

3.6.4 Existencia de una hoja

=ISREF(INDIRECT(“Hoja1”&"!A1"))

3.6.5 Suma de celdas en distintas hojas

=SUM(Hoja1:Hoja2!A1)

3.6.6 Función ADDRESS

=ADDRESS(5;2)

Devuelve “$B$5”.

Tiene más parámetros: el tercer parámetro especifica fila/columna absoluta o relativa, el


cuarto si el estilo es A1 ó R1C1, y el quinto especifica la hoja.
=ADDRESS(5;2;1;0;"Hoja1")

Devuelve “Hoja1!R5C2”.

11
jatrini - Excelente - 12/MAR/2019

4 FÓRMULAS MATRICIALES
Estas fórmulas aplican sobre rangos de celdas, es decir, matrices de datos. Se introducen en
Excel pulsando [CTRL+MAYUS+INTRO], con lo que aparecerán automáticamente las llaves que
engloban la fórmula (no hay que teclearlas).

4.1 MÁXIMOS Y MÍNIMOS

4.1.1 Máximo valor de una ocurrencia en array

{=MAX(IF(LEFT(A1:A10;3)="ene";B1:B10))}

o
{=MAX(IF(B1:B10=A1;C1:C10))}

4.1.2 Mínimo valor de una ocurrencia en array

{=MIN(IF(B1:B10=A1;C1:C10))}

4.2 CADENAS

4.2.1 Traducción de una cadena

Existe una tabla de TRADUCCIONES con los campos SUBCADENA (cadena a coincidir) y
TRADUCCIÓN (cadena traducida).

La función APLANAR está ​aquí​.


{=IFERROR(INDEX(TRADUCCIONES[Traducción];MATCH(TRUE;(IF(ISERROR(SEARCH(TRADUCC
IONES[Subcadena];Aplanar(Y5)));FALSE;TRUE));0));"ERROR")}

12
jatrini - Excelente - 12/MAR/2019

5 MACROS

5.1 CELDAS

5.1.1 Ir a celda inicial

' Seleccionar celda A1 de la hoja "MiHoja"


Sheets("MiHoja").Select
Range("A1").Select

5.1.2 Valor de celda

' Obtener el valor especificando la hoja y la celda


Acentos = Sheets("F_Aplanar").Cells(3, "C").Value

5.1.3 Recalcular celda

' Actualizar valor de la celda


Range("H70").Calculate

5.1.4 Obtener última fila con valor

' Buscando el último valor de la columna A


UltimaFila = Cells(Rows.Count, "A").End(xlUp).Row

5.2 RANGOS

5.2.1 Borrar el contenido de una hoja

Se borra el contenido de una hoja completa.


Sub Borrar()
' Borrar contenido
Sheets("MiHoja").Select
Cells.Select
Selection.ClearContents

' Al inicio
Range("A1").Select
End Sub

13
jatrini - Excelente - 12/MAR/2019

5.2.2 Borrar un rango de celdas específico

Se borra el rango B2:C4 de la hoja especificada.


Sub BorrarRango()
' Borrar contenido

Sheets("MiHoja").Select
Range("B2:C4").Select
Selection.ClearContents

' Al inicio
Range("A1").Select
End Sub

5.2.3 Copiar varios rangos con formato en libro nuevo

' Copiar columnas - Se copian solo determinadas celdas


UltimaFila = Cells(Rows.Count, "A").End(xlUp).Row
Set r1 = Range("A1:D" & UltimaFila)
Set r2 = Range("G1:J" & UltimaFila)
Set myMultiAreaRange = Union(r1, r2)
myMultiAreaRange.Select
Selection.Copy

' Crear libro nuevo; pegar valores y formato


Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone,
SkipBlanks:=False, Transpose:=False

5.3 FORMATOS

5.3.1 Formatear celdas

' Formatear
Cells.Select
Selection.RowHeight = 11.25
Columns("A:A").ColumnWidth = 2
Columns("B:B").ColumnWidth = 9
Columns("G:I").ColumnWidth = 10
Columns("C:C").Select
Range("C2").Activate
With Selection
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False

14
jatrini - Excelente - 12/MAR/2019

.ReadingOrder = xlContext
.MergeCells = False
End With

5.3.2 Escribir formato condicional

Sub FormatosCondicionales()
' Formato para destacar los márgenes por debajo del objetivo (en C3)
Columns("C:C").Select

' La expresión/fórmula depende del lenguaje del Excel… en este caso, en


Español
Selection.FormatConditions.Add Type:=xlExpression,
Formula1:="=Y(ESNUMERO($A1);O($A1>0;$B1>0);C1<$C$3)"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority

With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With

Selection.FormatConditions(1).StopIfTrue = False
End Sub

5.3.3 Borrar formatos condicionales

' Seleccionar hoja


Sheets("MiHoja").Select

' Borrar formatos condicionales


Cells.FormatConditions.Delete

5.3.4 Contar Celdas por color

Function ContarColor(celdaOrigen As Range, rango As Range)

Application.Volatile

Dim celda As Range

'Recorremos todas las celdas del rango


For Each celda In rango
'Compara la propiedad Interior.Color
If celda.Interior.color = celdaOrigen.Interior.color Then
ContarColor = ContarColor + 1
End If
Next celda

End Function

15
jatrini - Excelente - 12/MAR/2019

5.4 CADENAS
5.4.1 Función APLANAR texto

Los valores referenciados están en hoja aparte: “F_Aplanar”, celdas A1 y A2. Es una forma de
no incluir las cadenas en código VBA, donde hay problemas de codificación de caracteres entre
Mac y Windows.
Acentos = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ,/ºª"
Regular = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy "

Function APLANAR(Cadena As String)


Dim A As String * 1
Dim B As String * 1
Dim i As Integer
Dim Acentos As String
Dim Regular As String

Acentos = Sheets("F_Aplanar").Cells(1, "A").Value


Regular = Sheets("F_Aplanar").Cells(2, "A").Value

For i = 1 To Len(Acentos)
A = Mid(Acentos, i, 1)
B = Mid(Regular, i, 1)
Cadena = Replace(Cadena, A, B)
Next

APLANAR = Cadena

End Function

5.5 ELEMENTOS/CONTROLES

5.5.1 Ajustar escalas gráfico a valores determinados cuando hay cambios

Se trata de un gráfico de Gantt en el que se redimensiona el eje X en función de la fecha de


inicio (en celda A1) y la fecha de fin (en celda A2). También se ajusta la altura del gráfico en
función del número de proyectos a representar (en celda A3).
Private Sub Worksheet_PivotTableUpdate(ByVal Cual As PivotTable)
If Cual.Name = "MiGrafico" Then
AjustaEscalas
End If
End Sub

Sub AjustaEscalas()
' No refresco pantalla
Application.ScreenUpdating = False

' Selecciona hoja de informe y la desprotejo


Sheets("MiHoja").Select

16
jatrini - Excelente - 12/MAR/2019

ActiveSheet.Unprotect

' Cambiar escala al gráfico


ActiveSheet.ChartObjects("MiGrafico").Activate
ActiveChart.Axes(xlValue).MinimumScale = Range("A1").Value
ActiveChart.Axes(xlValue).MaximumScale = Range("A2").Value
ActiveSheet.Shapes("Gantt").Height = 50 + Range("A3").Value * 15

' Al inicio
Range("A1").Select

' Proteger hoja


ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowUsingPivotTables:=True

' Refresco pantalla


Application.ScreenUpdating = True

End Sub

5.5.2 Aplicar misma escala a dos gráficos dinámicos

Se tienen dos gráficos “Creados” y “Resueltos”, a los que se les pone la misma escala cuando
se modifica la fuente de datos, que es la tabla dinámica “ElementosCreados”. La función de
actualización debe estar en la hoja en la que reside la tabla dinámica.

En la celda F10 se calcula el máximo del eje Y, dando por ejemplo un 10% más del valor
máximo de los datos por estética:
=TRUNC(MAX(Datos!A1:H50)*110%)

Private Sub Worksheet_PivotTableUpdate(ByVal Cual As PivotTable)


If Cual.Name = "ElementosCreados" Then
Sheets("Informe").AjustaEscalas
End If
End Sub

Sub AjustaEscalas()

' No refresco pantalla


Application.ScreenUpdating = False

' Selecciona hoja de informe y la desprotejo


Sheets("MiHoja").Select
ActiveSheet.Unprotect

' Cambiar escala al gráfico de creados


ActiveSheet.ChartObjects("Creados").Activate
ActiveChart.Axes(xlValue).Select
ActiveChart.Axes(xlValue).MinimumScale = 0
ActiveChart.Axes(xlValue).MaximumScale = Cells(10, "F").Value

' Cambiar escala al gráfico de resueltos

17
jatrini - Excelente - 12/MAR/2019

ActiveSheet.ChartObjects("Resueltos").Activate
ActiveChart.Axes(xlValue).Select
ActiveChart.Axes(xlValue).MinimumScale = 0
ActiveChart.Axes(xlValue).MaximumScale = Cells(10, "F").Value

' Al inicio
Range("A1").Select

' Proteger hoja


ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowUsingPivotTables:=True

' Refresco pantalla


Application.ScreenUpdating = True
End Sub

5.5.3 Modificar máximo y mínimo de SCROLLBAR en función de elemento


seleccionado

La macro debe ir en la hoja donde se encuentre la celda que define el elemento a gestionar por
la Scrollbar. En la celda A1 se encuentra el máximo valor para ese elemento.

Private Sub Worksheet_Change(ByVal Target As Range)


If Target.Address = "$A$1" Then
ActiveSheet.ScrollBar1.Max = Range("A1").Value
ActiveSheet.ScrollBar1.Value = Range("A1").Value
End If
End Sub

5.6 HYPERLINKS

5.6.1 Modificar hyperlinks

Sub ModificarHyperLink()

Dim viejotexto As String


Dim nuevotexto As String
Dim enlace As Hyperlink

viejotexto = "../../.."
nuevotexto = "https://www.web.com"

' Cambiar las URL de la hoja


For Each enlace In ActiveSheet.Hyperlinks
x = InStr(1, enlace.Address, viejotexto)
If x > 0 Then
If enlace.TextToDisplay = enlace.Address Then
enlace.TextToDisplay = nuevotexto
End If

18
jatrini - Excelente - 12/MAR/2019

enlace.Address = Application.WorksheetFunction.Substitute(enlace.Address,
viejotexto, nuevotexto)
End If
Next

End Sub

5.6.2 Modificar hyperlinks (versión RegExp)

Sub ApuntarLinksASharepoint()

Dim link As Hyperlink


Dim RegEx As Object

Set RegEx = CreateObject("VBScript.RegExp")


RegEx.Global = False 'If False, would replace only first
RegEx.Pattern = ".*Documents"

For Each link In ActiveSheet.Hyperlinks


link.Address = RegEx.Replace(link.Address,
"https://my-sharepoint.com/sites/MySite/Shared%20Documents")
Next

End Sub

5.7 SISTEMA

5.7.1 Referenciar variable de entorno

Crear en el escritorio el directorio “Destino” si no existe.


' El destino está en el escritorio
Dest = Environ("USERPROFILE") + "\Desktop\Destino"
If Len(Dir(Dest, vbDirectory)) = 0 Then
MkDir Dest
End If

5.7.2 Ejecutar fichero BAT

Ejecutar un fichero “.BAT” que se encuentra en un directorio específico.


Set objShell = CreateObject("WScript.Shell")
result = objShell.Run("%USERPROFILE%\Desktop\App\App.bat " + Opcion, 5, True)

5.7.3 Cargar XML desde web

Invocación a la URL, donde A1 es el usuario, A2 la contraseña, A3 el fichero a recuperar y A4 la


propia URL formada con esos parámetros de ejemplo:

19
jatrini - Excelente - 12/MAR/2019

="https://www.web.com/"&A3&"?tempMax=10000&username="&A1&"&password="&A2

' Variables
Link = Sheets("MiHoja").Range("A4").Value

' Desactivar actualizaciones


Application.ScreenUpdating = False

' Leer nueva hoja


Workbooks.Open Filename:=Link

5.7.4 Cargar información de varios ficheros excel

Se permite seleccionar desde el diálogo de apertura de ficheros varios a la vez. Luego se


recorren buscando cierta información y se copian esas casillas en el fichero excel de origen.
Sub CopiarValores()

' Variables
Dim Ficheros As Variant
Dim Cont As Long
Dim Libro As Workbook

' Selección de ficheros


Ficheros = Application.GetOpenFilename("Excel Files (w*.xlsx), w*.xlsx",
Title:="Selección ficheros", MultiSelect:=True)

' Ocultar Alertas


Application.DisplayAlerts = False

' Procesar ficheros


If IsArray(Ficheros) Then
For Cont = LBound(Ficheros) To UBound(Ficheros)
' Abrir fichero
Set Libro = Workbooks.Open(Filename:=Ficheros(Cont), UpdateLinks:=0)

' Filtrar listado por Criterio1


Rows("4:4").Select
Selection.AutoFilter
ActiveSheet.Range("A:O").AutoFilter Field:=2, Criteria1:="ValorBuscado"

' Seleccionar filtrado y copiar


ActiveSheet.AutoFilter.Range.Offset(1, 0).Copy

' Pegar
Windows("MiExcel.xlsm").Activate
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
'ActiveWindow.WindowState = xlNormal
ActiveSheet.Paste

' Cerrar fichero


Libro.Close savechanges:=False
Next Cont
End If

' A Casa

20
jatrini - Excelente - 12/MAR/2019

Windows("MiExcel.xlsm").Activate
Range("A1").Select

' Mostrar Alertas


Application.DisplayAlerts = True
End Sub

5.7.5 Activar y desactivar refrescos de pantalla

' Activar actualizaciones


Application.ScreenUpdating = True

' Desactivar actualizaciones


Application.ScreenUpdating = False

5.7.6 Grabar como y cerrar

' Grabar Como y cerrar


ActiveWorkbook.SaveAs Filename:=Environ("USERPROFILE") & "\Desktop" &
"\Fichero" & Format(Date, "yyyymmdd") & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

ActiveWindow.Close

5.7.7 Leer usuario y contraseña al abrir el libro

El código debe ir dentro de “ThisWorkbook”.


Option Explicit
Private WithEvents app As Excel.Application

Private Sub app_WorkbookOpen(ByVal Libro As Workbook)


Dim Fichero As String
Dim Dato As String

' Abrir fichero


Fichero = Libro.Path + "\Datos.txt"
On Error GoTo NoPasaNada
Open Fichero For Input As #1

' Seleccionar hoja


Sheets("MiHoja").Select

' Leer usuario


Line Input #1, Dato
Range("S16:T16").Select
ActiveCell.FormulaR1C1 = Dato

' Leer contraseña


Line Input #1, Dato
Range("S17:T17").Select

21
jatrini - Excelente - 12/MAR/2019

ActiveCell.FormulaR1C1 = Dato

' Cerrar fichero


Close #1

' Si no existe fichero no pasa nada; capturar error


NoPasaNada:
End Sub

Private Sub Workbook_Open()


Set app = Application

End Sub

5.7.8 Borrar contraseña al cerrar el libro

El código debe ir dentro de “ThisWorkbook”.


Option Explicit
Private WithEvents app As Excel.Application

Private Sub Workbook_BeforeClose(Cancel As Boolean)

' Posicionarme en hoja protegida


Sheets("MiHoja").Select
ActiveSheet.Unprotect
Range("A1").Select
ActiveSheet.Protect

' Borrar contraseña


Sheets("MiHoja").Select
Range("S17:T17").Select
ActiveCell.FormulaR1C1 = ""
Range("S16:T16").Select

End Sub

5.7.9 Crear catálogo de nombres definidos en el libro

Crea el catálogo de nombres y formatea según el contenido de la celda.

Sub ActualizarListaNombres()

Dim Nombre As Name

Sheets("Nombres").Select

' Borrar contenido


UltimaFila = Cells(Rows.Count, "B").End(xlUp).Row
Range("B6:D" & UltimaFila).Delete

' Actualizar
RowNum = 6: ColNum = 2

For Each Nombre In ThisWorkbook.Names


Cells(RowNum, ColNum) = Nombre.Name
Cells(RowNum, ColNum + 1).Formula = Nombre.RefersTo
If IsNumeric(Cells(RowNum, ColNum + 1)) Then

22
jatrini - Excelente - 12/MAR/2019

If Cells(RowNum, ColNum + 1).Value > 1 Then


Cells(RowNum, ColNum + 1).NumberFormat = "#,##0.00€"
Else
Cells(RowNum, ColNum + 1).NumberFormat = "#.00%"
End If
Else
Cells(RowNum, ColNum + 1).HorizontalAlignment = xlRight
End If
Cells(RowNum, ColNum + 2) = "'" & Nombre.RefersTo

RowNum = RowNum + 1
Next

' Ir a A1
Range("A1").Select

End Sub

5.7.10 Crear PDF

Sub CrearPDF()

' Imprimir

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF,
Filename:=Environ("USERPROFILE") & "\Desktop" & "\OSS-DM_" & Format(Date,
"yyyymmdd") & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True,
IgnorePrintAreas:=False, OpenAfterPublish:=True

End Sub

5.7.11 Enviar correo formateado desde Outlook

Se usan dos funciones. La primera de ella es invocada al pulsar un botón, y desencadena la


acción. Refresca una tabla dinámica y, tras calcular el tamaño del mensaje (última celda
rellena), crea el correo usando también el contenido de otras celdas para cada campo del
correo. La otra función es para copiar y pegar el contenido del correo en HTML (creando un
fichero temporal), manteniendo así el formato. Finalmente no lo enviamos, permitimos su
edición antes.
Private Sub ActualizarYEnviar_Click()

Dim Rango As Range


Dim CorreoApp As Object
Dim Correo As Object

' Desproteger hoja


Sheets("Pendientes").Unprotect

' Actualizar Tabla


ActiveSheet.PivotTables("POPorRecibir").PivotCache.Refresh

' Inicio
With Application
.EnableEvents = False
.ScreenUpdating = False

23
jatrini - Excelente - 12/MAR/2019

End With

' Actualizar última fila


Range("C6").Value = Split(Range("C6").Value, ":")(0) & ":C" &
Cells(Rows.Count, "C").End(xlUp).Row

' Crear correo


Set Rango =
Sheets("Pendientes").Range([indirect("C6")]).SpecialCells(xlCellTypeVisible)
Set CorreoApp = CreateObject("Outlook.Application")
Set Correo = CorreoApp.CreateItem(0)

With Correo
.To = Sheets("Pendientes").Range("C9")
.CC = Sheets("Pendientes").Range("C10")
.BCC = Sheets("Pendientes").Range("C11")
.Subject = Sheets("Pendientes").Range("C7") &
Sheets("Pendientes").Range("C8")
.HTMLBody = ConvertirAHTML(Rango)
.Display
'.Send
End With

' Fin
With Application
.EnableEvents = True
.ScreenUpdating = True
End With

' Proteger hoja y al inicio


Sheets("Pendientes").Protect
Range("A1").Select

End Sub

Function ConvertirAHTML(Rango As Range)

Dim FSO As Object


Dim TS As Object
Dim TempFich As String
Dim TempWB As Workbook

' Copiar el rango a un nuevo libro


Rango.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
End With

' Publicar el rango en HTML


TempFich = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") &
".htm"
With TempWB.PublishObjects.Add( _

24
jatrini - Excelente - 12/MAR/2019

SourceType:=xlSourceRange, _
Filename:=TempFich, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With

' Leer y devolver el HTML


Set FSO = CreateObject("Scripting.FileSystemObject")
Set TS = FSO.GetFile(TempFich).OpenAsTextStream(1, -2)
RangetoHTML = TS.readall
TS.Close
ConvertirAHTML = Replace(RangetoHTML, "align=center x:publishsource=",
"align=left x:publishsource=")

' Cerrar el libro temporal y borrar el fichero temporal


TempWB.Close savechanges:=False
Kill TempFich

End Function

25
jatrini - Excelente - 12/MAR/2019

6 FORMATOS CONDICIONALES

6.1 DESTACAR CELDAS CON FECHA MENOR A LA ACTUAL

Es TRUE para cada elemento de la columna A si su fecha es menor que la actual.


=$A1<NOW()

6.2 DESTACAR VALORES NO ENCONTRADOS EN UNA LISTA

Es TRUE si en una fila se cumple: el valor de la celda de la columna A es un número, el valor de


la B es distinto de la cadena “Interno”, el valor de la C mayor que cero, no se encuentra el valor
de la celda de la columna A en la columna D, y el valor de la celda de la columna E es
“Planificación”.
=AND(ISNUMBER($A1);$B1<>"Interno";$C1>0;IF(ISNA(VLOOKUP($A1;$D:$D;1;FALSE));TR
UE;FALSE);$E1="Planificación")

6.3 CONSTRUIR UN DIAGRAMA DE GANTT CON FORMATO CONDICIONAL

Tenemos por ejemplo las cabeceras de las semanas en el formato “WXX” en las celdas O1 a
BN1. De la fila 2 a la 10, por ejemplo, las tareas. En la columna M tenemos calculado el número
de la semana de inicio, y en la N el de la semana de fin de cada tarea.

Definimos el formato condicional, eligiendo el relleno que consideremos oportuno:


=AND($M2>0;VALUE(RIGHT(O$1;2))>=$M2;VALUE(RIGHT(O$1;2))<=$N2)

Para el rango:
=$O$2:$BN$10

26
jatrini - Excelente - 12/MAR/2019

7 TRUCOS

7.1 CAMBIAR TIPO DE CELDA REFERENCIADA EN LA BARRA DE FÓRMULA

Pulsando F4 irá cambiando, por ejemplo: =A1 → =$A$1 → =A$1 → =$A1.

7.2 EVALUAR FÓRMULA EN LA BARRA DE FÓRMULA

Cuando se edita una fórmula, se puede evaluar para introducir el valor calculado en vez de la
fórmula pulsando la tecla F9. También funciona seleccionando parte de la fórmula.

7.3 INTERCAMBIAR VISUALIZACIÓN ENTRE VALORES Y FÓRMULAS

Pulsando [CTRL + `]. También existe una opción de menú.

7.4 DEPURACIÓN DE FÓRMULA

Con esta opción de menú se puede depurar la fórmula de la casilla paso a paso. También son
útiles las opciones de ver precedentes, dependientes y comprobación de errores.

7.5 OPCIONES DE CÁLCULO

A veces ocurre que después de modificar el valor de las celdas involucradas en el cálculo de
una fórmula, el resultado no se modifica. Cuando esto sucede se debe a la configuración del
cálculo automático de fórmulas.

Existen cuatro opciones: Automático (comportamiento predeterminado), Automático excepto


para tablas de datos, Manual, Volver a calcular libro antes de guardar. Para los casos no
automáticos, pulsando F9 se actualiza el cálculo.

Esta opciones se pueden cambiar en el menú de configuración y también existe una opción de
menú.

27
jatrini - Excelente - 12/MAR/2019

7.6 COPIAR/DUPLICAR RÁPIDAMENTE

Se puede hacer con “arrastrar y soltar” mientras se pulsa la tecla [CTRL]. Funciona con hojas,
rangos, celdas, etc.

7.7 AÑADIR UN VALOR A UN RANGO

Poner el valor en cualquier celda en blanco y copiarlo al portapapeles. Seleccionar el rango de


valores a incrementar. Ir a “Pegado Especial” y seleccionar “Añadir”.

También se pueden hacer un resta, multiplicación o división.

7.8 ENCONTRAR UNA REFERENCIA A LIBRO EXTERNO

Usar la opción de búsqueda. Una vez abierto el diálogo, buscar en el libro entero el texto “.xl.”.

Si el libro sigue dando problemas al abrir, revisar también las posibles referencias en los
formatos condicionales.

7.9 FICHERO CORRUPTO; TAMAÑO GRANDE

Grabar el libro con formato “xlsx”. Cambiar la extensión a “.zip” y decomprimirlo. Revisar los
ficheros, debe haber un directorio con las hojas y un fichero “xml” por cada hoja. Abrir el de
mayor tamaño.

Un ejemplo puede ser que exista un atributo tal y como este para cada columna:

<xsd:attribute name="dyDescent" type="xsd:double"/>

En este caso, este atributo hace referencia a la colocación del texto dentro de la celda.
Seleccionando todas las celdas, cambiando el formato de esta propiedad, y grabando
finalmente el fichero, el problema queda solucionado.

7.10 REGLAS FORMATO CONDICIONAL DUPLICADAS

Se trata de un error, corregido en el parche KB3114374:

28
jatrini - Excelente - 12/MAR/2019

https://support.microsoft.com/es-es/help/3114374/december-8-2015-update-for-excel-2016-
kb3114374

• Al copiar y pegar las celdas que tienen el conjunto de formato condicional en


Excel 2016, las reglas de formato condicionales se duplican a pesar de las reglas
que ya existen en las celdas.
Nota: después de aplicar la actualización, deberá seguir las instrucciones de la
sección "información del registro" para corregir este problema.

Añadir/Editar con “regedit” la entrada de registro:

HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Options

Valor DWORD: ReplaceCFOnPaste con valor: “1” (sin comillas).

7.11 PROBLEMAS AL ROMPER VÍNCULOS

Tras copiar celdas o hojas de otras hojas excel es posible que nos encontremos con referencias
no visibles en nuestro fichero. La opción de romper vínculos no funciona, quedando el vínculo
siempre presente. Conviene revisar los formatos condicionales de las hojas y celdas que se han
copiado, porque a veces ese vínculo se encuentra en dicho formato. Borrando el formato ya es
posible posteriormente eliminar el vínculo.

7.12 FILTRO AVANZADO (VARIOS CRITERIOS)

Para hacer filtros por varios criterios, se especifican en un rango las cabeceras de los campos a
filtrar, y en las columnas de dicho rango se enumeran los valores por los que se quiere filtrar.
Las columnas suponen operadores “O” del filtro, mientras que las filas “Y”, interpretándose la
celda vacía como cualquier valor. Posteriormente, se elige la opción de menú “Filtro
Avanzado”, detallando el rango donde están los valores a filtrar y el rango donde se
encuentran los criterios.

7.13 RECURSOS WEB

Genéricos/Trucos:

● http://chandoo.org/wp/
● http://www.rondebruin.nl/
● http://spreadsheetpage.com/

Gráficos:

● https://sites.google.com/site/e90e50charts/

29

También podría gustarte