如何允许用户仅在特定条件下更改excel中的单元格?

w9apscun  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(91)

我有一个excel文件,A列的所有单元格都包含一个值(数值),然后还有B列,它包含其他值。
我想写一个脚本在vba(或也有其他选项,如果有替代方案),以控制更改列A的值。
需要说明的是,只有当单元格B1的值等于零时,excel用户才可以更改单元格A1。对于后面的行也是如此,因此只有当B2等于零时,才可以更改行A2,依此类推。
我已经在网上搜索,但我不能找到一个很好的解决方案,特别是因为这必须对大量的细胞工作。
谢谢

nnsrf1az

nnsrf1az1#

请在相应的工作表代码模块中复制下一个事件代码,并尝试更改:

Option Explicit

Private newVal
Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.cells.count > 1 Then Exit Sub
        If Target.column = 1 Then
            If Target.Offset(, 1).Value <> 0 Then
                Application.EnableEvents = False 'to avoind triggering again the Change event
                  newVal = Target.Value
                  Application.Undo
                Application.EnableEvents = True
            End If
        End If
End Sub
z31licg0

z31licg02#

A工作表选择变更:限制列访问

  • 使用当前设置(A2B),仅当要选择单个单元并且列B的同一行中的单元等于0时,以下将允许访问列A(更准确地说,访问A2:A1048576)。
  • 或者,如果您选择注解掉的 If 语句,那么如果列B中的单元格为空,它也将允许访问。
  • 空单元格也是数值,等于0,但不是 Double 类型,而是 Empty 类型。
    板材模块,例如Sheet1(不进入ThisWorkbook或标准模块,例如Module1
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    Const TGT_FIRST_CELL As String = "A2"
    Const SRC_COLUMN As String = "B"
    
    Dim trg As Range
    With Me.Range(TGT_FIRST_CELL)
        Set trg = .Resize(Me.Rows.Count - .Row + 1)
    End With
    
    Dim irg As Range: Set irg = Intersect(trg, Target)
    If irg Is Nothing Then Exit Sub
    
    Dim ColumnOffset As Long
    ColumnOffset = Me.Columns(SRC_COLUMN).Column - irg.Column
    
    Dim srg As Range: Set srg = irg.Offset(, ColumnOffset)
    
    If srg.Cells.Count = 1 Then
        Dim sValue As Variant: sValue = srg.Value
        If VarType(sValue) = vbDouble Then ' write just if 0
        ' or:
        'If IsNumeric(sValue) Then ' write if 0 or empty
            If sValue = 0 Then Exit Sub
        End If
    End If
    
    srg.Cells(1).Select
    
End Sub
ffx8fchx

ffx8fchx3#

您可以为此使用数据验证:
选择范围(例如:x1月1x)
转到数据-〉数据工具-〉数据验证
选择以下选项:
允许"自定义"
分子式:=B1:B10=0

相关问题