domingo, 24 de marzo de 2024

76 - Diferencias entre Notas y Comentarios. Cómo agregarlos mediante VBA.

En entradas anteriores (Nov.2018 y Abr.2019) vimos diferentes modelos de Comentarios. Cómo formatearlos (formas, colores e imágenes) y además cómo programar en VBA el agregado o modificación de estos objetos. 

Estos temas fueron mostrados en mi canal Soluciones Excel, en los siguientes videos:

Nº 17: Agregar COMENTARIOS en hoja Excel   (no apto para versiones Excel 365)

Nº 24: Comentarios en Excel mediante programación VBA    (no apto para versiones Excel 365)

Ahora, con la llegada de la versión Excel 365, los antiguos 'comentarios' pasaron a llamarse 'Notas'. Estos objetos Notas todavía conservan la posibilidad de cambios en sus formatos (colores, formas e imagen). Y en VBA siguen llamándose Comment.

Los nuevos Comentarios en cambiono permiten el cambio de formato. Pero sí permiten el agregado de respuestas en dicho cuadro.

En esta nueva versión 365, al seleccionar una celda con comentario, se abrirá un panel lateral a la derecha mostrando el texto original y la posibilidad de agregar una respuesta que se publicará al presionar el botón verde. Y así se irán viendo los autores, fecha y texto de las diferentes respuestas.


Y en VBA, el término 'Comment' pasa ahora a llamarse CommentThreaded.

Veamos un ejemplo de cómo agregar comentarios y respuestas en VBA, ya sea en las versiones clásicas de Excel y en versión 365:

A continuación evaluaremos el cambio en las celdas de dos columnas.  

Si se trata de la columna C agregaremos una NOTA. Si la celda ya presenta una NOTA se sobrescribirá. Y si se borra la celda, también se borrará la NOTA.

En cambio si se trata de la columna I agregaremos COMENTARIOS. Si se borra la celda, se mostrará el cambio como un nuevo comentario.

 Private Sub Worksheet_Change(ByVal Target As Range)

'no se evalúan los cambios en fila 1 ni tampoco si se han seleccionado varias celdas

If Target.Count > 1 Or Target.Row = 1 Then Exit Sub


'si el cambio se da en col 3 (C) se deja solo una NOTA

If Target.Column = 3 Then


    Target.ClearComments    'otra opción: evaluar si hay una nota o no.

    Target.AddComment "Compartir este evento con Jose Luis."


    

'si el cambio se da en col I de la tabla de costos se agrega como Comentarios el nombre del usuario y el importe ingresado. 

ElseIf Target.Column = 9 Then


    'evaluar si la celda no tiene aún comentario, o sea es el primero a registrar

    If Target.CommentThreaded Is Nothing Then

        Target.AddCommentThreaded Application.UserName & "_" & Target.Value

    Else

        'si ya tiene algún comentario se agrega una 'respuesta'

        Target.CommentThreaded.AddReply Application.UserName & "_" & Target.Value

    End If

End If

End Sub



NOTA: Si utilizamos el mismo libro en diferentes versiones, los comentarios creados en versión Excel clásico se verán en Excel 365 tal como fueron creados, solo que ahora estarán en el menú 'Notas'.
En cambio los nuevos comentarios creados desde Excel 365, al pasarlos a la versión Excel clásico se verán como los de siempre (con formato) y con un aviso de parte de Microsoft, donde se informa de que los cambios realizados aquí ya no se verán como 'Respuestas' en la versión 365.



Ver video N° 76 desde aquí.


martes, 12 de marzo de 2024

75 - Ejecutar macros dinámicamente

 Las macros en Excel pueden ejecutarse de varias maneras:

- al clic de un botón ActiveX, un botón de la barra Formulario o algún control dentro de un Userform.

- al clic en algún objeto incrustado en la hoja.

- con la instrucción Call nombre_de_macro . De esta manera las llamamos desde cualquier otro proceso. Por ejemplo: al abrir un Userform deseamos primeramente ordenar una lista para rellenar algún control ComboBox o ListBox, tendremos una instrucción del tipo: Call ordena_Clientes

- desde algún evento de Libro o de Hojas.

- de modo dinámico. Es decir, que sin invocar su nombre, podremos llamar a la macro por el contenido de alguna celda o selección dentro de un desplegable.

Las macros ya estarán ubicadas en un módulo. El nombre de cada macro tendrá que coincidir con el contenido de las celdas o con los elementos de una lista desplegable si fuera el caso.

Ejemplo Nº 1:  al doble clic en celdas de meses o conceptos de Caja, se llamará a la macro según el contenido de la celda: En la hoja de Caja, se colocará el siguiente código:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'controla posible error al seleccionar una celda sin macro asociada.

On Error Resume Next                

'ejecuta la macro cuyo nombre coincida con el contenido de la celda activa 

Application.Run (Target.Value) 

'coloca el foco en otra celda. Aquí, 1 fila hacia abajo en la misma columna. 

Target.Offset(1, 0).Select

 

End Sub

                    


 

Ejemplo Nº 2:  al seleccionar algún elemento del desplegable, se ejecutará la macro cuyo nombre coincida con el elemento seleccionado. El código ubicado en el Userform será:

Private Sub ComboBox2_Click()
On Error Resume Next
Application.Run (ComboBox2.Text)
End Sub


                
            En uno o varios módulos tendremos las macros:

Sub INGRESOS()

MsgBox "Estoy ejecutanto la macro de INGRESOS!"

End Sub 

Sub EGRESOS()

MsgBox "Estoy ejecutanto la macro de EGRESOS!"

End Sub


Sub ENERO()

MsgBox "Estoy ejecutanto la macro de ENERO!"

End Sub

Sub FEBRERO()

MsgBox "Estoy ejecutanto la macro de FEBRERO!"

End Sub


Sub TALLER_CORTE()

MsgBox "Estoy ejecutanto la macro de TALLER_CORTE!"

End Sub

Sub TALLER_COSTURA()

MsgBox "Estoy ejecutanto la macro de TALLER_COSTURA!"

End Sub

NOTA: En caso de tener otras hojas donde los nombres, por ejemplo de Meses, aparecen en minúscula se antepondrá la función UCASE al valor de la celda.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim nbreHoja As String

If Target.Column = 3 And Target.Row > 2 Then

    nbreHoja = UCase(Target.Value)      'convertir texto en mayúsculas

    Application.Run (nbreHoja)

    Target.Offset(1, 0).Select

End If

End Sub

 


 

                    Ver video Nº 75 desde aquí.