Страницы: 1
RSS
Копирование строк по значению в ячейке
 
Всем привет. Помогите пожалуйста решить задачку. В поиске искала, найти похожее или чуток похожее не удалось.  
Есть книга с данными, в ней в 3-х столбцах отображаются недели изменения/создания/удаления. Необходим макрос (желательно кнопку, но это я сделаю), при нажатии которой он обращаясь к ячейке A1 будет искать такие же значения в столбцах Изменено/Создано/Удалено и копировать на отдельный лист или книгу. Пример во вложении.  
Проблема у меня начинается с фразы того, чтобы он искал именно по значению в ячейке А1. (Там будет строго формат S23_2011).  
Пыталась записать макрос из действий которые я проделываю, тоже не совсем то. Дайте совет или окажите пожалуйста помощь :)
 
{quote}{login=Aleksashko}{date=08.06.2011 10:45}{thema=Копирование строк по значению в ячейке}{post} Проблема у меня начинается с фразы того, чтобы он искал именно по значению в ячейке А1. (Там будет строго формат S23_2011).  
{/post}{/quote}  
Вот когда будет, тогда и приходите.  
А сейчас нет. И при такой формулировке хотелка непонятна.
 
На листе "Изменено" - итоговый отчёт? Почему туда не попали остальные?
 
Найти и скопировать нужные строки не проблема - можно через Find по кругу, можно например взять данные в массив, потом перебором определить нужную строку (различными способами) и переложить в другой массив, который потом выгрузить на второй лист.  
Но вот куда выгружать - в низ или поверх? Старые данные нужно дополнить или переписать? Данные на первом листе будут дополняться или перезаписываться перед нажатием этой кнопки?
 
{quote}{login=Юрий М}{date=08.06.2011 10:55}{thema=}{post}На листе "Изменено" - итоговый отчёт? Почему туда не попали остальные?{/post}{/quote}  
Не совсем итоговый, просто дальше продолжать не стала
 
{quote}{login=Hugo}{date=08.06.2011 10:59}{thema=}{post}  
Но вот куда выгружать - в низ или поверх? Старые данные нужно дополнить или переписать? Данные на первом листе будут дополняться или перезаписываться перед нажатием этой кнопки?{/post}{/quote}  
Выгружать на отдельный лист по принципу Изменено - все строки которые найдены с условием, затем Создано - все строки которые найдены с условием, затем Удалено - все строки которые найдены с условием.  
Данные будут пополняться на первом листе строго до нажатия кнопки. Т.е. всю неделю данные вносятся, а потом изменения которые были внесены необходимо скопировать на отдельный лист или книгу.
 
{quote}{login=RAN}{date=08.06.2011 10:54}{thema=Re: Копирование строк по значению в ячейке}{post}{quote}{login=Aleksashko}{date=08.06.2011 10:45}{thema=Копирование строк по значению в ячейке}{post} Проблема у меня начинается с фразы того, чтобы он искал именно по значению в ячейке А1. (Там будет строго формат S23_2011).  
{/post}{/quote}  
Вот когда будет, тогда и приходите.  
А сейчас нет. И при такой формулировке хотелка непонятна.{/post}{/quote}  
Добрее надо быть :)Нет так нет, спасибо что уделили время
 
Так покажите нам конечный/желаемый результат. И ответьте на вопрос Hugo - отчёт по кнопке должен переписываться или дополняться?
 
{quote}{login=Юрий М}{date=08.06.2011 11:16}{thema=}{post}Так покажите нам конечный/желаемый результат. И ответьте на вопрос Hugo - отчёт по кнопке должен переписываться или дополняться?{/post}{/quote}  
 
Примерно как во вложении
 
Послушайте, Aleksashko, в первом файле второй лист выглядит совсем иначе. И не факт, что предложенный Вам вариант окажется правильным, и не потребуется переделка. Если уж Вы сами не знаете, как должен выглядеть результат - нам тем более это неизвестно.
 
{quote}{login=Юрий М}{date=08.06.2011 11:25}{thema=}{post}Послушайте, Aleksashko, в первом файле второй лист выглядит совсем иначе. И не факт, что предложенный Вам вариант окажется правильным, и не потребуется переделка. Если уж Вы сами не знаете, как должен выглядеть результат - нам тем более это неизвестно.{/post}{/quote}  
Я изменила первый файл для более наглядного примера. Мне кажется что так я наиболее ясно отобразила что желательно увидеть в итоге.
 
А мне кажется, что запутали - внесли неопределённость. Интерес к теме потерян.
 
второй файл не смотрел. Исходя из первого можно сделать примерно так  
 
Dim r, rto  
 
Sheets("Изменено").Cells.Clear  
With Sheets("Данные")  
   .Rows(2).Copy Destination:=Sheets("Изменено").Rows(1)  
   rt = 2  
   For r = 3 To .Cells(Rows.Count, 1).End(xlUp).Row  
       If .Cells(r, 2) = .Cells(1, 1) Or .Cells(r, 3) = .Cells(1, 1) Or .Cells(r, 4) = .Cells(1, 1) Then  
           .Rows®.Copy Destination:=Sheets("Изменено").Rows(rt)  
           rt = rt + 1  
       End If  
   Next r  
End With
 
{quote}{login=Юрий М}{date=08.06.2011 11:31}{thema=}{post}А мне кажется, что запутали - внесли неопределённость. Интерес к теме потерян.{/post}{/quote}  
Без возможности восстановления интереса? :)Я еще никогда не обращалась с вопросом. Для меня понятен файл, как создателю, и я не совсем точно понимаю что необходимо было указать в пожеланиях, объяснила как смогла.
 
Как понял.
 
Огромное спасибо! Оба ответа это то, что нужно.    
Удачного вам дня и прекрасного настроения.
 
Я тоже не понял...  
Мне кажется, что нужно так -    
1. за неделю набрали данные ( ну или даже за пару дней)  
2. жмём кнопку  
3. данные раскидываются по трём листам, дописываясь вниз.  
4. исходные данные удаляются.  
 
Есть вопрос - как быть, если данные некорректны - например, в одной строке две/три записи, или наоборот, нет записей, только фамилия?
 
Упс, пока писал (отвлекли), уже почти так RAN и сделал.  
Про дату я забыл - а зачем она вообще? :)  
В этом варианте все даты всё равно сваливаются на один лист - если поставить другую дату, то данные за другую дату добавятся по листам ниже.  
Может быть тогда каждый отбор нужно делать в новую свежесозданную книгу/книги?  
Тогда есть смысл в датах и нет нужды стирать входные данные. Просто на каждую выбранную дату будут заново отбираться все данные в новые файлы.  
И в общем отбирать тогда данные можно не каждую неделю, а по требованию. Понадобилось за первый понедельник января - сделали. А входной лист будет как база данных. В общем так и правильно - всё держать в базе, а по запросу вытягивать что нужно, можно и SQL привлечь (ADO/DAO/ACCESS)...
 
{quote}{login=Hugo}{date=08.06.2011 12:58}{thema=}{post}Упс, пока писал (отвлекли), уже почти так RAN и сделал.  
Про дату я забыл - а зачем она вообще? :)  
В этом варианте все даты всё равно сваливаются на один лист - если поставить другую дату, то данные за другую дату добавятся по листам ниже.  
Может быть тогда каждый отбор нужно делать в новую свежесозданную книгу/книги?  
Тогда есть смысл в датах и нет нужды стирать входные данные. Просто на каждую выбранную дату будут заново отбираться все данные в новые файлы.  
И в общем отбирать тогда данные можно не каждую неделю, а по требованию. Понадобилось за первый понедельник января - сделали. А входной лист будет как база данных. В общем так и правильно - всё держать в базе, а по запросу вытягивать что нужно, можно и SQL привлечь (ADO/DAO/ACCESS)...{/post}{/quote}  
Действительно ты прав, нужды стирать данные нет, они накапливаемые, как архив всех изменений. Предложение создавать отдельную книгу вообще замечательное, но как то сама до этого не додумалась. Спасибо.
 
Можно создать новую книгу с тремя листами, их обозвать, отформатировать как нужно столбцы/строки, заполнить данными, далее сохранить в нужную папку под именем с этой датой, или оставить активной на экране - пусть далее юзер сохраняет, или просмотрев просто закрывает без сохранения.  
С другой стороны, просто для просмотра можно текущий лист базы так "отфильтровать" - скрыть строки, в которых нет нужной даты.  
Всё зависит от итоговой цели - зачем это всё вообще нужно.
 
{quote}{login=Hugo}{date=08.06.2011 01:10}{thema=}{post}Можно создать новую книгу с тремя листами, их обозвать, отформатировать как нужно столбцы/строки, заполнить данными, далее сохранить в нужную папку под именем с этой датой, или оставить активной на экране - пусть далее юзер сохраняет, или просмотрев просто закрывает без сохранения.  
С другой стороны, просто для просмотра можно текущий лист базы так "отфильтровать" - скрыть строки, в которых нет нужной даты.  
Всё зависит от итоговой цели - зачем это всё вообще нужно.{/post}{/quote}  
Конечно всего лучше первый вариант:"Можно создать новую книгу с тремя листами, их обозвать, отформатировать как нужно столбцы/строки, заполнить данными, далее сохранить в нужную папку под именем с этой датой, или оставить активной на экране - пусть далее юзер сохраняет, или просмотрев просто закрывает без сохранения." Нужна вся эта задумка для рассылки именно изменений за определенный период. Поможешь?
 
Попозже, если никто не сделает... Обед - дело святое :)
 
{quote}{login=Hugo}{date=08.06.2011 01:38}{thema=}{post}Попозже, если никто не сделает... Обед - дело святое :){/post}{/quote}  
Приятного аппетита :)
 
Спасибо :)  
Пока собираюсь - а как это делать:  
"далее сохранить в нужную папку под именем с этой датой, или оставить активной на экране"  
?
 
{quote}{login=Hugo}{date=08.06.2011 01:58}{thema=}{post}Спасибо :)  
Пока собираюсь - а как это делать:  
"далее сохранить в нужную папку под именем с этой датой, или оставить активной на экране"  
?{/post}{/quote}  
Активной на экране, много людей могут формировать такой отчетик.
 
Так пока и не ушёл, сейчас пойду...  
Вот, запустите на примере от RAN post_235217.xls  
 
Sub ГенерироватьФайл()  
Dim InpArr, i&, a, ia&, b, ib&, c, ic&, snc&, strData$  
 
'получаем массив данных (без шапки 2 строки!!!)  
With ActiveSheet.UsedRange  
InpArr = .Resize(.Rows.Count - 2).Offset(2).Value  
strData = .Cells(1).Value  
End With  
 
'создаём пустые массивы для результатов  
ReDim a(1 To UBound(InpArr), 1 To 1)  
b = a  
c = a  
 
'запоминаем настройки Экселя  
snc = Application.SheetsInNewWorkbook  
'изменяем как нам нужно  
Application.SheetsInNewWorkbook = 3  
'открываем новую книгу с тремя листами  
Set WB = Workbooks.Add  
'возвращаем настройки как было  
Application.SheetsInNewWorkbook = snc  
 
'даём имена листам  
WB.Sheets(1).Name = "Изменено"  
WB.Sheets(2).Name = "Создано"  
WB.Sheets(3).Name = "Удалено"  
'вот с первой строкой каждого листа (наполнением и форматированием) не ясно,  
'да и вероятно ничего не нужно...  
 
'перебор и заполнение массивов  
For i = 1 To UBound(InpArr)  
If InpArr(i, 2) = strData Then ia = ia + 1: a(ia, 1) = InpArr(i, 1)  
If InpArr(i, 3) = strData Then ib = ib + 1: b(ib, 1) = InpArr(i, 1)  
If InpArr(i, 4) = strData Then ic = ic + 1: c(ic, 1) = InpArr(i, 1)  
Next i  
 
'выгрузка  
WB.Sheets(1).[a1].Resize(ia) = a
WB.Sheets(2).[a1].Resize(ib) = b
WB.Sheets(3).[a1].Resize(ic) = c
'осталось сохранить результат  
End Sub  
 
 
В листы пишет только фамилии - дата ведь одна, отобранная, будет в имени файла.  
Но можно и добавить - массив пошире, добавить присвоение значения в цикле.
 
Да, и выгрузку тогда  
'выгрузка  
WB.Sheets(1).[a1:b1].Resize(ia) = a
 
{quote}{login=Hugo}{date=08.06.2011 02:34}{thema=}{post}Да, и выгрузку тогда  
'выгрузка  
WB.Sheets(1).[a1:b1].Resize(ia) = a{/post}{/quote}
Спасибо, сейчас буду пробовать на исходнике
Страницы: 1
Наверх