Получить функцию диапазона в Excel VBA - PullRequest
0 голосов
/ 04 ноября 2018

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

LastRow = Sheetname.Cells(Rows.Count, 1).End(xlUp).Row

Set UserRange = Sheetname.Cells.Range("A2:A" & LastRow)

Мне нравится иметь функцию, как показано ниже:

Function GetRange(ByVal sht As Worksheet, rng As Range)

    'do things ...

End Function

Но я не знаю, как передать диапазон функции.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

только что изменил ваш код, как показано ниже, и его работа:

Public Function GetRange(ByVal ws As Worksheet, ByVal StartRow As Long, ByVal FColumnNumber As Long, Optional ByVal LColumnNumber As Long) As Range
    Dim LastRow As Long
    With ws
        LastRow = .Cells(.Rows.Count, FColumnNumber).End(xlUp).Row
        If Not LastRow < StartRow Then
            If LColumnNumber Then
                Set GetRange = .Range(.Cells(StartRow, FColumnNumber), .Cells(LastRow, LColumnNumber))
            Else
                Set GetRange = .Range(.Cells(StartRow, FColumnNumber), .Cells(LastRow, FColumnNumber))
            End If
        End If
    End With
End Function
0 голосов
/ 04 ноября 2018

Если вы хотите вернуть объект Range с использованием динамического определения конечной строки, вам необходимо указать возвращаемую функцию как объект Range и передать переменную начальной строки и номер столбца, которые необходимо использовать, в дополнение к использованию метода последней строки.

Option Explicit
Public Sub test()
    Dim ws As Worksheet, rng As Range
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set rng = GetRange(ws, 1, 1)
    Debug.Print rng.Address
End Sub

Public Function GetRange(ByVal ws As Worksheet, ByVal startRow As Long, ByVal columnNumber As Long) As Range
    With ws
        Set GetRange = Range(.Cells(startRow, columnNumber), .Cells(.Cells(.Rows.Count, columnNumber).End(xlUp).Row, columnNumber))
    End With
End Function

Возможно, вам нужна некоторая обработка ошибок / проверка того, что определенная конечная строка не меньше startRow, например. с lastRow как 3 и startRow = 4

Option Explicit
Public Sub test()
    Dim ws As Worksheet, rng As Range
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set rng = GetRange(ws, 4, 1)

    If Not rng Is Nothing Then Debug.Print rng.Address
End Sub

Public Function GetRange(ByVal ws As Worksheet, ByVal startRow As Long, ByVal columnNumber As Long) As Range
    Dim lastRow As Long
    With ws
        lastRow = .Cells(.Rows.Count, columnNumber).End(xlUp).Row
        If Not lastRow < startRow Then
            Set GetRange = .Range(.Cells(startRow, columnNumber), .Cells(lastRow, columnNumber))
        End If
    End With
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...