Выберите несколько столбцов данных для UsedRange Excel VBA - PullRequest
0 голосов
/ 24 января 2019

Надеюсь, кто-нибудь может помочь.Я пытаюсь выбрать данные из 4 столбцов, чтобы они были частью одного UsedRange.

. Я не хочу выделять весь столбец, только данные в каждом из четырех столбцов (C, E, F,H) как один диапазон.Если бы на листе не было пропусков, я мог бы легко использовать `Range (C1: H5) и т. Д.

Каждый столбец имеет разное количество строк, которые регулярно меняются.

Example

Ответы [ 3 ]

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

Вы можете создать мультиобласть Range с помощью метода Union , например:

Set Combined_Rage = Union(Range1, Range2) 'You can have up to 30 different Ranges

Обратите внимание, что Worksheet.UsedRange - это нечто совершенно другое, и это объект только для чтения, установленный в Excel

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

Динамическое решение с использованием цикла и union ()

Выбирает точный используемый диапазон для каждого столбца.Недостатком является то, что этот выбор не позволяет копировать / вставлять (см. Альтернативное решение).

Option Explicit

Public Sub SelectUsedRangeOfSeveralColumns()     
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim ArrCols As Variant 'define which columns to select
    ArrCols = Array("C", "E", "F", "H")

    Dim UnifiedRange As Range 'we collect the ranges here

    Dim Col As Variant
    For Each Col In ArrCols
        If UnifiedRange Is Nothing Then 'first range
            Set UnifiedRange = ws.Range(Col & "1", ws.Cells(ws.Rows.Count, Col).End(xlUp))
        Else 'all following ranges
            Set UnifiedRange = Union(UnifiedRange, ws.Range(Col & "1", ws.Cells(ws.Rows.Count, Col).End(xlUp)))
        End If
    Next Col

    'this is just to visualize what the UnifiedRange contains
    UnifiedRange.Select
End Sub

enter image description here


Альтернатива: максимальный используемый диапазон

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

Option Explicit

Public Sub SelectMAXUsedRangeOfSeveralColumns()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")

    Dim ArrCols As Variant
    ArrCols = Array("C", "E", "F", "H")

    Dim LastRow As Long
    Dim UnifiedRange As Range

    Dim Col As Variant
    For Each Col In ArrCols
        LastRow = Application.Max(LastRow, ws.Cells(ws.Rows.Count, Col).End(xlUp).Row)
        If UnifiedRange Is Nothing Then
            Set UnifiedRange = ws.Columns(Col)
        Else
            Set UnifiedRange = Union(UnifiedRange, ws.Columns(Col))
        End If
    Next Col

    Set UnifiedRange = Intersect(UnifiedRange, ws.Range(ArrCols(0) & "1", ws.Cells(LastRow, ArrCols(UBound(ArrCols)))))

    'this is just to visualize what the UnifiedRange contains
    UnifiedRange.Select
End Sub

enter image description here


Или даже короче

Может быть не так точно, как длинная версия.

Option Explicit

Public Sub SelectMAXUsedRangeOfSeveralColumns()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")

    Dim UnifiedRange As Range
    Set UnifiedRange = Intersect(ws.UsedRange, ws.Range("C:C,E:E,F:F,H:H"))


    'this is just to visualize what the UnifiedRange contains
    UnifiedRange.Select
End Sub

enter image description here

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

Вы можете использовать Union для объединения диапазонов в один

Dim rng As Range
Dim CLastRow As Long, ELastRow As Long, FLastRow As Long, HLastRow As Long

' Update with your Sheet reference
With YourSheet
    CLastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
    ELastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
    FLastRow = .Cells(.Rows.Count, "F").End(xlUp).Row
    HLastRow = .Cells(.Rows.Count, "H").End(xlUp).Row

    Set rng = Union(.Range("C1:C" & CLastRow), _
                    .Range("E1:E" & ELastRow), _
                    .Range("F1:F" & FLastRow), _
                    .Range("H1:H" & HLastRow))
End With

Лично я бы держал их в качестве отдельных диапазонов и просто делал бы ту же операцию на каждом из них, если это необходимо.

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