Здравствуйте форумчане. Подскажите пожалуйста можно ли как-нибудь без обычного перебора циклом найти на листе строку и поместить ее в массив если значение в столбце d равно переменной numer, а в столбце w переменной podr. При этом содержимое листа никак не должно изменяться. [vba]
Код
set numer="5", podr="упр."
[/vba] На листе имеется только одна строка отвечающая данным требованиям. Заранее спасибо,
Здравствуйте форумчане. Подскажите пожалуйста можно ли как-нибудь без обычного перебора циклом найти на листе строку и поместить ее в массив если значение в столбце d равно переменной numer, а в столбце w переменной podr. При этом содержимое листа никак не должно изменяться. [vba]
Код
set numer="5", podr="упр."
[/vba] На листе имеется только одна строка отвечающая данным требованиям. Заранее спасибо,Sashagor1982
Сообщение отредактировал Sashagor1982 - Четверг, 18.02.2016, 19:49
Sub Макрос3() Cells.AutoFilter Field:=1, Criteria1:="5" Cells.AutoFilter Field:=20, Criteria1:="упр." Dim v ActiveSheet.UsedRange.Copy Sheets.Add ActiveSheet.Paste v = ActiveSheet.UsedRange.Rows(2).Value Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Cells.AutoFilter End Sub
[/vba]
Или совсем без цикла- [vba]
Код
Sub Макрос3() Cells.AutoFilter Field:=1, Criteria1:="5" Cells.AutoFilter Field:=20, Criteria1:="упр." Dim v ActiveSheet.UsedRange.Copy Sheets.Add ActiveSheet.Paste v = ActiveSheet.UsedRange.Rows(2).Value Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Cells.AutoFilter End Sub
С фильтрами не подойдет, т.к работать должно с другого листа.
Разрешите ещё раз побеспокоить - [vba]
Код
Function Sashagor(WS As Worksheet, Field, Criteria) For i = 0 To UBound(Field) WS.Cells.AutoFilter Field(i), Criteria(i) Next Sashagor = WS.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas(2).Value WS.Cells.AutoFilter End Function
Sub Example() c1 = [d:d].Column: c2 = [w:w].Column numer = "5": podr = "упр." v = Sashagor(Worksheets("Лист1"), Array(c1, c2), Array(numer, podr)) MsgBox v(1, 4) & " | " & v(1, 23) End Sub
С фильтрами не подойдет, т.к работать должно с другого листа.
Разрешите ещё раз побеспокоить - [vba]
Код
Function Sashagor(WS As Worksheet, Field, Criteria) For i = 0 To UBound(Field) WS.Cells.AutoFilter Field(i), Criteria(i) Next Sashagor = WS.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas(2).Value WS.Cells.AutoFilter End Function
Sub Example() c1 = [d:d].Column: c2 = [w:w].Column numer = "5": podr = "упр." v = Sashagor(Worksheets("Лист1"), Array(c1, c2), Array(numer, podr)) MsgBox v(1, 4) & " | " & v(1, 23) End Sub
Sub еее() numer = 5 podr = "упр." With Sheets(1) 'указать свой лист lr = .Cells(Rows.Count, "d").End(xlUp).Row Dim rng, arr(), i&, k& rng = .Range("d1:w" & lr).Value For i = 1 To lr If rng(i, 1) = numer And rng(i, UBound(rng, 2)) = podr Then ReDim Preserve arr(k) arr(k) = Intersect(.Rows(i), .UsedRange).Value: k = k + 1 End If Next i End With 'Вывод на 2-й лист For i = 0 To UBound(arr) Sheets(2).Cells(i + 1, 1).Resize(, UBound(arr(i), 2)) = arr(i) Next i End Sub
Sub еее() numer = 5 podr = "упр." With Sheets(1) 'указать свой лист lr = .Cells(Rows.Count, "d").End(xlUp).Row Dim rng, arr(), i&, k& rng = .Range("d1:w" & lr).Value For i = 1 To lr If rng(i, 1) = numer And rng(i, UBound(rng, 2)) = podr Then ReDim Preserve arr(k) arr(k) = Intersect(.Rows(i), .UsedRange).Value: k = k + 1 End If Next i End With 'Вывод на 2-й лист For i = 0 To UBound(arr) Sheets(2).Cells(i + 1, 1).Resize(, UBound(arr(i), 2)) = arr(i) Next i End Sub
А вот такой вариант? Хоть и с циклом, но на 20 000 работает моментально [vba]
Код
Sub tt() ar1 = Range("D2:D20000") ar2 = Range("W2:W20000") For i = LBound(ar1) To UBound(ar1) ar1(i, 1) = ar1(i, 1) & ar2(i, 1) Next i n_ = WorksheetFunction.Match("5упр.", ar1, 0) + 1 End Sub
[/vba] Дает номер строки. Что Вы с этой строкой потом делать хотите - я не знаю.
Во, Маняша тоже с массивом поиграться решила.
А вот такой вариант? Хоть и с циклом, но на 20 000 работает моментально [vba]
Код
Sub tt() ar1 = Range("D2:D20000") ar2 = Range("W2:W20000") For i = LBound(ar1) To UBound(ar1) ar1(i, 1) = ar1(i, 1) & ar2(i, 1) Next i n_ = WorksheetFunction.Match("5упр.", ar1, 0) + 1 End Sub
[/vba] Дает номер строки. Что Вы с этой строкой потом делать хотите - я не знаю.
Во, Маняша тоже с массивом поиграться решила._Boroda_
Выдает ошибку 1004 невможно получить свойство Match.... [moder]Вы бы пример согласно правил приложили бы. Уже давно бы решили свой вопрос.[/moder]
Выдает ошибку 1004 невможно получить свойство Match.... [moder]Вы бы пример согласно правил приложили бы. Уже давно бы решили свой вопрос.[/moder]Sashagor1982
Сообщение отредактировал SLAVICK - Пятница, 19.02.2016, 14:09
list = ActiveSheet.Name Sheets.Add After:=Sheets(Sheets.Count) Worksheets(list).Range(Cells(1, col + 5), Cells(Cells(Rows.Count, col + 8).End(xlUp).Row, 2 * col + 5)).Copy Destination:=Cells(1, 1)
[/vba]
Например, скопипастить на новый лист:
[vba]
Код
Dim list As String
list = ActiveSheet.Name Sheets.Add After:=Sheets(Sheets.Count) Worksheets(list).Range(Cells(1, col + 5), Cells(Cells(Rows.Count, col + 8).End(xlUp).Row, 2 * col + 5)).Copy Destination:=Cells(1, 1)
А лучше всего сначала перенести, потом фильтровать: [vba]
Код
Dim list As String Dim col, rws, i As Integer
list = ActiveSheet.Name Sheets.Add After:=Sheets(Sheets.Count) Worksheets(list).Cells.Copy Destination:=ActiveSheet.Cells col = ActiveSheet.UsedRange.Columns.Count rws = ActiveSheet.UsedRange.Rows.Count Cells(1, 4).Copy Destination:=Cells(1, col + 2) Cells(2, col + 2).Value = numer Cells(1, 23).Copy Destination:=Cells(1, col + 3) Cells(2, col + 3).Value = podr Range(Cells(1, 1), Cells(rws, col)).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range(Cells(1, col + 2), Cells(2, col + 3)), CopyToRange:=Cells(1, col + 5), Unique:=False For i = 1 To col + 4 Columns(1).Delete Next i
[/vba]
А лучше всего сначала перенести, потом фильтровать: [vba]
Код
Dim list As String Dim col, rws, i As Integer
list = ActiveSheet.Name Sheets.Add After:=Sheets(Sheets.Count) Worksheets(list).Cells.Copy Destination:=ActiveSheet.Cells col = ActiveSheet.UsedRange.Columns.Count rws = ActiveSheet.UsedRange.Rows.Count Cells(1, 4).Copy Destination:=Cells(1, col + 2) Cells(2, col + 2).Value = numer Cells(1, 23).Copy Destination:=Cells(1, col + 3) Cells(2, col + 3).Value = podr Range(Cells(1, 1), Cells(rws, col)).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range(Cells(1, col + 2), Cells(2, col + 3)), CopyToRange:=Cells(1, col + 5), Unique:=False For i = 1 To col + 4 Columns(1).Delete Next i
Извиняюсь так как не могу прилагать примеры на выходе нужен номер строки в которой значения в столбцах соответствуют заданным. Фильтр и циклы желательно не использовать.
Извиняюсь так как не могу прилагать примеры на выходе нужен номер строки в которой значения в столбцах соответствуют заданным. Фильтр и циклы желательно не использовать.Sashagor1982