excel VBA:获取object _worksheet的错误方法范围失败

klr1opcd  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(225)

在执行下面的代码时,我不断得到标题中提到的错误:

Sub test()
    Dim j As Integer
    j = 2
    If ActiveSheet.Name = "Email" Then
        Sheets("Lists").Range("Z2:Z31").Cells.Value = ""
        For i = 2 To 190
            If Sheets("Lists").Cells(i, 8).Value = Cells(2, 2).Value Then
                Sheets("Lists").Cells(j, 26).Value = Sheets("Lists").Cells(i, 6).Value
                j = j + 1
            End If
        Next
        Range("C12:O12").AutoFilter 1, ">=" & Range("B1").Value, xlAnd, "<=" & Range("C1").Value
    End If
End Sub

当工作表中发生任何更改时,通过添加此类事件,将自动执行此代码。

Public WithEvents appevent As Application
Private Sub appevent_SheetChange(ByVal sh As Object, ByVal target As Range)
    Call test
End Sub

并使用VBA中ThisWorkbook选项卡中的Workbook_Open方法,在工作表打开时自动添加事件,如下所示。

Dim myobject As New Class1
Private Sub Workbook_Open()
    Set myobject.appevent = Application
End Sub

虽然当通过调试器正常执行时,只需按F5,代码就可以完美地执行。
我想做的是,在用户从数据验证单元格中选择一个选项后,工作表自动更新该工作表中查看的内容,并将“列表”工作表中的其他一些单元格设置为与原始单元格不同的值。
到目前为止,当通过调试器按F5键运行时,代码执行得很完美,所以我不知道为什么会出现这样的错误。我的猜测是VBA不允许以编程方式更改单元格值,除非工作表被选中,所以如果工作表未被选中,我该如何更改。
如果你能请好心帮助。谢谢

dxxyhpgq

dxxyhpgq1#

您正在使用“范围”(...)和“单元格”(...),但未指定“工作表”。使用.Select设置引用对象并不是一种好的做法,但您更喜欢显式设置对象。

Sub test()
    Dim j As Integer
    j = 2
    If ActiveSheet.Name = "Email" Then
        With Worksheets("Lists")
         .Range("Z2:Z31").value = ""
         For i = 2 To 190
 'IN NEXT LINE the Cells(2,2).Value comes form ActiveSheet... 
 'is this you need or is a mistake? check it.
             If .Cells(i, 8).value = Cells(2, 2).value Then
                 .Cells(j, 26).value = .Cells(i, 6).value
                 j = j + 1
             End If
         Next
  'I PUT A DOT in Ranges... Is this you need Or have to refer the ActiveSheet?
         .Range("C12:O12").AutoFilter 1, ">=" & .Range("B1").value, xlAnd, "<=" & .Range("C1").value
        End With
    End If
End Sub

相关问题