变量超出范围或无法识别

时间:2019-05-20 09:12:04

标签: excel vba

我需要一些有关代码的建议。如果某些成员可以编辑我的代码,我非常感谢。谢谢

我的下面代码在B列上查找名称,如果满足两个条件,则将结果复制到另一张纸上: -G列上的row.value =“进行中” -C列上的row.value =“ HP”

当我运行此代码时,出现错误消息框“对象范围” _Worksheet失败。

我正在尝试将mytable更改为范围“ mytable to ShSReturn.ListObject(“ Survey Return”)“,另一个消息错误” Subscription超出范围“

Sub LOf()

    Dim cell As Variant
    Dim myrange As Long, lastrow As Long, finalrow As Long, resultrow As Long
    Dim mytable As Range

    lastrow = ShSReturn.Range("G" & ShSReturn.Rows.Count).End(xlUp).Row
    finalrow = ShSReturn.Range("C" & ShSReturn.Rows.Count).End(xlUp).Row
    resultrow = ShSReturn.Range("B" & ShSReturn.Rows.Count).End(xlUp).Row

    Set mytable = ShSReturn.ListObjects("Survey Return")

    cell = 7

    For Each cell In mytable
        If mytable.Cells(cell, lastrow).Value = "Ongoing" _
        And mytable.Cells(cell, finalrow).Value = "HP" Then

        mytable.Cells(cell, resultrow).Copy
        ShPPT.Cells(cell, 17).PasteSpecial xlPasteValues

        resultrow = resultrow + 1

        End If

    Next cell

End Sub

1 个答案:

答案 0 :(得分:0)

I think there's some confusion about the nature of your ListObject, as specified in your original code (see comments to the question). When you select a bunch of cells and go to Insert -> Table, then as well as the table object, Excel defines a Range with the name of that table: a named Range. This Range may be referenced directly in VBA as such:

Set mytable = Range("Table1")

Note that Range names may not contain spaces

On the assumption that you have a named Range, it might be something like this:

Sub LOf()
    Dim myrange As Long, lastrow As Long, finalrow As Long, resultrow As Long
    Dim mytable As Range
    lastrow = ShSReturn.Range("G" & ShSReturn.Rows.Count).End(xlUp).Row
    finalrow = ShSReturn.Range("C" & ShSReturn.Rows.Count).End(xlUp).Row
    resultrow = ShSReturn.Range("B" & ShSReturn.Rows.Count).End(xlUp).Row
    Set mytable = ActiveSheet.Range("SurveyReturn") ' It's best to specify which sheet your source data is on. Presumably "ShSReturn" is the CodeName of your results sheet

    Dim x As Long

    For x = 7 To mytable.Cells(mytable.Cells.Count).Row ' Start at Row 7, and finish at the row number of the last cell in that Range
        If mytable.Cells(x, **lastrow**).Value = "Ongoing" And mytable.Cells(x, **finalrow**).Value = "HP" Then
            mytable.Cells(x, **resultrow**).Copy
            ShPPT.Cells(cell, 17).PasteSpecial xlPasteValues
            resultrow = resultrow + 1
        End If
    Next x
End Sub

Note that the above code will not work in its present form. What I have done is an approximation of what I think you're looking for: however you're going to have to do a bit of work, because the code in your question has some fundamental issues. For example, in your code you have lines like this:

mytable.Cells(cell, resultrow).Copy

However addressed cells within Ranges are in the format Range.Cells(Row, Column) - where Row and Column are numbers. However in your code resultrow as defined at the top is a Row, not a Column. You need to work out what exactly you want to copy, in terms of which row/column and re-write your code accordingly.

If you want to provide clarity, I'll be happy to edit my answer to accommodate what you want.