Страницы: 1
RSS
Перенос данных с одного листа на другой по определенному признаку
 
Подскажите, как сделать так, чтобы данные переносились из одного листа в другой по опредленному признаку? Без макросов это можно сделать, я их не знаю (  
В прикрепленном примере - если например по признаку 1 значение = а, то как сдлеть, чтобы перенеслась вся строка?
 
{quote}{login=nnn_0202}{date=26.12.2011 02:12}{thema=Перенос данных с одного листа на другой по определенному признаку}{post}...если например по признаку 1 значение = а, то как сдлеть, чтобы перенеслась вся строка?{/post}{/quote}  
См. - http://www.planetaexcel.ru/forum.php?thread_id=35904 ... ;)  
-86319-
 
Так и макросом не сложно - алгоритм точно такой, как это можно рассказать словами:  
просматриваем один диапазон и все строки, где есть нужный признак, копируем на другой лист.  
Реализовать это можно разными способами - зависит от задачи (объёма данных, нужно ли копировать только данные или ещё и форматы, что ещё расположено на листе, по какому событию нужно делать эту работу и т.д.)
 
{quote}{login=Z}{date=26.12.2011 02:42}{thema=Re: Перенос данных с одного листа на другой по определенному признаку}{post}{quote}{login=nnn_0202}{date=26.12.2011 02:12}{thema=Перенос данных с одного листа на другой по определенному признаку}{post}...если например по признаку 1 значение = а, то как сдлеть, чтобы перенеслась вся строка?{/post}{/quote}  
См. - http://www.planetaexcel.ru/forum.php?thread_id=35904 ... ;)  
-86319-{/post}{/quote}  
 
Z, просто нужно очень срочно. я даже не могу сообразить, какой раздел справки читать. Будет очень большая база данных, из которой должны формироваться отдельные листы с данными, по определенным признакам (столбцов и строк соотв тоже будет много) а уже на их основе будет строиться сводные таблицы. И перенесенные данные должны обновляться. Ну подскажите п-та, в каком хотя бы направлении копать? )
 
Скорее всего макрос/ы, как упомянул Hugo, но я в них, увы... Совет один - http://www.planetaexcel.ru/forum.php?thread_id=8735 - и в них особенно внимательно п.3....
 
nnn_0202  
 
1) у вас в ячейке А2 вставлена русская буква "а", замените её на АНГЛИЙСКУЮ букву "а"  
 
2) учите макросы. См. файл. Код макроса можете посмотреть нажав Alt+F11 в приложенном файле.  
 
Код небольшой    
 
Sub Test()  
Dim iCell As Range, Priznak As Variant  
     
   Priznak = Application.InputBox("Укажите признак переноса строки", "Признак", "a")  
   For Each iCell In Range("A2", [A2].End(xlDown)) 'цикл по всем ячейкам А2 и ниже
       If iCell = Priznak Then  
           With Sheets("Лист2") 'копируем на Лист2  
               iCell.EntireRow.Copy Destination:=.Cells(.Cells(Rows.Count, "A").End(xlUp).Row + 1, "A")  
           End With  
       End If  
   Next iCell  
   MsgBox "Строки содержащие " & Priznak & " в столбце А скопированы на другой лист!", vbInformation, ""  
End Sub
 
Если "Будет очень большая база данных" то и обрабатывать думаю стоит как базу - с помощью SQL, или можно подключить файл как внешние данные к Access и там его мастером составить запрос, результат работы которого можно сохранить в xls.  
Ну или брать диапазон в массив, создавать массив для результата, перебором отбирать нужное, выгружать.  
Принцип как в коде Mouse, но в 50 раз быстрее - для больших объёмов.  
Кое Mouse хороший, но не для десятков тысяч строк.
 
А что подразумеваются большие объёмы?  
 
Хм, ну, ещё можно попробовать через Автофильтр.  
 
Макросом - с помощью Автофильтра фильтруем таблицу и видимые строки просто копируем на соседний лист. Наверное, будет быстрее того кода, который я предложил
 
Такой вариант, сродни автофильтру:  
 
 
Sub tt()  
   Dim x As Range, Priznak As Variant: Application.ScreenUpdating = False  
   Priznak = Application.InputBox("Укажите признак переноса строки", "Признак", "a")  
   Set x = [A:A].Find(Priznak, , , xlWhole)
   If Not x Is Nothing Then  
       [A:A].ColumnDifferences(x).EntireRow.Hidden = True
       ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Copy Sheets("Лист2").[a1]
       Rows.Hidden = False  
   End If  
End Sub  
 
 
Можно отдельной строкой сперва скопировать заголовок (или другой прописать, или может он уже есть?), и затем копировать не в А1, а ниже, или в первую пустую, как у Mouse.
 
Спасибо всем огромное за отклик! Приедется осваивать макросы... Думала может без них есть какая-нибудь волшебная формула))  
Данных будет много...в самой базе только столбцов 40.. плюс надо вытягивать на другие листы данные и делать там дополнительные расчеты..  
Завтра на работе попробую. Еще раз всем спасибо!
 
nnn_0202, а что вас пугает? У вас есть мы, вы можете в любой момент задать вопрос нам и мы вам поможем.
 
да я никогда макросы не писала, только те, где записываешь повторения действий, без кодов. Спасибо за поддержку, буду пробовать )
 
{quote}{login=Mouse}{date=26.12.2011 04:50}{thema=}{post}nnn_0202  
 
1) у вас в ячейке А2 вставлена русская буква "а", замените её на АНГЛИЙСКУЮ букву "а"  
 
2) учите макросы. См. файл. Код макроса можете посмотреть нажав Alt+F11 в приложенном файле.  
 
Код небольшой    
 
Sub Test()  
Dim iCell As Range, Priznak As Variant  
     
   Priznak = Application.InputBox("Укажите признак переноса строки", "Признак", "a")  
   For Each iCell In Range("A2", [A2].End(xlDown)) 'цикл по всем ячейкам А2 и ниже
       If iCell = Priznak Then  
           With Sheets("Лист2") 'копируем на Лист2  
               iCell.EntireRow.Copy Destination:=.Cells(.Cells(Rows.Count, "A").End(xlUp).Row + 1, "A")  
           End With  
       End If  
   Next iCell  
   MsgBox "Строки содержащие " & Priznak & " в столбце А скопированы на другой лист!", vbInformation, ""  
End Sub{/post}{/quote}  
 
Спасибо, в примере все работает. Но есть одно но. Надо чтобы данные по признакам  копировались на разные листы. Признак а - на один лист. Б - на другой ... Извините, что сразу подробно не сформулировала (( а что надо в коде поменять для этого?..
 
Завести в коде побольше Priznak'ов и побольше условий If iCell = Priznak Then  
Т.е. сперва проверяем на один признак и копируем в один лист, дальше проверяем на другой признак и копируем в другой лист и т.д.  
Можно условия поставить в цепочку (т.к. по логике сработает только одно), можно встроить одно в другое или использовать select case - если возможно перекрытие, которое нельзя допустить (например, проверяете строку "а и б и в" на присутствие в ней "а и б" и одновременно на присутствие "а".
 
Сегодня еще раз все обсудили, подумали, что такую огромную базу если вести ее за год макросы будут тормозить + с учетом задачи формирования сводных таблиц... Решили стоить базу в access.  
Огромное всем спасибо за помощь! Предложенный макрос буду использовать для решения более простых задач.
Страницы: 1
Читают тему
Наверх