# evitar que modifiquen cantidades en un rango y a la vez permitir que apliquen color de fondo a las celdas..



## Samuel Cano (Feb 16, 2009)

Saludos amigos.

Permítanme consultarles: cómo sería posible impedir que se modifique el contenido de un rango pero al mismo tiempo, permitir que se pueda aplicar color de fondo a las celdas del mismo rango?

He leído los mensajes de proteger pero no consigo una pista..

Intenté proteger, pero no permite aplicar color una vez protegido.

Solo necesito que se rechacen los cambios a las celdas en el rango y que se pueda resaltarlas coloreandolas.

Como siempre gracias anticipadas desde México.


----------



## Greg Truby (Feb 16, 2009)

Samuel,

Si usted tiene Excel XP, 2003 o 2007, Usted pone protección como siempre pero cuando está poniéndola, haga un "cheq" en la tercera caja en el listado de actividades permitos que es "formatear celdas".  No tengo accesso a Excel 2000, pero no creo que ofrezca esas opciones.

Saludos,


----------



## galileogali (Feb 21, 2009)

Si utilizas Excel 2000 o previo, puedes intentar este artilugio, que no hace "exactamnete" lo que pides, pero aproxima bastante, en el Modulo de la hoja:

```
Option Explicit
Dim valor

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("Rango")) Is Nothing Then
Application.ScreenUpdating = False
Application.EnableEvents = False
Target.Value = valor
Application.EnableEvents = True
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("Rango")) Is Nothing Then
valor = Target.Value
End If
End Sub
```


----------



## Samuel Cano (Mar 13, 2009)

*Salud Greg, Galileo.. gracias por el apoyo..*

Les cuento que el caso que expuse, fué para mi, muy apremiente. 

Y que en mi apuración consulté a varios libros, uno de ellos con el código que me sirvió de modelo para el que incluyo a continuación (por si de algo sirve a alguien). 

Lo que hace es evitar el cambio de valores en las celdas del rango definido.  Permite  colorear la celda (lo que yo que buscaba), borrar su contenido y otras acciones más como por ejemplo pegarle un valor copiado de otra celda.

Refrendo mi agradecimiento para con ustedes.  Y les comento que a manera de corresponder sus atenciones, siempre que puedo sigo su ejemplo compartiendo mi limitado conocimiento del VBA.

Un abrazo.

- Samuel

P.D. La sugerencia y el código los reviso y, (no podía ser de otra manera) los integro a mi biblioteca de consulta. Gracias. :P



```
Private Sub Workbook_Open()

    bolResp = MsgBox("Para continuar, dé click en el botón 'Aceptar'", vbExclamation + vbOKCancel, "Por favor..")
    
    If bolResp = 2 Then
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Saved = True
        ActiveWorkbook.Close
        
    Else
    
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
    
        Hoja1.Visible = xlSheetVisible
        Worksheets("Hoja1").Visible = xlSheetHidden
    
    With Cells.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween
        .IgnoreBlank = False
        .InCellDropdown = True
        .ShowInput = True
        .ShowError = True
    End With
    
    
    lngFila = 36
    
    
    With Range("A9:V" & lngFila).Validation
        .Delete
        .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="="""""
        .IgnoreBlank = False
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Alto!"
        .InputMessage = ""
        .ErrorMessage = "En este cuadro no cambiar " & vbNewLine & _
                        "cantidades, solo aplicar color." & vbNewLine & vbNewLine & _
                        "presione Esc para continuar..."
        .ShowInput = True
        .ShowError = True
    End With

    Range("B" & lngFila).Select

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End If

End Sub
```


----------



## Samuel Cano (Mar 13, 2009)

*Greg, yo utilizo excel del Office 2003..*

Y tu sugerencia permite la hoja tal y como la deseaba:

- Proteger un rango contra modificaciones, a la vez que permite aplicar formato (color) a sus celdas y, copiar ese rango a otra parte de la misma hoja donde además de poder aplicar formato, se permite el cambio de su contenido.

Me abruma saber ahora, que la solución la tenía frente a mi..

Gracias.


----------



## Greg Truby (Mar 16, 2009)

Samuel,
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-comfficeffice" /><o></o>
Gracias por haber compartido su código con nosotros. Usted me hizo sonreír porque nunca había visto a alguien usar validación en esta manera. Uno nunca sabe cuándo se va a ver alguito nuevo. 
Sí se puede aplicar esa validación por medio de VBA, pero la solución más robusto sería ponerla antes de todo y no depender de VBA si se puede evitar porque un usuario siempre se puede negar que corre una rutina de VBA si tiene seguridad de medio para arriba y el proyecto lleva una firma digital desconocida.<o></o>

Pero si uno decide siempre usar VBA entonces unos pensamientos sobre su código:

En su línea 
	
	
	
	
	
	



```
If bolResp = 2 Then
```
 uno de dos, ponga un comentario explicando qué significa el número dos o usar el constante de VBA 
	
	
	
	
	
	



```
if bolResp = vbNo then
```
<o></o>
Después usted usó una mezcla de codename y name. Mejor y más robusto usar solamente los codenames.  Así, si por usted o por el usuario el nombre de la hoja cambia su código no quiebra. También para hojas de uso especial no tenga miedo cambiar el nombre a algo con más significado que “hoja1” y si usted no quiere que el usuario puede desesconder la hoja manualmente y no ha protegido la estructura del cuaderno, “muy escondido” sería una opción mejor.


```
Hoja1.Visible = xlSheetVisible
        hojaEscondeMe.Visible = xlSheetVeryHidden
```
 
Usted tiene esta línea
	
	
	
	
	
	



```
lngFila = 36
```
que es un constante. Esto llamamos “números mágicos” y es mejor colocarlos arriba en un procedimiento que tenerlos regados por todo lado. O sea…

```
Private Sub Workbook_Open()
    Const c_lngFila As Long = 36
```
Y de ultimo, usted últimamente va a terminar donde empezó, usando protección de la hoja. Porque sin protección, el usuario solamente tiene que escoger “borrar validación” del menú / cinta y todo su protección evapora como un charco en Sonora en julio.<o></o>


----------

