错误'1004':选择Range类的方法失败

时间:2016-05-13 13:11:10

标签: excel vba excel-vba listbox

我确信每个阅读标题的人都会说“哦不,不会再”。但在发布之前,我已经阅读了大约7-8个以前类似标题的问题,而且似乎没有人工作。所以这就是交易:

我的工作簿使用Workbook_Open事件来显示用户表单:

Sub Workbook_Open()
    UserForm1.Show
End Sub

Userform1包含一个文本框和一个列表框。根据用户在文本框中的输入,列表框会动态填充数据。一切都好。

当用户点击列表框内的值时,我想要选择一个特定的单元格。所以我用过这个:

Private Sub ListBox1_Click()
    Dim Cell As Range

    With ThisWorkbook.Worksheets(1)
        Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues)
        .Range(Cell, Cell.Offset(0, 2)).Select
    End With
End Sub

但在我之前的其他许多人中,我无法使Select正常工作,而且此代码会出现类似标题的错误。

我尝试了几件事来使这段代码有效。

-Tried Application.GoTo,使用它代替Select,就像有人建议的那样。

- 尝试将ListBox1_Click事件的代码移动到标准模块内的子代码,并使用ListBox1_Click事件调用此子代。

- 请先按照其他人的建议选择工作表。

-Tried Worksheets(1).Visible = True正如其他人所建议的那样。

- 首先使用AppActivate Application.Caption激活应用程序的主窗口。

- 选择滚动到所需的单元格,而不是选择:

Private Sub ListBox1_Click()
    Dim foundRow As Integer

    With ThisWorkbook.Worksheets(1)
        foundRow = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues).Row
    End With
    ActiveWindow.ScrollRow = foundRow - 1
End Sub

我也尝试过其他不那么重要的变化,但我坚持不懈。有趣的是,在使用Workbook_Open事件之前,我通过分配给工作表中按钮/形状的宏显示UserForm1,然后一切正常。

有人知道如何让Select在我的案件中工作吗?

另一方面,我很清楚Select会导致很多问题,所以我不会坚持下去。如果有人有另一种方法可以获得相同的结果,那我就全都听见了。

2 个答案:

答案 0 :(得分:1)

我能够复制这个问题,首先我按照你描述的那样,制作了一个列表并从中挑选,看看是否会滚动到视图中,并且它有效。

如果我关闭了表单,请更改活动工作表。然后使用您看到的错误消息运行失败的表单。

尝试了一些我发现如果它不是活动工作表而无法选择单元格的东西(这是合乎逻辑的,用户无法点击他们正在查看的工作表上的单元格)< / p>

以下Activate行应修正它。

Private Sub ListBox1_Click()
    Dim Cell As Range

    With ThisWorkbook.Worksheets(1)
        Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues)

        ThisWorkbook.Worksheets(1).Activate

        .Range(Cell, Cell.Offset(0, 2)).Select
    End With
End Sub

答案 1 :(得分:0)

如@ScotCraner和shown in the sample code on MSDN所述,在使用/显示之前,您应首先检查是否找到了某些内容。

以下应该完美无缺:

Private Sub ListBox1_Click()

    Dim Cell As Range
    Application.DisplayStatusBar = True

    With ThisWorkbook.Worksheets(1)
        Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)
        If Not Cell Is Nothing Then
            Application.StatusBar = "Found " & UserForm1.ListBox1.Text
            .Activate
            .Range(Cell, Cell.Offset(0, 2)).Select
        Else
            Application.StatusBar = "Couldn't find " & UserForm1.ListBox1.Text
        End If
    End With

End Sub

请注意,您使用的UserForm1.ListBox1.Text不考虑UserForm1.ListBox1.MultiSelect