2

さて、スプレッドシートのセルでユーザーが選択した値に基づいてオートフィルターを変更する Excel 用の VBA で簡単なスクリプトを作成しようとしています。これまでのところ、かなりうまくいっていますが、現在、次のエラーが発生しており、原因がわかりません。

実行時エラー '91': オブジェクト変数または With ブロック変数が設定されていません

VBA で何かを書き込もうとしたのはこれが文字通り初めてなので、言語にあまり慣れていないことを覚えておいてください。私は Excel に非常に精通していますが、他のいくつかのプログラミング言語 (Java、JavaScript、Ruby、LUA) も知っています。

これが私が書いたコードです。エラーは9行目で発生しています。

Private Sub Worksheet_Change(ByVal Target As Range)

    '' Review Level Changed ''
    If Target.Address = Worksheets("Sheet1").Range("review_level").Address Then

        ' MsgBox "You just changed " & Target.Address & " to " & Target.Value ' Debug
        Dim oldProtection As Protection
        If Worksheets("Sheet1").ProtectContents = True Then
            oldProtection = Worksheets("Sheet1").Protection ' It errors out here
            Worksheets("Sheet1").Unprotect
        End If

        If Target = "B" Then
            ActiveSheet.ListObjects("review_checklist").Range.AutoFilter Field:=2, _
                Criteria1:=Array("B", "C", "D"), Operator:=xlFilterValues
        ElseIf Target = "C" Then
            ActiveSheet.ListObjects("review_checklist").Range.AutoFilter Field:=2, _
                Criteria1:="=C", Operator:=xlOr, Criteria2:="=D"
        ElseIf Target = "D" Then
            ActiveSheet.ListObjects("review_checklist").Range.AutoFilter Field:=2, _
                Criteria1:="=D"
        End If

        If Not IsEmpty(oldProtection) Then ' Btw, this IS how you check that oldProtection isn't null, right?
            Call ProtectWithProtection(oldProtection)
        End If

    End If

End Sub

Private Sub ProtectWithProtection(ByRef Protect As Protection)
    Worksheets("Sheet1").Protect ' ToDo: Use attributes from Protect
End Sub

このコードは、Excel プロジェクトの "Sheet1" 内にあります。Excel 2007 を実行していることに注意してください。

4

1 に答える 1

5

VBA にオブジェクトがある場合は常に、Set演算子を使用して値を割り当てる必要があります。例えば:

Set oldProtection = Worksheets("Sheet1").Protection
于 2013-01-04T21:23:42.193 に答える