Saltar al contenido

Comentario emergente dependiente de otra celda


Recommended Posts

publicado

Hola:

El motivo de la consulta es el siguiente:

Quiero saber si hay posibilidad de que al pasar el ratón por encima de una celda me salga un comentario, pero en el que aparezca el texto que hay en otra celda. El valor de esta última celda puede variar, de manera que el comentario irá variando en función de esa celda.

He estado tratando de hacerlo de forma sencilla (con los comentarios normales) pero no soy capaz. No sé si con VBA se podrá hacer.

Muchas gracias de antemano.

publicado

Agus72, revsia el anexo, el texto que quieres que se vea lo escribes en la ceda de color amarillo, y al pasar el raton sobre la celda en color gris se vera el comentario.

lo único que hace la macro es cambiar el comentario de la celda C2 cada vez que cambia el texto de la celda J2, suerte

Comentario en Celda.xls

publicado

Gracias bigpetroman. Funciona muy bien. Pero tengo dos cuestiones más al respecto: las celdas en las que tienen que salir los comentarios es toda una columna y, el motivo de que el valor de las celdas cambien es porque vienen determinados por una función de SI unida a una de BUSCARV. Es decir, que funciona para un valor o un texto en esa celda amarilla que me has puesto, pero si incluyo una función, ya no funciona. ¿Cómo se podría arreglar eso?. Muy agradecido de nuevo.

publicado

Muchas gracias bigpetroman. Lo adaptaré y te responderé, pero creo que ahora sí que hemos acertado.

- - - - - Mensaje combinado - - - - -

Ya lo he adaptado pero me salen dos problemillas (utilizaré el ejemplo del archivo adjunto): primero, los valores de la columna B no son valores escritos a mano, si no que vienen determinados por una fórmula (como la que puse, es decir, una de búsqueda), lo cual hace que el comentario no se actualice, a no ser que edite de nuevo la función. Y, segundo, para rizar el rizo: cuando en la columna C no haya valores (es decir, el resultado de la fórmula de búsqueda es nulo) que no haya comentario. Por lo que he podido deducir, para que funcione bien, primero tengo que insertar el comentario en la celda (y no editarlo), después escribir el valor en la columna B y, por último, el de la C, ¿es así, no?. Bueno, siento ser tan pesado, pero el que no sabe es como el que no ve... y yo debo de ser muy ciego, pero tengo ideas. Lástima que mis conocimientos no me acompañen en esas ideas. Gracias de nuevo.

publicado

Bueno, mando el enlace del archivo (simplificado). Me ha costado un poco más porque pesa mucho más de lo que permite el servidor. Vamos a ver si logro explicarme bien. En la hoja de asignaturas pendientes aparecen aquéllos alumnos que tienen alguna asignatura pendiente de algún curso anterior, de manera que al final me suma aquellas que están suspendidas y en la siguiente columna el nombre de esas asignaturas (seguro que se puede hacer mejor, pero aunque chapucero, funciona de la forma en que está). Ese número de asignaturas aparecen en la hoja de "Notas 3º ESO-1ªEV" en la columna R y en la columna S aparecen los nombres de esas asignaturas. Como ves, esos valores son los que me rescata desde la hoja "Asignat pendientes". Pues en la hoja de Notas , en la columna R donde quiero que aparezcan esos comentarios. Como ves he puesto 3 alumnos con asignaturas pendientes y dos sin ellas. Pues en esos 3, que aparezcan los comentarios con los nombres de las asignaturas y en los 2 "lumbreras":untroubled: que no aparezca el comentario emergente (si puede ser, aunque no me preocupa demasiado). Pero eso sí, que en el momento en el que yo actualice la hoja de Asignat pendientes, automáticamente se actualice en la otra hoja el comentario. Después de todo este rollo, solo espero no quitar demasiado tiempo y que resulte clarificador todo. Muchas gracias, de verdad, por todo. El archivo está en este enlace: https://www.dropbox.com/s/glxu5f4w90dwy8u/Hoja%20de%20notas.xls

publicado

Amigo Agus72, coloca este codigo en el modulo de la hoja Notas 3º ESO-1ªEV y borra el otro codigo que tienes alli, pruebalo y nos cuenta.

Nota: esto va a borrar las formulas que tienes en la columna S

Private Sub Worksheet_Activate()
Dim nTotDatos As Double
Dim rMiCelda As Range

ActiveSheet.Unprotect
Application.ScreenUpdating = False
nTotDatos = Range("B" & Rows.Count).End(xlUp).Row + 1
Range("R4:R" & nTotDatos).ClearComments

For Each rMiCelda In Range("R4:R" & nTotDatos)
rMiCelda.Offset(0, 1).FormulaR1C1 = _
"=IF(ISNA(VLOOKUP(RC[-17],'Asignat pendientes'!R5C1:R500C79,79,0)),"""",VLOOKUP(RC[-17],'Asignat pendientes'!R5C1:R500C79,79,0))"
rMiCelda.Offset(0, 1).Value = rMiCelda.Offset(0, 1).Value
If rMiCelda.Offset(0, 1).Value <> "" Then
rMiCelda.AddComment rMiCelda.Offset(0, 1).Value
End If
rMiCelda.Offset(0, 1).Value = ""
Next

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub[/CODE]

Suerte

publicado

IMPRESIONANTE!!!!.Funciona en el archivo que te mandé a la perfección. Al acoplarlo al archivo original, lo que me he dado cuenta es que cada vez que abro la hoja en la que están los datos, tarda mucho en actualizarse y, lo hace cada vez que la abro, lo cual retarda bastante el trabajo. ¿Es normal?. ¿Se podría solucionar para que solo se actualizara cuando hay cambios en la hoja de Asignat pendientes?. Y, ¿la columna S es innecesaria y, por tanto la borraría en otras hojas, o es necesaria y la macro la necesita aunque borre las funciones?. Gracias por tu inestimable tiempo y atención.

publicado

ok Agus72, reemplaza el código por este otro.

Private Sub Worksheet_Activate()
Dim nTotDatos As Double
Dim rMiCelda As Range

ActiveSheet.Unprotect
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
nTotDatos = Range("B" & Rows.Count).End(xlUp).Row + 1
Range("R4:R" & nTotDatos).ClearComments

For Each rMiCelda In Range("R4:R" & nTotDatos)
rMiCelda.Offset(0, 1).FormulaR1C1 = _
"=IF(ISNA(VLOOKUP(RC[-17],'Asignat pendientes'!R5C1:R500C79,79,0)),"""",VLOOKUP(RC[-17],'Asignat pendientes'!R5C1:R500C79,79,0))"
rMiCelda.Offset(0, 1).Value = rMiCelda.Offset(0, 1).Value
If rMiCelda.Offset(0, 1).Value <> "" Then
rMiCelda.AddComment rMiCelda.Offset(0, 1).Value
End If
rMiCelda.Offset(0, 1).Value = ""
Next

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub[/CODE]

es lo mismo, solo que coloque el calculo manual al principio y al final el cálculo automático de la hoja; prueba y nos avisa

publicado

Hola bigpetroman: pensé que no tendría que volver a molestar, pero me equivoqué. Lo que me hiciste funciona perfectamente, solucionando todos los problemas que observé. Ahora me ha surgido otro problema y creo que he dado con la clave pero el problema es mi ignorancia. En algunas hojas en las que he puesto el código que me suministraste tengo otro proceso (Private Sub Worksheet_Change, con dos subprocesos) y cuando se empiezan a ejecutar los dos procesos (el tuyo y el mío) me saltan los errores. He deducido que puede ser porque acceden a las celdas al mismo tiempo y por cuestiones de bloqueo de celdas se "pisan" ambos procesos. Buceando por internet he visto un SyncLock que no sé si sería la solución, es decir, hacer que uno de los procesos se ejecute y cuando acabe, que el empiece el siguiente. El problema es que no sé cómo hacer esto. ¿podrías ayudarme nuevamente?. Estos son los dos códigos y he señalado en rojo lo que me dice para depurar. Ya me contarás si sabes algo. Gracias de nuevo.

Private Sub Worksheet_Change(ByVal Target As Range)

'Por.DAM

If Not Intersect(Target, Range("F4:F50,J4:J50,N4:N50," & _

"R4:R50,V4:V50,Z4:Z50," & _

"AD4:AD50,AH4:AH50,AL4:AL50," & _

"AP4:AP50,AT4:AT50,AX4:AX50," & _

"BB4:BB50")) Is Nothing Then

'Application.EnableEvents = False

Application.ScreenUpdating = False

a1 = Array(Columns("F").Column, Columns("J").Column, Columns("N").Column, _

Columns("R").Column, Columns("V").Column, Columns("Z").Column, _

Columns("AD").Column, Columns("AH").Column, Columns("AL").Column, _

Columns("AP").Column, Columns("AT").Column, Columns("AX").Column, _

Columns("BB").Column)

a2 = Array(Columns("C").Column, Columns("D").Column, Columns("E").Column, _

Columns("F").Column, Columns("G").Column, Columns("H").Column, _

Columns("I").Column, Columns("J").Column, Columns("K").Column, _

Columns("L").Column, Columns("M").Column, Columns("N").Column, _

Columns("O").Column)

For i = LBound(a1) To UBound(a1)

If Target.Column = a1(i) Then

Exit For

End If

Next

hoja = ActiveSheet.Name

Sheets("Notas 3º ESO-Septiembre").Select

Sheets("Notas 3º ESO-Septiembre").Cells(Target.Row, a2(i)).Select

If Target >= 1 And Target <= 4 Or Target = "NP" Then

ponval

ElseIf Target >= 5 And Target <= 10 Or Target = "ET" Or Target = "CONV" Then

ponnum Target.Value

End If

Sheets(hoja).Select

'Application.EnableEvents = True

Application.ScreenUpdating = True

End If

End Sub

Sub ponval()

With Selection.Validation

.Delete

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _

Operator:=xlBetween, Formula1:="NP,1,2,3,4,5,6"

.IgnoreBlank = True

.InCellDropdown = True

.InputTitle = ""

.ErrorTitle = ""

.InputMessage = ""

.ErrorMessage = ""

.ShowInput = True

.ShowError = True

End With

Selection = ""

End Sub

Sub ponnum©

With Selection.Validation

.Delete

.Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _

Operator:=xlBetween

.IgnoreBlank = True

.InCellDropdown = True

.InputTitle = ""

.ErrorTitle = ""

.InputMessage = ""

.ErrorMessage = ""

.ShowInput = True

.ShowError = True

End With

Selection = c

End Sub

Private Sub Worksheet_Activate()

Dim nTotDatos As Double

Dim rMiCelda As Range

ActiveSheet.Unprotect

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

nTotDatos = Range("B" & Rows.Count).End(xlUp).Row + 1

Range("BE4:BE" & nTotDatos).ClearComments

For Each rMiCelda In Range("BE4:BE" & nTotDatos)

rMiCelda.Offset(0, 1).FormulaR1C1 = _

"=IF(ISNA(VLOOKUP(RC[-56],'Asignat pendientes'!R5C1:R500C79,79,0)),"""",VLOOKUP(RC[-56],'Asignat pendientes'!R5C1:R500C79,79,0))"

rMiCelda.Offset(0, 1).Value = rMiCelda.Offset(0, 1).Value

If rMiCelda.Offset(0, 1).Value <> "" Then

rMiCelda.AddComment rMiCelda.Offset(0, 1).Value

End If

rMiCelda.Offset(0, 1).Value = ""

Next

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

Application.Calculation = xlCalculationAutomatic

Application.ScreenUpdating = True

End Sub

publicado

amigo Agus72, asi es complicado, eso no se entiende, lo mejor es subir siempre un archivo para revisar bien como trabaja el código, si pesa mucho puedes subirlo a dropbox o cualquier otro servicio de alojamiento.

de todas formas tu problema creo es que se ejecuta tu codigo constantemente cuando se estan colocando los comentarios, así que hagamos lo siguiente:

coloca esto al principio del modulo de la hoja

Private bEjecutando As Boolean

ahora, en el procedimiento Private Sub Worksheet_Change(ByVal Target As Range)

coloca esto en la primera linea

If bEjecutando = True Then Exit Sub

y por último en e procedimiento Private Sub Worksheet_Activate()

coloca esto:

bEjecutando = True

antes de esta línea

ActiveSheet.Unprotect

y colocas esto

bEjecutando = False

despues de esta línea

Application.ScreenUpdating = True

esto lo que hace es que evita que se ejecute el evento Worksheet_Change mientras se esten colocando los comentarios a las celdas, suerte

publicado

Tienes toda la razón del mundo bigpetroman, es muy complicado ver estas cosas en el aire. Es más, he probado lo que me has propuesto y no ha funcionado, no sé si es que yo no lo he hecho bien, o es que no estaba bien. Así que mando el archivo resumido y con aclaraciones para ver si eres capaz de solucionarme el problema, seguro que sí. Enlace del archivo: https://www.dropbox.com/s/glxu5f4w90dwy8u/Hoja%20de%20notas.xls. Gracias de nuevo y espero que con esto esté listo y resuelto todo y, así, no molestarte más.

publicado

amigo, abri el archivo y no me da ningún error, y hay codigo en una sola hoja, y tu dices que has colocado los codigos en otras hojas, debes subir el archivo que te esta dando problemas, porque así no podemos adivinar, necesitamos ver el codigo trabajando para ver donde está el problema.

publicado

Hola bigpetroman. Efectivamente mandé el archivo limpio, para que si al poner "tú" las cosas no cometías los mismos errores que yo...era por facilitar las cosas. No pasa nada. Ya están puestas y a medida que las iba colocando iba probando. Los códigos que me suministraste no hacen falta (a falta de evaluar la hoja "Notas 3º ESO-Septiembre"). El problema viene en la hoja de "Notas 3º ESO-Septiembre". Como sufre cambios determinados por la hoja anterior, genera el error. Los comentarios salen sin problemas, pero si ahora genero algún cambio en la hoja "Notas 3º ESO-Junio", entonces me sale el cuadro con el error. Míralo y ya me dirás. Gracias por todo. Enlace al archivo: https://www.dropbox.com/s/glxu5f4w90dwy8u/Hoja%20de%20notas.xls

publicado

Amigo tu problema viene porque cuando hay cambios en una hoja saltas para otra, esa hoja esta protegida y estas intentando hacer cambios con la hoja protegida, por eso es el error, cambia esto de tu hoja Notas 3º ESO-Junio

hoja = ActiveSheet.Name
Sheets("Notas 3º ESO-Septiembre").Select
Sheets("Notas 3º ESO-Septiembre").Cells(Target.Row, a2(i)).Select
If Target >= 1 And Target <= 4 Or Target = "NP" Then
ponval
ElseIf Target >= 5 And Target <= 10 Or Target = "ET" Or Target = "CONV" Then
ponnum Target.Value
End If
[/CODE]

por esto otro

[CODE]hoja = ActiveSheet.Name
Sheets("Notas 3º ESO-Septiembre").Select
ActiveSheet.Unprotect
Sheets("Notas 3º ESO-Septiembre").Cells(Target.Row, a2(i)).Select
If Target >= 1 And Target <= 4 Or Target = "NP" Then
ponval
ElseIf Target >= 5 And Target <= 10 Or Target = "ET" Or Target = "CONV" Then
ponnum Target.Value
End If
ActiveSheet.Protect[/CODE]

con eso deberias eliminar ese error, lo otro es que creo que te estas complicando mucho con ese archivo, si quieres luego que soluciones este problema me contactas por privado y trato de ayudarte con este archivo, suerte

publicado

Querido amigo bigpetroman. Parece que funciona a las mil maravillas. Muchas gracias por tu ayuda prestada y por la que te brindas a darme en el futuro. La razón de mis complicaciones es el desconocimiento de todo este lenguaje que, a duras penas me da para modificar algunos parámetros por propia deducción. Además, mi cabeza va más rápida y voy pensando en cosas que se pueden hacer para favorecer mi trabajo a lo largo del curso y el de mis compañeros, para llevar un buen registro de las notas de nuestros alumnos. Todo eso hace que vaya poniendo parches que voy cogiendo de aquí y de allá gracias al trabajo de gente que, como tú, se brinda a compartir su tiempo y sus conocimientos con el resto de los mortales. Después de todo este rollo, te vuelvo a dar las gracias por todo y ya me comentarás cómo comunicarme contigo y qué te mando, qué te explico y demás. Atentamente.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.