2017-09-06 23 views
1

我曾經建立了一個VBA按鈕,自動鎖定所有細胞中數據的所有單元格。它的工作完美。現在我想將該按鈕複製到另一個工作表中。於是我創建了另一個按鈕,複製並粘貼了整個VBA,然後編輯了工作表名稱和範圍。而且,它只能在5%的時間內工作,其餘時間,我得到了「運行時錯誤'1004':沒有找到細胞。」我已經嘗試了一些固定的,將Sheets更改爲Worksheets,或者添加「,23」到specialcells參數。然而,現在沒有任何工作。當我嘗試加入時,有時會說rng和lckrng都是空的,有時候只顯示鎖定爲空,而不顯示rng。問題在於它曾經是一個工作代碼,現在它仍然可以工作大約5%的時間。任何想法爲什麼?非常感謝你!Excel的VBA代碼,以選擇具有數據有時工作

Private Sub CommandButton1_Click() 

Dim rng As Range 
Dim lockrng As Range 

Sheets("Uploading Checklist (M)").Unprotect Password:="signature" 
Set rng = Range("A1:M14") 

'Selecting hardcoded data and formulas 
    Set lockrng = Union(rng.SpecialCells(xlCellTypeConstants), rng.SpecialCells(xlCellTypeFormulas)) 

lockrng.Locked = True 
Sheets("Uploading Checklist (M)").Protect Password:="signature" 

End Sub 
+0

我想測試一下。在我開始之前,我猜你已經排除了格式不一致等問題(儘管如果將SpecialCells中的第二個參數留空,它應該選擇所有單元格,而不考慮格式)以及有關範圍的任何內容是不連續的? – neophlegm

+1

你有沒有檢查過你是否在該範圍內有兩個常量和公式(即它不是全部常量或所有公式)? – YowE3K

+0

另外,作爲一種思路:如果你在聯盟有30多個不連續區域作爲參數,我不知道你會得到一個錯誤:[https://msdn.microsoft.com/VBA/Excel-VBA/articles/應用程序聯合法-Excel中](https://msdn.microsoft.com/VBA/Excel-VBA/articles/application-union-method-excel) – neophlegm

回答

1

Union您正試圖將不起作用如果任一參數的是Nothing(即您可能已在範圍內沒有常量,或者具有範圍沒有公式)。

在做Union之前,你應該檢查參數不是Nothing,但是,一旦你開始改變你的代碼來做到這一點,就像在兩部分鎖定一樣簡單 - 所以我建議你重寫代碼如下:

Private Sub CommandButton1_Click() 
    With Sheets("Uploading Checklist (M)") 
     .Unprotect Password:="signature" 
     With .Range("A1:M14") 
      'Lock any constants 
      If Not .SpecialCells(xlCellTypeConstants) Is Nothing Then 
       .SpecialCells(xlCellTypeConstants).Locked = True 
      End If 
      'Lock any formulas 
      If Not .SpecialCells(xlCellTypeFormulas) Is Nothing Then 
       .SpecialCells(xlCellTypeFormulas).Locked = True 
      End If 
     End With 
     .Protect Password:="signature" 
    End With 
End Sub 
2

也許這太簡單了,但它似乎是做你想做的。動畫的.gif顯示它正在「鎖定所有包含數據的單元格」。 (爲了方便,我做了第二個按鈕)。如果沒有別的,從這樣的工作開始並修改以適應您的需求可能會很好。

enter image description here

Dim cell As Range, sh As Worksheet 

Sub Button4_Click() 
Set sh = Worksheets("Sheet1") 
sh.Unprotect Password:="s" 
For Each cell In sh.UsedRange 
    If cell <> "" Then cell.Locked = True Else cell.Locked = False 
Next 
sh.Protect Password:="s" 
End Sub 

Sub Button5_Click() 
Set sh = Worksheets("Sheet1") 
sh.Unprotect Password:="s" 
End Sub 
+0

感謝您的幫助。根據評論,我修正了它。這段代碼簡單可行,謝謝。只是想知道,如果有大量的數據會慢嗎?我知道在這個例子中,範圍很小;但從我創建的最初的那個起作用,我的範圍就像A1:CZ300 + thingy。它會滯後(或者工作更快/更慢)嗎?謝謝。 – DWReyes