2012-02-07 44 views
7

Obtengo el error de tiempo de ejecución catchlee 1004, "no se puede establecer la propiedad Bloqueada de la clase Range" cuando, bueno, tratando de establecer la propiedad Locked de un objeto Range. El código es el siguiente:Error 1004 al establecer Range.Locked

that_goddamn_sheet.Unprotect 

; Determine if we should proceed 

that_goddamn_range.Locked = True 

; Do more stuff 

that_goddamn_sheet.Protect 

Cuando me puse un punto de interrupción en la línea y tratar de consultar el valor de that_goddamn_range.Locked desde la ventana Inmediato, esto funciona sin problema, pero el establecimiento de falla.

Si, sin embargo, corro that_goddamn_range.Select, romper la macro, desproteger la hoja (que se vuelva a proteger automáticamente al cambiar la selección) haga clic derecho, seleccionar Propiedades, cambie a la ficha Protección y garrapatas Bloqueado confirme, las cosas funcionan bien sin embargo .

¿Qué podría estar yendo mal?

+0

¿Cuál es el texto del mensaje de error? –

+0

@Tim Buen punto, incluido en la pregunta. – badp

Respuesta

3

[the sheet] gets reprotected automatically on selection change

La hoja, por alguna razón, volver a proteger en sí en medio del método. Desprotegiéndolo de nuevo inmediatamente antes de la configuración de la propiedad Locked solucionó mi problema.

En realidad tenía varios rangos que necesitaba bloquear en una fila, y tuve que desproteger la hoja antes de que cada propiedad cambiara.

3

No puede bloquear una celda que es parte de un rango de celdas combinadas a menos que sea la celda de la esquina superior izquierda. Lo siguiente funciona para cualquier celda o área fusionada de celdas.

Sub LockCells() 
    Dim R As Range 
    ActiveSheet.Unprotect 
    Cells.Locked = False 
    For Each R In Range("A1", Cells.SpecialCells(xlCellTypeLastCell).Address) 
     If R.MergeArea.Range("A1").Address = R.Address And R.HasFormula Or IsText(R) Then 
     R.MergeArea.Locked = True 
     End If 
    Next 
    ActiveSheet.Protect 
End Sub 

Function IsText(What) As Boolean 
    IsText = False 
    On Error Resume Next 
    IsText = (CDbl(What) <> What) 
    If Err.Number Then IsText = True 
End Function 
12

He aquí una explicación completa:

Por lo general, hay dos causas de este error: tratar de cambiar Bloqueado la propiedad de una celda en una hoja protegida y/o tratar de cambiar el Bloqueado propiedad de una sola celda en un rango combinado.

En el primer caso, puede desbloquear la hoja o establecer UserInterfaceOnly protección, que es muy recomendable, ya que entonces no tiene que meterse con el desbloqueo/bloqueo repetidamente.

Con respecto a las celdas combinadas, no se puede bloquear una sola célula que forma parte de una serie fusionada pero hay opciones razonables:

  • Si está utilizando la notación de células-dirección para hacer referencia a la celda/gama,

    Range("A1").Locked = True

    después hacer referencia a toda la gama fusionada en su lugar:

    Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range

  • Si está utilizando un rango con nombre para un conjunto de celdas combinadas, de forma predeterminada se definirá para hacer referencia solo a la primera de las celdas combinadas.Usted puede editar su definición para incluir toda la gama fusionada o utilizar su propiedadMergeArea hacer referencia a su gama fusionada asociada:

    Range(“SomeNamedRange”).MergeArea.Locked = True

    Pero tenga en cuenta que no se puede hacer ambas cosas ya que la propiedadMergeArea es, aparentemente, indefinido para un rango que no es un subconjunto estricto de un área fusionada más grande!

  • Por supuesto, siempre puede soltar el rango fusionado antes de establecer la propiedad bloqueada de una celda incluida y volver a fusionarla después, pero nunca he visto una situación en la que una de las dos soluciones anteriores no suficiente (y mucho más limpio).

0

que tenían el mismo problema y trató de ocultar manualmente las células, y recibir la siguiente advertencia: "No se puede desplazar objetos fuera de la hoja."

Mi problema fueron algunos comentarios en las celdas de la misma hoja. Después de eliminar todos los comentarios de la hoja, se ejecuta el código.

Mi código busca la fila usando el caso de coincidencia en una columna utilizada solo para esto (porque necesito insertar algunas filas y la columna "B" es mi referencia para identificar la fila).

Mi código. Filas ((WorksheetFunction.Match (1, Rango ("B: B"), 0)) - 1 & ":" & (WorksheetFunction.Match (13, Rango ("B: B"), 0)) + 15) .EntireRow.Hidden = True

Cuestiones relacionadas