2012-02-07 21 views
7

時出現錯誤1004當試圖設置Range對象的Locked屬性時,我得到了catch-all運行時錯誤1004,「無法設置Range類的鎖定屬性」。代碼如下所示:當設置Range.Locked

that_goddamn_sheet.Unprotect 

; Determine if we should proceed 

that_goddamn_range.Locked = True 

; Do more stuff 

that_goddamn_sheet.Protect 

當我設置就行了斷點,並嘗試從即時窗口查詢that_goddamn_range.Locked的價值,這個工作沒有問題,但設置失敗。

但是,如果我運行that_goddamn_range.Select,打破宏,取消保護工作表(選擇更改後它會自動重新保護),然後右鍵單擊,選擇屬性,切換到保護選項卡並勾選鎖定,然後確認,但工作正常。

什麼可能會出錯?

+0

錯誤信息的內容是什麼? – 2012-02-07 22:22:27

+0

@Tim好的一點,包括在問題中。 – badp 2012-02-07 22:25:23

回答

3

[the sheet] gets reprotected automatically on selection change

的片材,由於某種原因,在該方法的中間重新保護本身。立即再次取消對Locked屬性設置的保護,解決了我的問題。

我實際上有多個範圍,我需要在一行中鎖定,並且必須在每個屬性更改之前取消保護表單。

3

除非是左上角的單元格,否則無法鎖定屬於合併單元格範圍一部分的單元格。以下適用於任何單元格或合併區域的單元格。

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

下面是一個完整的解釋:

通常情況下,有此錯誤的兩種原因:試圖改變細胞的鎖定財產上的保護工作表和/或試圖改變鎖定財產合併範圍內的單個單元格。

在第一種情況下,您可以解鎖工作表或設置UserInterfaceOnly保護措施,強烈建議您這樣做,因爲您不必再​​重複解鎖/鎖定它。

關於合併單元格,你不能鎖定一個單一的細胞,其是合併範圍的一部分,但也有合理的選擇:

  • 如果使用電池地址符號引用單元格/範圍,

    Range("A1").Locked = True

    然後引用整體合併的範圍,而不是:

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

  • 如果您爲一組合並單元格使用命名區域,默認情況下它將被定義爲僅引用第一個合併單元格。您可以編輯它的定義包括整個合併範圍或使用其MergeArea屬性引用其相關聯的合併範圍:

    Range(「SomeNamedRange」).MergeArea.Locked = True

    但請注意,你不能這樣做,因爲兩者的MergeArea財產很明顯,對於一個範圍不確定的範圍,該範圍不是一個較大合併區域的嚴格子集

  • 當然,在設置包含單元格的鎖定屬性之前,您總是可以取消合併的範圍,然後再重新合併它,但是我從未見過上述兩種解決方案之一不是足夠(並且更清潔)。

0

我有同樣的問題,並試圖隱藏手動細胞,並且收到以下警告: 「不能將對象移到工作片」。

我的問題是在同一張紙的單元格中的一些意見。刪除工作表的所有評論後,代碼將運行。

我的代碼查找行中使用匹配大小寫的列僅用於此(因爲我需要插入一些行和列「B」是我的標識行的引用)。

我的代碼。 (1,Range(「B:B」),0)) - &「:」&(WorksheetFunction.Match(13,Range(「B:B」),0))+15 ).EntireRow.Hidden = True