【问题标题】:How to manually modify a cell that is being edited in a worksheet_change event?如何手动修改 worksheet_change 事件中正在编辑的单元格?
【发布时间】:2023-04-09 18:02:01
【问题描述】:

我遇到了一些麻烦,需要一些帮助。我需要创建代码来根据单元格的值更改命名范围的值。有 4 个选项:A、B、C 和无。如果选择 A、B 或 C,我需要在命名范围中输入预设值,将范围的颜色更改为灰色,并锁定单元格。如果选择无,命名范围将变为黄色,用户将在命名范围中输入自己的值。以下是我正在尝试的代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ws As Worksheet

Application.EnableEvents = False
Application.ScreenUpdating = False

Set ws = ThisWorkbook.Sheets("Sheet1")

ws.Unprotect Password:="MyPass"

If ws.Range("L14") = "A" Then
    ws.Range("NamedRange").Rows(1) = "Option 1"
    
    ws.Range("NamedRange").Interior.ColorIndex = 15
    ws.Range("NamedRange").Locked = True
    
ElseIf ws.Range("L14") = "B" Then
    ws.Range("NamedRange").Rows(1) = "Option 2"
    
    ws.Range("NamedRange").Interior.ColorIndex = 15
    ws.Range("NamedRange").Locked = True

ElseIf ws.Range("L14") = "C" Then
    ws.Range("NamedRange").Rows(1) = "Option 3"

    ws.Range("NamedRange").Interior.ColorIndex = 15
    ws.Range("NamedRange").Locked = True
    
Else 'user input own entries
    ws.Range("NamedRange").ClearContents
    ws.Range("NamedRange").Interior.ColorIndex = 6
    ws.Range("NamedRange").Locked = False
End If

ws.Protect Password:="MyPass"

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

我遇到的问题是选择“无”。单元格变为黄色并解锁,但因为我正在使用工作表更改事件,所以我尝试输入的任何值都会自动清除。当使用工作表更改事件选择“无”时,是否有任何方法允许用户更改命名范围?

【问题讨论】:

  • Target 的颜色添加一个检查,如果是黄色则绕过你的函数。也许在这里Else 'user input own entries
  • @Nathan_Sav 谢谢!我想这是一个非常明显的修复,只是错过了它。我在最后的 else 中添加了一个 IF 语句,所以如果颜色为黄色,它只会跳过 clearcontents、颜色分配和解锁。它会在第一次更改 None 时起作用,但之后随时跳过。再次感谢!

标签: excel vba


【解决方案1】:

但您没有在代码中使用Target 单元格...。您希望工作表中的所有单元格更改触发事件吗?最好用 cote 行开始事件:If Target.Address <> "$L$14" Then Exit Sub,作为一个工作表事件,不需要使用ws 并对其进行限定。它指的是活动单元格,简单地使用Range("L14")就足够了。然后,最后一个Else 并没有像您可能想要的那样引用“L14”中的更改...

请测试最后一种方式:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address <> "$L$14" Then Exit Sub
 Application.EnableEvents = False

 ActiveSheet.Unprotect Password:="MyPass"
 Select Case Target.Value
    Case "A"
        Range("NamedRange").rows(1) = "Option 1"
        
        Range("NamedRange").Interior.ColorIndex = 15
        Range("NamedRange").Locked = True
    Case "B"
        Range("NamedRange").rows(1) = "Option 2"
    
        Range("NamedRange").Interior.ColorIndex = 15
        Range("NamedRange").Locked = True
    Case "C"
        Range("NamedRange").rows(1) = "Option 3"

        Range("NamedRange").Interior.ColorIndex = 15
        Range("NamedRange").Locked = True
    Case Else
        Range("NamedRange").ClearContents
        Range("NamedRange").Interior.ColorIndex = 6
        Range("NamedRange").Locked = False
 End Select

 ActiveSheet.Protect Password:="MyPass"
 Application.EnableEvents = True
End Sub

代码未经测试,但我认为它应该可以工作。请对其进行测试并发送一些反馈。

【讨论】:

  • 谢谢,这很好,绝对是一个改进。不要在我的角色中使用太多的 VBA,我认为这是我第一次需要 worksheet_change,所以我不知道使用目标单元格 - 我想我应该做更多的研究。谢谢!
猜你喜欢
  • 2013-08-28
  • 2015-08-30
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2016-08-23
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多