VBA - Очистить ячейки найденного (динамического) диапазона до последней строки - PullRequest
0 голосов
/ 18 февраля 2019

Это почти тот же вопрос, размещенный здесь:

Excel VBA - Как очистить динамический диапазон (от нижнего заголовка до последней строки)

Однако, учитывая, что это старая ветка И предоставленные решения не работают, я отправляю вопрос так, как пытаюсь решить мою проблему.

Здесь найдено два решения для поиска правильного столбца:

VBA - Найти столбец с определенным заголовком и найти сумму всех строк в этом столбце

https://www.extendoffice.com/documents/excel/4879-excel-select-column-by-header-name.html

Решение для очистки Содержимое, найденное здесь:

Excel VBA - Как очистить динамический диапазон (от нижнего заголовка до последней строки)

Вот что я пытался заставить работать:

With ActiveSheet

    xStr = "Product Folder"

    Set aCell = .Range("B2:J2").Find(What:=xStr, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)

    'If Found
    If Not aCell Is Nothing Then

        col = aCell.Column
        colName = Split(.Cells(, col).Address, "$")(1)

        lRow = .Range(colName & .Rows.count).End(xlUp).Row

        'This is your range
        Set Rng = .Range(colName & "2" & lRow)

    'If not found
    Else

        MsgBox "Column Not Found"

    End If

    Range(Rng).Resize(Rows.count - 1, Columns.count).Offset(1, 0).ClearContents

End With

Я могу получить ВСЕ необходимую информацию (столбец, заголовок, диапазон и т. Д.), Но не могу найти способ очистки содержимого.

С кодом, как указано выше, я получаю ошибку:

Метод 'Range' объекта '_Global' завершился ошибкой

Я пытался изменить

    lRow = .Range(colName & .Rows.count).End(xlUp).Row

    'This is your range
    Set Rng = .Range(colName & "2" & lRow)

На это:

    lRow = Range(colName & .Rows.count).End(xlUp).Row

    'This is your range
    Set Rng = Range(colName & "2" & lRow)

И эта строка:

Range(Rng).Resize(Rows.count - 1, Columns.count).Offset(1, 0).ClearContents

На это:

Rng.Resize(Rows.count - 1, Columns.count).Offset(1, 0).ClearContents

Но тогда я получаю эту ошибку:

Ошибка приложения или объекта

Попытка изменить это:

    'If Found
If Not aCell Is Nothing Then

    col = aCell.Column
    colName = Split(.Cells(, col).Address, "$")(1)

    lRow = .Range(colName & .Rows.count).End(xlUp).Row

    'This is your range
    Set Rng = .Range(colName & "2" & lRow)

'If not found
Else

    MsgBox "Column Not Found"

End If

Range(Rng).Resize(Rows.count - 1, Columns.count).Offset(1, 0).ClearContents

К этому:

'If Found
    If Not aCell Is Nothing Then

        col = aCell.Column
        colName = Split(.Cells(, col).Address, "$")(1)

        lRow = Range(colName & .Rows.count).End(xlUp).Row + 1

        Set myCol = Range(colName & "2")

        'This is your range
        Set Rng = Range(myCol & ":" & colName & lRow)

    'If not found
    Else

        MsgBox "Column Not Found"

    End If

    Rng.Clear

Затем я получаю сообщение об ошибке в строке Set Rng:

Метод 'Range' объекта '_Global' не выполнен

Я знаю, что сама строка не совсем корректна (очевидно), но я просто не знаю, как еще получить код, который будет читаться как Range("A2:A" & Lastrow).Clear

1 Ответ

0 голосов
/ 18 февраля 2019

Это действительно то, что вызывает ошибку:

Set Rng = Range(myCol & ":" & colName & lRow)

Для Range() требуются параметры, которые являются либо диапазонами, либо строками.

Не оба.Попробуйте это: Set Rng = Range(myCol.Address & ":" & colName & lRow)

Sub TestMe()

    Dim rng As Range
    Dim myCol As Range
    Dim colName As String
    Dim lRow As Long

    Set myCol = Range("A5")
    colName = "A"
    lRow = 15
    Set rng = Range(myCol.Address & ":" & colName & lRow)    
End Sub

Или попробуйте это, передав 2 объекта диапазона:

With Worksheets(1)
    Set rng = .Range(myCol, .Cells(lRow, colName))
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...