【问题标题】:VBA Run-time error '1004': Method 'Range' of object '_Worksheet'VBA 运行时错误“1004”:对象“_Worksheet”的方法“范围”
【发布时间】: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 在我之前未受保护的工作表上设置了保护。当您设置保护时,可能在打开工作簿时使用此行一次。将其从将多次应用的事件过程中删除。

标签: excel vba


【解决方案1】:

我发现我在使用上是完全错误的

Private Sub Worksheet_Change(ByVal Target As Range)

不使用 intersect() 我本质上是在处理一个不存在的范围。简单的解决方法如下:

If Not Intersect(Target, Range("B2")) Is Nothing Then

之后,打开和关闭事件变得相关,以防止在更改选定单元格的值时出现无限循环。感谢您的提示!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多