【问题标题】:VBA EXCEL Run time error 1004 Method 'Range of Object_worksheet' failedVBA EXCEL 运行时错误 1004 方法“对象工作表的范围”失败
【发布时间】:2015-11-04 18:30:46
【问题描述】:

在组合框中选择一个选项后,我试图从工作表中提取数据。所以我在这里所做的是,当我单击搜索按钮时,根据 SearchSelectPPComboBox 中选择的选项,我应该进入 wb 中的 ws 以找到该选项值,然后找到该值在哪一行,这样我就可以通过移动到同一行中的下一列单独提取数据。

但是,我下面的代码在这一行出现“运行时错误 1004 方法‘对象工作表的范围’失败”

设置 FoundCell = ws.Range("F8:F").Find(what:=WHAT_TO_FIND, lookat:=xlWhole)

提前感谢您的帮助!!

Private Sub SearchButton_Click()
    If SearchTeamComboBox.ListIndex < 0 And SearchSelectPPComboBox.ListIndex < 0 Then
    MsgBox "Please select Team and the Process/project you want to search ."
    SearchTeamComboBox.SetFocus
    ElseIf SearchTeamComboBox.ListIndex < 0 Then
    MsgBox "Please select Team."
    SearchTeamComboBox.SetFocus
    ElseIf SearchSelectPPComboBox.ListIndex < 0 Then
    MsgBox "Please select the Process/project you want to search ."
    SearchSelectPPComboBox.SetFocus
    Else

    Const WHAT_TO_FIND As String = "SearchSelectPPComboBox.value"
    Dim ws As Excel.Worksheet
    Dim FoundCell As Excel.Range

    Set ws = Sheets(SearchTeamComboBox.Value)
    Set FoundCell = ws.Range("F8:F").Find(what:=WHAT_TO_FIND, lookat:=xlWhole)
    If Not FoundCell Is Nothing Then
        MsgBox (WHAT_TO_FIND & " is found ")
        Me.checklistComboBox.Value = FoundCell.Offset(0, 1).Value

    End If
    End If
    End Sub

附加代码:

Private Sub SearchTeamComboBox_Change()
    Application.EnableEvents = False
    SearchSelectPPComboBox.Clear
    Application.EnableEvents = True

Dim PP As Object
Dim rngList As Range
Dim strSelected As String
Dim LastRow As Long

        ' check that a team has been selected
      If SearchTeamComboBox.ListIndex <> -1 Then

           strSelected = SearchTeamComboBox.Value
            If strSelected = "ACLT" Then
            LastRow = Worksheets("ACLT").Range("E" & Rows.Count).End(xlUp).row
            Set rngList = Worksheets("ACLT").Range("E8:E" & LastRow)

                ElseIf strSelected = "AIF/CIF" Then
                LastRow = Worksheets("AIFCIF").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("AIFCIF").Range("E8:E" & LastRow)

                ElseIf strSelected = "FDM" Then
                LastRow = Worksheets("FDM").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("FDM").Range("E8:E" & LastRow)

                ElseIf strSelected = "Imaging" Then
                LastRow = Worksheets("Imaging").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("Imaging").Range("E8:E" & LastRow)

                ElseIf strSelected = "MRT" Then
                LastRow = Worksheets("MRT").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("MRT").Range("E8:E" & LastRow)

                ElseIf strSelected = "PAT" Then
                LastRow = Worksheets("PAT").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("PAT").Range("E8:E" & LastRow)

                ElseIf strSelected = "SSU" Then
                LastRow = Worksheets("SSU").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("SSU").Range("E8:E" & LastRow)

                ElseIf strSelected = "VEL" Then
                LastRow = Worksheets("VEL").Range("E" & Rows.Count).End(xlUp).row
                Set rngList = Worksheets("VEL").Range("E8:E" & LastRow)

            End If
                For Each PP In rngList
                   SearchSelectPPComboBox.AddItem PP.Offset(, 1)
            Next PP

    End If

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    应该是,因为您使用了不完整的范围作为Range("F8:F")

    您要在哪里查找单词,整个 F 列或仅 F 列的一部分。

    对于整列,你应该使用如下:

    Set FoundCell = ws.Range("F:F").Find(what:=WHAT_TO_FIND, lookat:=xlWhole)
    

    对于列的部分,你应该使用如下:

    Set FoundCell = ws.Range("F8:F100").Find(what:=WHAT_TO_FIND, lookat:=xlWhole)
    

    如果不知道固定的最后一行,可以如下使用。

    Set FoundCell = ws.Range("F8:F" & ws.Range("F8").SpecialCells(xlCellTypeLastCell).Row).Find(what:=WHAT_TO_FIND, lookat:=xlWhole)
    

    其中,ws.Range("F8").SpecialCells(xlCellTypeLastCell).Row 获取最后使用的单元格。

    【讨论】:

    • 整列。现在没有错误,但是当我单击搜索时,现在什么也没发生。我正在尝试将找到的单元格旁边的列中的数据放入我的用户表单中的文本框中。 @尼古拉斯
    • 你应该调试代码,所以,你可以看到行不通。
    • 对不起,我是excel新手。要调试我按 F8 对吗?每次按 F8 时,它们只会突出显示我的线条并向下移动。 @尼古拉斯
    • 是的,没错,就这么做。并检查变量的值。这里是小reference
    • 我在上面添加了另一组代码。我的应用程序都启用事件 = false 是否正确? @尼古拉斯
    【解决方案2】:

    Nicolas 为您的第一个问题提供了答案。

    整列。现在没有错误,但是当我单击搜索时,现在什么也没发生。我正在尝试将找到的单元格旁边的列中的数据放入我的用户表单中的文本框中。 @nicolas– Gwen 44 分钟前

    以下代码不正确:

    Const WHAT_TO_FIND As String = "SearchSelectPPComboBox.value"
    

    您将值“SearchSelectPPComboBox.value”提供给 WHAT_TO_FIND。 代码应该是:

    Const WHAT_TO_FIND As String = SearchSelectPPComboBox.value
    

    “”里面的文本变成了一个字符串,因此它搜索字符串“SearchSelectPPComboBox.value”,通过删除“”,SearchSelectPPComboBox.value的值变成了字符串。

    编辑:

    一个常量需要一个不可变的字符串。 SearchSelectPPComboBox.value 是一个变量字符串,因此不能定义为常量。

    请改用以下代码:

    Dim WHAT_TO_FIND as string 
    WHAT_TO_FIND = SearchSelectPPComboBox.value
    

    【讨论】:

    • 您好,谢谢!但是当我删除“”时,需要一个编译错误“常量表达式。哦,尼古拉斯告诉我调试对吗?但是我的 For Each PP In rngList SearchSelectPPComboBox.AddItem PP.Offset(, 1) Next PP is looping. 我该怎么做让它循环直到空行?我尝试添加 Nicolas' 来停止循环,但出现错误@DragonSamu
    • 我的错误,常量需要非变量字符串,SearchSelectPPComboBox.value 是变量字符串,因此不能定义为常量。使用常量的原因是什么?而不仅仅是将 Dim WHAT_TO_FIND 定义为字符串,然后 WHAT_TO_FIND = SearchSelectPPComboBox.value
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多