Скопировать неизвестный диапазон из определенного листа - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь сделать копию в VBA, как часть большего макроса, поэтому он должен быть в VBA, с неизвестным диапазоном в определенной рабочей таблице.

У меня есть этот код, который работает, если яЯ нахожусь в этой таблице:

Sub Copy()
Range("O2", Range("O" & Cells(Rows.Count, "A").End(xlUp).Row)).copy
End Sub()

И у меня ниже, что работает для определенного диапазона:

Sub Test()
    Worksheets("Data").Range("O2:O10").Copy
End Sub()

Как я могу заставить второй код работать как неопределенный.

Спасибо,

Ответы [ 5 ]

0 голосов
/ 29 сентября 2018

Вам явно не нравится использовать переменные, поэтому:

Worksheets("Data").Range("O2", Worksheets("Data").Range("O" & Cells(Rows.Count, "A").End(xlUp).Row)).copy

будет достаточно.

Как правило, более распространенным решением будет использование intersect и CurrentRegion:

Application.intersect(Worksheets("Data").Range("O2").CurrentRegion,Worksheets("Data").Range("O2:O999999")).copy
0 голосов
/ 29 сентября 2018

вы могли бы использовать функцию, в которую вы передаете диапазон «семени» и возвращаете диапазон от пропущенной до последней непустой ячейки в том же столбце, как показано ниже (пояснения в комментариях)

Function GetRange(rng As Range) As Range
    With rng.Parent ' reference passed range parent worksheet
        Set GetRange = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp)) ' return referenced sheet range from passed range to passed range column last not empty cell
    End With
End Function

для использования следующим образом:

Sub Test()
    GetRange(Worksheets("Data").Range("O2")).Copy
End Sub

Вы можете улучшить функцию и заставить ее обрабатывать заданную «последнюю» строку

Function GetRange(rng As Range, Optional finalRow As Variant) As Range
    With rng.Parent ' reference passed range parent worksheet
        If IsMissing(finalRow) Then ' if no "final" row passed
            Set GetRange = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp)) ' return referenced sheet range from passed range to passed range column last not empty cell
        Else 'else
            Set GetRange = .Range(rng, .Cells(finalRow, rng.Column)) ' return referenced sheet range from passed range to passed range column cell in give "final" row
        End If
    End With

для использования следующим образом:

Sub Test()
    GetRange(Worksheets("Data").Range("O2"), 2).Copy
End Sub

, оставив «последний» ряд необязательным, можно использовать функцию с ее передачей или без нее:

Sub Test()
    GetRange(Worksheets("Data").Range("O2")).Copy ' this will copy worksheet "Data" range from row 2 down to its column "O" last not empty row
    GetRange(Worksheets("Data").Range("O2"), 3).Copy ' this will copy worksheet "Data" range from row 2 down to row 3
End Sub
0 голосов
/ 28 сентября 2018

Вы должны практиковаться, чтобы всегда полностью квалифицировать все ваши Sheet и Range объекты.

Приведенный ниже код немного длинный, но это хорошая практика, чтобы определить и установить все ваши объекты и переменные.

Код

Option Explicit

Sub Test()

Dim Sht As Worksheet
Dim LastRow As Long

' set your worksheet object
Set Sht = ThisWorkbook.Worksheets("Data")

With Sht
    ' get last row in column A
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    ' copy dynamic range in column O
    .Range("O2:O" & LastRow).Copy
End With

End Sub
0 голосов
/ 28 сентября 2018

В какой-то момент ваш код должен будет знать диапазон, который будет скопирован, верно?Вы назначаете это переменной и используете ее.

Option Explicit 

Sub Test()
  Dim startRow as Long
  startRow = 'your method of determining the starting row
  Dim startCol as Long
  startCol = 'your method of determining the starting column
  Dim endRow as Long
  endRow = 'your method of determining the ending row (Last used row would work just fine)
  Dim endCol as Long
  endCol = 'your method of determining the ending column

  With Worksheets("Data")
    .Range(.Cells(startRow, startCol), .Cells(endRow, endCol)).Copy
  End with

End Sub
0 голосов
/ 28 сентября 2018

Самое простое и самое грязное решение это:

Range("O2:O" & Cells(Rows.Count, "A").End(xlUp).Row).Copy

, или вы можете выделить последнюю строку в виде отдельной переменной:

lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range("O2:O" & lastRow).Copy

в конце, можно решитьобъявите диапазон для копирования как отдельную переменную и работайте с ней, объявив также родительский лист:

Public Sub TestMe()

    Dim lastRow As Long
    Dim ws As Worksheet
    Dim rangeToCopy As Range

    Set ws = workshetes("Sheet1")

    With ws
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set rangeToCopy = .Range("O2:O" & lastRow)
        rangeToCopy.Copy
    End With

End Sub

И еще один шаг вперед - использование выделенной функции для поиска последней строки на листе( GitHub репо здесь ):

Function lastRow(wsName As String, Optional columnToCheck As Long = 1) As Long

    Dim ws As Worksheet
    Set ws = Worksheets(wsName)

    lastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row

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