У меня есть очень большой файл 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
Это может работать, но разве это не медленнее, чем просто выбирать определенные строки? Это очень важно для меня, потому что у меня есть пара больших файлов, и я хочу максимально оптимизировать свою программу.
Фильтрация - это путь. Вы не говорите, как вы возвращаетесь r. Вероятно, вам нужно пройтись по его областям, поскольку они не являются смежными.
Ну тогда это фильтрация. Не хотел фильтровать, но, думаю, это путь...
Как они говорят вам выше, фильтрация - это способ, просто потому, что фильтрация будет выполняться один раз, а попытка построить Range путем зацикливания большого файла займет много времени. После того, как ваши данные отфильтрованы, вы можете построить диапазон, используя SpecialCells(xlCellTypeVisible), не пытайтесь вытащить отфильтрованные данные в переменную Variant, потому что это не сработает.
Я попробую это. Спасибо
Фильтрация - это более простой вариант... не оптимальный. Если у вас большой файл, вам придется фильтровать и удалять фильтры, что может занять много времени. Вы можете просто получить свой диапазон в массиве, а затем использовать массив для построения своего "вариант".
Разрешено ли вам сортировать данные перед копированием?


Это работает, используя ваш подход:
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
Массив? Почему бы тогда не сделать все это через массивы?
Как это сделать? Я имею в виду, я пытался использовать ReDim Preserve, но не получил никаких хороших результатов. (Я новичок в VBA, поэтому у меня много проблем с моим кодом)
Отредактированный ответ выше.
Как насчет фильтрации первого столбца по нужному значению? Возможно, вам вообще не нужен VBA для этого. Вероятно, это можно сделать с помощью Power Query всего за несколько кликов без написания кода VBA.