Переменная вне диапазона или не может быть распознана - PullRequest
0 голосов
/ 20 мая 2019

Мне нужен совет для моего кода.Я действительно ценю, если некоторые участники могут редактировать мой код.Спасибо

Мой код ниже ищет имя в столбце B и копирует результат на другой лист, если выполнены 2 условия: - row.value в столбце G = "постоянный" - row.value в столбце C= "HP"

Когда я запускаю этот код, появляется сообщение об ошибке "Range of Object" _Worksheet не удалось.

Я пытаюсь изменить набор "mytable на ShSReturn.ListObject (" Survey Return ")" с mytable в качестве диапазона, другое сообщение об ошибке "Подписка вне диапазона"

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 голосов
/ 20 мая 2019

Я думаю, что существует некоторая путаница в природе вашего ListObject, как указано в вашем исходном коде (см. Комментарии к вопросу). Когда вы выбираете группу ячеек и переходите к Вставка -> Таблица, а затем к объекту таблицы, Excel определяет Диапазон с именем этой таблицы: именованный Диапазон. На этот диапазон можно ссылаться непосредственно в VBA как таковой:

Set mytable = Range("Table1")

Обратите внимание, что имена диапазонов могут не содержать пробелов

Если предположить, что у вас есть именованный Range, это может быть что-то вроде этого:

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

Обратите внимание, что приведенный выше код не будет работать в его нынешнем виде. То, что я сделал, является приближением того, что я думаю вы ищете: однако вам придется проделать небольшую работу, потому что у кода в вашем вопросе есть некоторые фундаментальные проблемы. Например, в вашем коде у вас есть такие строки:

mytable.Cells(cell, resultrow).Copy

Однако адресуемые ячейки в пределах диапазонов имеют формат Range.Cells (Row, Column ) - где Row и Column являются числами. Однако в вашем коде resultrow , как определено вверху, это строка, а не столбец. Вам нужно решить, что именно вы хотите скопировать, в зависимости от того, какая строка / столбец, и соответственно переписать свой код.

Если вы хотите внести ясность, я с радостью отредактирую свой ответ, чтобы учесть то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...