2017-09-06 58 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

相关问题