Macro no funciona al cambio que realice de fila y columna

Para Elsa Matilde

Realice algunos cambios de comienzo tanto en la columna como en la fila y no logro que funcione la macro que me permite posicionarme en la fecha por ej. H13 y en la I13 coloque "P".

A su vez busco que mientras tenga datos en la cabecera la macro funcione, esto se debe que según las fechas podría ser de mas o menos columnas a tildar y colocar la "P".

Por ultimo para otra oportunidad si la hoja de comenzar como en este ejemplo D12 comienza H7 o B15 en la macro donde debo realizar los cambios.

Espero que me pueda entender a resolver este tema.

La macro es esta

En el Modulo

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

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

En la hoja

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call extremos
'-------------------
ini = ini + 8 '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 < 12 Or ActiveCell.Column < ini Or ActiveCell.Column > fini Then Exit Sub
'a partir de aquí tu proceso de marcado.
'If Not IsNumeric(Left(Cells(5, Target.Column), 1)) Then
If Len(Cells(12, Target.Column)) > 12 Then 'Si debe colorear las columnas de fechas, se compara con > 4
'Si debe colorear las columnas del año, se compara con = 4
If ActiveCell.Interior.ColorIndex < 0 Then
'ActiveCell = "a"
ActiveCell.Interior.ColorIndex = 44 '9
ActiveCell.Offset(, 1) = "P"
Else
'ActiveCell = ""
ActiveCell.Interior.ColorIndex = xlNone
ActiveCell.Offset(, 1) = ""
End If
Target.Select
End If
End Sub

Respuesta
3

Tomo tu consulta. Ya te dejaré otra macro universal, ya que cada entrega se personalizó a tu modelo de hoja.

¡Gracias! 

Estas fueron algunas de tus muestras. Se observa que modificas no solamente el inicio de fila y columna, sino también la distancia desde esa primera columna hasta la primera celda donde se debe marcar. En algunas hay 6 col de distancia en otras solo 4. Como tampoco hay un criterio único para evaluar dónde se inician las marcas, se debe establecer esa primera col.

Por lo tanto, esas van a ser 3 variables que debes ajustar en cada modelo de hoja. Podés dejar los valores en algunas celdas (dejé un ejemplo al final) o directamente ingresarlos en la macro del evento Selection_Change de cada hoja. Aquí ya no se necesita la macro del módulo ni las variables públicas.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
filIni = 13         'fila de títulos
colIni = 6          'primera col de la tabla
colMarca = 12        'primera columna donde se selecciona para marcar
filFin = Cells(50000, colIni).End(xlUp).Row                             'última fila de la tabla
colFin = Cells(filIni, colIni).CurrentRegion.Columns.Count + colIni      'última col de la tabla
'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row <= filIni Or ActiveCell.Column < colMarca Or ActiveCell.Column > colFin Then Exit Sub
'********
'********
End Sub

Ahora, como no hay ninguna regla en los títulos (a veces texto, a veces fechas, a veces año, etc) tendré que evaluar si la celda seleccionada se encuentra en la colMarca o a 2 col de distancia. Es decir que si colMarca empieza en 5 ... se marcará en la col 7, 9, 11, etc.

Para esto estoy utilizando el operador MOD que se encuentra en el capítulo 22 de mi manual 500Macros: TRABAJANDO CON FÓRMULAS y FUNCIONES

Entonces el código completo quedaría así:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'x Elsamatilde
Dim filIni As Integer, colIni As Byte, colMarca As Byte
Dim filFin As Integer, colFin As Integer
filIni = 13         'fila de títulos
colIni = 6          'primera col de la tabla
colMarca = 12        'primera columna donde se selecciona para marcar
filFin = Cells(50000, colIni).End(xlUp).Row                             'última fila de la tabla
colFin = Cells(filIni, colIni).CurrentRegion.Columns.Count + colIni      'última col de la tabla
'si la celda seleccionada no está en el rango posible, cancela
If ActiveCell.Row <= filIni Or ActiveCell.Column < colMarca Or ActiveCell.Column > colFin Then Exit Sub
'a partir de aquí tu proceso de marcado.
If Target.Column = colMarca Or (Target.Column - colMarca) Mod 2 = 0 Then
      If ActiveCell.Interior.ColorIndex < 0 Then
         ActiveCell.Interior.ColorIndex = 9
         ActiveCell.Offset(, 1) = "P"
      Else
         ActiveCell.Interior.ColorIndex = xlNone
         ActiveCell.Offset(, 1) = ""
      End If
      Target.Select
End If
End Sub
'**  Ejemplos de valores dejados en celdas
'filIni = [A1] : colIni = [B1]  : colMarca = [C1]

PD) Te estoy enviando tu libro con el código en cada hoja.

Voy a tomar nota del capítulo 22 que ud. menciona desde ya muchas

¡Gracias! 

Si vas a seguir agregando columnas (vacías), cambia la instrucción que empieza con:

colFin = Cells(filIni, colIni).......

Por esta otra:

colFin = Cells(filIni, colIni).End(xlToRight). Column 'última col de la tabla

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas