Что представляет собой 3 .Cells (Rows.Count, 3)? - PullRequest
0 голосов
/ 09 января 2019

Мне не удалось найти ответ на вопрос, что здесь представляет собой одно число. Я пытаюсь найти строку, в которой происходит последнее вхождение строки, скопировать всю строку и вставить ее под этой строкой. Чтобы попытаться получить первую часть, где я могу найти значение строки последнего вхождения, что представляет эта «3»?

Dim shortname As String
Dim endRow As Integer
Dim lastRowSearchValue As Range

shortname = "CATS"

With ActiveSheet
endRow = .Cells(Rows.Count, 33).End(xlUp).Row
    For i = 1 To endRow
        If .Cells(i, 33) = shortname Then
            lastRowSearchValue = i
        End If
    Next i
End With

lastRowSearchValue.Copy

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Исправляющий код

endRow должен быть объявлен как long, потому что .Rows.Count превышает ограничение для Integer. 33 - номер столбца или столбец AG. Ваш код ищет CATS в столбце AG, начиная со строки 1 до последней строки с данными, и при обнаружении присваивает найденный номер строки lastRowSearchValue, что неверно, поскольку lastRowSearchValue - это диапазон. Правильным будет Set lastRowSearchValue = .Cells(i, 33), чтобы можно было продолжить с lastRowSearchValue.Copy. Он продолжит поиск до конца, чтобы найти другие вхождения CATS. Чтобы остановить это, вы можете добавить строку Exit For, чтобы выйти из цикла, когда CATS был найден. Но так как вы действительно хотите найти последнее вхождение, вы не хотите этого делать.

Я решил объявить lastRow как Long, чтобы получить последнюю встречающуюся строку, а затем скопировать эту строку на одну строку ниже. Чтобы сделать его менее запутанным, я использовал буквы столбца.

Код

Sub CopyRowBelowWhenFound()

    Dim shortname As String
    Dim endRow As Long
    Dim lastRow As Long
    Dim i As Integer

    shortname = "CATS"

    With ActiveSheet
        endRow = .Cells(.Rows.Count, "AG").End(xlUp).Row
        For i = 1 To endRow
            If .Cells(i, "AG") = shortname Then
                lastRow = i
            End If
        Next i
        With .Cells(lastRow, "AG")
            .EntireRow.Copy .Offset(1, 0).EntireRow
        End With
    End With

End Sub
0 голосов
/ 09 января 2019

Полагаю, вам нужна ячейка, а не номер строки. В любом случае, следующий код пытается найти эту ячейку:

Sub FFF()
    Dim cell As Range, lastRowSearchValue&
    Set cell = Columns(33).Find(What:="CATS", LookAt:=xlWhole, SearchDirection:=xlPrevious)
    If Not cell Is Nothing Then
        lastRowSearchValue = cell.Row
    Else
        MsgBox "No value found", vbExclamation
    End If
End Sub
0 голосов
/ 09 января 2019

Cells(Row,Column)

Так что это номер столбца.

См .: https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.cells

Итак, .Cells(Rows.Count, 33).End(xlUp).Row начинается внизу столбца 33 и выполняет поиск вверх, пока не найдет первую ячейку снизу, которая имеет значение.

Затем цикл переходит от первой строки к последней строке и проверяет значение в этом столбце в каждой строке.

Если .Cells(i, 33) = shortname Затем проверяется эта ячейка, каждая в этом столбце, если ее значение совпадает с shortname

но это, вероятно, проблема х / у, поскольку lastRowSearchValue = i не возвращает диапазон, а длинный:

Вы хотите:

Set lastRowSearchValue = .Cells(i,33)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...