Como mejorar Macro que utilizo

Pregunta para Elsa Matilde

Tengo esta macro y necesito mejorarla ya que en otras hojas donde debo comenzar a tildar es A1 y termina en Y1 o puede ser que terminen las columnas en DA1

Lo que veo también que la macro deja de funcionar a partir de CS y luego no sigue.

¿Por otro lado si yo no tengo en la hoja Excel que trabajo la fuente Webdings se podrá
elegir otra fuente?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'Exit Sub

'La fuente de las columnas con las asignaturas debe ser Webdings

If Not ActiveCell.Row < 11 And _
Not ActiveCell.Column < 12 Then 'Adaptar el número de fila y columna de comienzo
If ActiveCell.Font.Name = "Webdings" Then
If ActiveCell = "" Then
ActiveCell = "a"
ActiveCell.Offset(, 1) = "P"
Else
ActiveCell = ""
ActiveCell.Offset(, 1) = ""
End If
ActiveCell.Offset(, 1).Select
End If
End If
End Sub

1 respuesta

Respuesta
3

Primero debieras evaluar cuáles son tus rangos dependiendo del modelo. Para eso podrías dejar en un módulo este código. Te servirá para cualquier modelo.

Public ini As Integer, fini As Integer
Sub extremos()
'primera columna
If [A13] = "" Then
    ini = 1
Else
    ini = Range("A13").End(xlToRight).Column
End If
'ultima columna ocupada
fini = Range("DX13").End(xlToLeft).Column
End Sub

Luego en el evento de tu hoja, lo iniciarás de este modo:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call extremos
'-------------------
ini = ini + 6           'ajustar o realizar una búsqueda de la primera col a tildar
'-------------------
'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row < 14 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'a partir de aquí tu proceso de marcado.
End Sub

Según tu última imagen, tu rango iniciará en fila 14 ya que en la 13 están los títulos, por eso en la línea ajusté el valor 11 por 14.

Lo que falta evaluar es si siempre el inicio del tildado será a la misma distancia del inicio de la tabla. Es decir, que si tu tabla comienza en F (col 6) la zona de evaluación inicia en L (col 12).

Sino, habrá que buscar el texto que nos identifique cuál es la primera columna a tildar.

Con respecto a la macro, estás evaluando si la celda está vacía o no. Y lo que se observa en la imagen es que luego de CS están vacías y si no le asignaste la fuente no va a mostrar nada.

Con respecto a la fuente, si no tenés la Webdings debieras ir a menú INSERTAR, SIMBOLOS, y buscar alguna fuente que tenga el caracter del tilde o el que quieras colocar.

Elsa buenas tardes, para mejorar este archivo coloque el Mes como texto para identificar donde debe comenzar la macro a su sugerencia.

por otro lado, no me funciona la macro algo he realizado mal

Pero para mas seguridad le pase el archivo a su email.

Esta macro esta en el Modulo 1

Sub extremos()
'primera columna
If [A13] = "" Then
ini = 1
Else
ini = Range("A13").End(xlToRight).Column
End If
'ultima columna ocupada
fini = Range("DX13").End(xlToLeft).Column
End Sub

///////////////////////////////////////////////////////////////

Esta macro esta en la Hoja1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call extremos
'-------------------
ini = ini + 6 'ajustar o realizar una búsqueda de la primera col a tildar
'-------------------
'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row < 14 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'a partir de aquí tu proceso de marcado.

'Exit Sub

'La fuente de las columnas con las asignaturas debe ser Webdings

If Not ActiveCell.Row < 11 And _
Not ActiveCell.Column < 12 Then 'Adaptar el número de fila y columna de comienzo
If ActiveCell.Font.Name = "Webdings" Then
If ActiveCell = "" Then
ActiveCell = "a"
ActiveCell.Offset(, 1) = "P"
Else
ActiveCell = ""
ActiveCell.Offset(, 1) = ""
End If
ActiveCell.Offset(, 1).Select
End If
End If


End Sub

Saludos, Juan Carlos

Cuando dejamos un código o macros, deben copiarlas tal cual. Te dejaste la primer línea con la declaración de las variables compartidas entre las 2 macros. Por eso son públicas.

Public ini As Integer, fini As Integer    '*** NO OLVIDAR ESTA LÍNEA ****
Sub extremos()
'primera columna
If [A13] = "" Then
    ini = 1
Else
    ini = Range("A13").End(xlToRight).Column
End If
'ultima columna ocupada
fini = Range("DX13").End(xlToLeft).Column
End Sub

Ahora probalo todo de nuevo y luego me comentas si necesitas que te agregue la búsqueda de la col de inicio. Y espero que mejores tu votación.... o te estabas votando a vos mismo??? jajaja  ;)

Sdos!

Y otro detalle, en el evento de tu Hoja1.

Si ya se está controlando que el rango se encuentre luego de la fila de títulos:

'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row < 14 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'a partir de aquí tu proceso de marcado.

Te comenté que había reemplazado la fila 11 por la 14...... entonces no es necesario que vuelvas a colocar estas instrucciones donde volvés a comparar con la fila 11 ;(

Copiá lo siguiente OMITIENDO las instrucciones inhabilitadas de tu código anterior:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call extremos
'-------------------
ini = ini + 6           'ajustar o realizar una búsqueda de la primera col a tildar
'-------------------
'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row < 14 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'a partir de aquí tu proceso de marcado.
'Exit Sub
'La fuente de las columnas con las asignaturas debe ser Webdings
'If Not ActiveCell.Row < 11 And _
   Not ActiveCell.Column < 12 Then 'Adaptar el número de fila y columna de comienzo
   If ActiveCell.Font.Name = "Webdings" Then
      If ActiveCell = "" Then
         ActiveCell = "a"
         ActiveCell.Offset(, 1) = "P"
      Else
         ActiveCell = ""
         ActiveCell.Offset(, 1) = ""
      End If
      ActiveCell.Offset(, 1).Select
   End If
'End If
End Sub

Este código va en la HOJA1, no en un módulo.

Sdos!

¡Gracias! Elsa, hay 2 elementos que quisiera ver la posibilidad de cambiarlo 

1 La fuente que utilizo normalmente en las hojas es "Calibri 11"

Cuan marco la celda para ejecutar la macro que posibilidad es que regrese a la celda donde se marco (Marque en L14 y se detiene en M14)podrá la macro finalizar en este ejemplo en  L14 

Saludos

Me enviaste ya 3 modelos diferentes de hojas y no sé cuál es la definitiva ;)

Como la fuente Calibrí no tiene el tilde, tendrás que optar por otro criterio. Podría dejar la letra 'a' en rojo como te queda en esa fuente.

Pero te presento otra opción. En mi ejemplo opté por color de fondo. 

En cualquiera de los 2 o 3 modelos de hoja que ya tenés, lo que hará la macro es evaluar si el primer caracter de la fila del título es un número. En ese caso se trata de la fecha y no lo marcará.

Y de este modo te servirá para cualquiera de tus hojas. Y todo el código te quedaría así:

En un módulo:

Public ini As Integer, fini As Integer    '*** NO OLVIDAR ESTA LÍNEA ****
Sub extremos()
'primera columna
If [A13] <> "" Then       'en el tercer modelo debes colocar 5 en lugar de 13
    ini = 1
Else
    ini = Range("A13").End(xlToRight).Column      '5
End If
'ultima columna ocupada
fini = Range("DX13").End(xlToLeft).Column         '5
End Sub

En la HOJA:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call extremos
'-------------------
ini = ini + 6           'ajustar o realizar una búsqueda de la primera col a tildar
'-------------------
'si la celda seleccionada no está en el rango posible, cancela. AJUSTAR en otros modelos de hoja
If ActiveCell.Row < 14 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'si el título inicia con un número, es fecha y no se marca
  If Not IsNumeric(Left(Cells(13, Target.Column), 1)) Then
      If ActiveCell.Interior.ColorIndex < 0 Then
         ActiveCell.Interior.ColorIndex = 9       'asignar el nro de color a gusto
         ActiveCell.Offset(, 1) = "P"
      Else
        ActiveCell.Interior.ColorIndex = xlNone     'quita el color y el valor 
         ActiveCell.Offset(, 1) = ""
      End If
      Target.Select      'se vuelve a la celda seleccionada
   End If
End Sub

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas