Как выбрать определенные строки на листе

У меня есть очень большой файл Excel, и я хочу перенести всю информацию с рабочего листа в переменную варианта.

Мне не нужны все строки из файла, поэтому я хочу выбрать интересующие меня строки.

Я попытался создать сложную переменную Range, используя Союз для выбора интересующих меня строк.

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

пример: У меня есть такая таблица:

123|1|1|1
123|2|2|2
456|3|3|3
123|4|4|4

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

Я нуждаюсь:

123|1|1|1
123|2|2|2
123|4|4|4

но получить:

123|1|1|1
123|2|2|2

Ниже будет часть моего кода. Эта часть находится в цикле

р - Диапазон

WS — рабочий лист

Set r = WS.Range("A1:A1")

Может ли кто-нибудь помочь мне с этим. Ищу решение уже час.

If WS.Cells(i, 1).Value = "123" Then
    If r.Columns.Count() < 2 Then
        Set r = WS.Range(WS.Cells(i, 1), WS.Cells(i, 4))
    Else
        Set r = Union(r, WS.Range(WS.Cells(i, 1), WS.Cells(i, 4)))
    End If
End If

Как насчет фильтрации первого столбца по нужному значению? Возможно, вам вообще не нужен VBA для этого. Вероятно, это можно сделать с помощью Power Query всего за несколько кликов без написания кода VBA.

teylyn 18.07.2019 13:03

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

Liquid Cat 18.07.2019 13:08

Фильтрация - это путь. Вы не говорите, как вы возвращаетесь r. Вероятно, вам нужно пройтись по его областям, поскольку они не являются смежными.

SJR 18.07.2019 13:10

Ну тогда это фильтрация. Не хотел фильтровать, но, думаю, это путь...

Liquid Cat 18.07.2019 13:13

Как они говорят вам выше, фильтрация - это способ, просто потому, что фильтрация будет выполняться один раз, а попытка построить Range путем зацикливания большого файла займет много времени. После того, как ваши данные отфильтрованы, вы можете построить диапазон, используя SpecialCells(xlCellTypeVisible), не пытайтесь вытащить отфильтрованные данные в переменную Variant, потому что это не сработает.

Damian 18.07.2019 13:16

Я попробую это. Спасибо

Liquid Cat 18.07.2019 14:00

Фильтрация - это более простой вариант... не оптимальный. Если у вас большой файл, вам придется фильтровать и удалять фильтры, что может занять много времени. Вы можете просто получить свой диапазон в массиве, а затем использовать массив для построения своего "вариант".

Zac 18.07.2019 14:19

Разрешено ли вам сортировать данные перед копированием?

Mark Fitzgerald 18.07.2019 14:30
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
8
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает, используя ваш подход:

Sub x()

Dim r As Range, ws As Worksheet, i As Long
Dim j As Long

Set ws = ActiveSheet
Set r = ws.Range("A1")

For i = 1 To 4
    If ws.Cells(i, 1).Value = 123 Then
        If r.Columns.Count < 2 Then
            Set r = ws.Range(ws.Cells(i, 1), ws.Cells(i, 4))
        Else
            Set r = Union(r, ws.Range(ws.Cells(i, 1), ws.Cells(i, 4)))
        End If
    End If
Next i

For j = 1 To r.Areas.Count
    Range("G" & Rows.Count).End(xlUp)(2).Resize(r.Areas(j).Rows.Count, r.Areas(j).Columns.Count).Value = r.Areas(j).Value
Next j

End Sub


Используя массивный подход, результаты сохраняются в v2.

Sub x()

Dim ws As Worksheet, i As Long, j As Long, v As Variant, v2() As Variant

v = Range("A1:D4").Value

ReDim Preserve v2(1 To UBound(v, 1), 1 To UBound(v, 2))

For i = LBound(v, 1) To UBound(v, 1)
    If v(i, 1) = 123 Then
        j = j + 1
        v2(j, 1) = v(i, 1)
        v2(j, 2) = v(i, 2)
        v2(j, 3) = v(i, 3)
        v2(j, 4) = v(i, 4)
    End If
Next i

Range("G1").Resize(j, UBound(v2, 2)).Value = v2

End Sub

Спасибо. Но мне нужно передать информацию в переменную. Не в файле excel. Есть ли способ сделать это? Я делаю так, но безрезультатно: temp = r.Value

Liquid Cat 18.07.2019 13:58

Массив? Почему бы тогда не сделать все это через массивы?

SJR 18.07.2019 14:04

Как это сделать? Я имею в виду, я пытался использовать ReDim Preserve, но не получил никаких хороших результатов. (Я новичок в VBA, поэтому у меня много проблем с моим кодом)

Liquid Cat 18.07.2019 14:36

Отредактированный ответ выше.

SJR 18.07.2019 14:49

Другие вопросы по теме