首页 > 解决方案 > 当某些单元格不再为空白时,如何锁定 Excel 行?

问题描述

我正在编辑我的问题以使其更加明确。

我在表格中有一个 Excel 表格,其中每一行都是每月支付的学费。我想锁定所有已支付的行(即如果 E 列中有金额),以便在没有密码的情况下无法删除或更改它。在此处输入图像描述

已支付的行不一定按顺序排列。

我已经尝试了很多在这里找到的不同的 VBA 代码。但是它们都没有为我工作(其中一些工作但它们只锁定我当时正在编辑的行,而不是所有在 E 列中具有值的行)

我从未使用过 VBA ......但我必须解决这个问题。我在厄瓜多尔的一所教会学校,我不认识任何可以帮助我的人......我真的需要尽快解决这个问题,因为秘书已经不小心删除了数据(!!!)

标签: excelvba

解决方案


首先,您使用 UserInterfaceOnly 保护工作表。对于本主题,请参阅设置 Range.Locked 时出现错误 1004
将以下 Sub 放入 VBA 模块中,将光标放在其中某处,然后按 F5:

Public Sub LockActiveSheet()
  ActiveSheet.Protect UserInterfaceOnly:=True
End Sub

然后,您可以在同一 VBA 模块中使用以下代码解锁空单元格并锁定 A:E 列中包含值的单元格。确保工作表“养老金”已打开。然后将光标放入其中并按F5。

Public Sub LockNonEmptyCells()

  Dim lngLastRow As Long        'index of the last used row
  Dim rngAE As Range            'the range from cell A3 to Exxx (last used row)
  Dim i As Long                 'counter in For...Next
  
  lngLastRow = [A1].SpecialCells(xlLastCell).Row 'get index of last used row
  Set rngAE = [A3].Resize(lngLastRow - 2, 5) 'get data range
  With rngAE.Cells              'cycle through all cells
    For i = 1 To .Count
      .Item(i).Locked = Not IsEmpty(.Item(i)) 'unlock empty cells, lock cells with value
    Next i
  End With

End Sub

为了将来的编辑,您可以将以下代码粘贴到工作表的代码模块中:

Private Sub Worksheet_Change(ByVal Target As Range)  
  If Target.Column <= 5 Then Target.Locked = True
End Sub

这将在您输入值后直接锁定单元格。


推荐阅读