【发布时间】:2020-04-11 09:59:50
【问题描述】:
我知道这个问题与 Stack 上发布的许多其他问题相似,但他们的解决方案均不适合我。我是 VBA 新手,所以请尽量让您的解决方案易于理解。下面的代码基本上有条件地锁定和解锁单元格(尚未完成;仍在尝试关闭框架):
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Sheet1.Protect UserInterFaceOnly:=True
' Volatility
If Not IsEmpty(Range("B11").Value) Then
Range("B12").Value = ""
Range("B13").Value = ""
Range("B22").Value = Range("B11").Value
Range("B12:B13").Locked = True
Else
Range("B12:B13").Locked = False
End If
If IsEmpty(Range("B12").Value) And IsEmpty(Range("B13").Value) Then
Range("B11").Locked = False
Else
Select Case Range("B12").Value
Case Is = "Daily"
Range("B22").Value = Range("B13").Value * Sqr(252)
Case Is = "Weekly"
Range("B22").Value = Range("B13").Value * Sqr(52)
Case Is = "Monthly"
Range("B22").Value = Range("B13").Value * Sqr(12)
Case Is = "Annual"
Range("B22").Value = Range("B13").Value
End Select
Range("B11").Locked = True
End If
' Time
If Not IsEmpty(Range("B14").Value) Then
Range("B15").Value = ""
Range("B15").Locked = True
Range("B23").Value = Range("B14").Value / Range("B7").Value
Else
Range("B15").Locked = False
End If
If Not IsEmpty(Range("B15").Value) Then
Range("B14").Locked = True
Range("B23").Value = Range("B15").Value
Else
Range("B14").Locked = False
End If
' Dividends
If Not IsEmpty(Range("B16").Value) Then
Range("B17").Value = ""
Range("B17").Locked = True
Else
Range("B17").Locked = False
End If
If Not IsEmpty(Range("B17").Value) Then
Range("B16").Locked = True
Else
Range("B16").Locked = False
End If
Select Case Range("B6").Value
Case Is = "Cox Rox Rubinstein (1979)"
' If requirements satisfied, populate outputs
' Else make output values blank
Range("B24").Value = ""
Case Is = "Forward Tree"
Range("B24").Value = ""
Case Is = "Lognormal Tree"
Range("B24").Value = ""
Case Is = "Custom"
Range("B24").Value = ""
End Select
End Sub
问题是,每当我更改工作表上的任何单元格值时,Excel 都会提示“获取运行时 1004:对象 '_Worksheet' 的方法 'Range' 失败”,而没有指定哪一行代码,然后强制退出程序。见表here。任何帮助是极大的赞赏!
【问题讨论】:
-
每次更新工作表都会重新触发您的代码,因此请考虑在开始更改之前关闭事件。不要忘记在您的子退出之前重新启用它们。
-
Ted 可能会指出问题的原因。但是
Sheet1.Protect UserInterFaceOnly:=True在我之前未受保护的工作表上设置了保护。当您设置保护时,可能在打开工作簿时使用此行一次。将其从将多次应用的事件过程中删除。