Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Перенос строк из соответсвующих листов


Автор: Mrak 6.4.2006, 05:32
Постановка задачи.
Есть документ в Excel, в котором 6 листов. Предположим, что названия стандартные: Лист1…..Лист 6.
У каждого листа одинаковая шапка
№ п/п Задача Дата Выполнено
(A) (B) (С) (D)
В поле выполнено будет записываться или «да» или «нет»
У нас есть второй документ с таким же порядком листов – этот документ называется архив.
Суть задачи.
При открытии файла нужно, чтобы проверялось поле выполнено в каждой строчке таблицы каждого листа. Если в нем уже написано «да», то строка таблицы должна вырезаться и вставляться в первую свободную строку в файл архив на соответствующий лист, т.е. на лист, имеющий то же название, что и исходный, но находящийся в другой книге (Архив).
Если поле «Выполнено» написано «нет», то нужно проверить, меньше ли дата, в поле «Дата» сегодняшней даты. Если это верно, то выделить красным строку.
Реализация.
В принципе примерное представление о том как делать есть. Но работа со строками не совсем ясна. Как лучше это организовать?
Помогите пожалуйста, разобраться в этом.
Заранее спасибо.

Автор: shovkoplyas 6.4.2006, 19:19
Цитата

В поле выполнено будет записываться или «да» или «нет»
Я думаю в даном случае лучше использовать флажок, чтобы исключить пустое значение. Например установить в данном столбце шрифт Marlett и использовать вместо "да" символ латинское "a".
Цитата

Если это верно, то выделить красным строку.
Это проще всего реализовать с помощью условного форматирования, не прибегая к написанию макроса.
Становимся на ячейку флажка
Меню-Формат-Условное форматирование
Выбираем Формула и пишем =C1<СЕГОДНЯ() 'под C1 подразумеваем ячейку даной строки с датой
Теперь нажимаете кнопку Формат и устанавливаем красный цвет шрифта или фона
и так для всех ячеек, если недостаточно подсвечивать ячейку флажка
Цитата

Если поле «Выполнено» написано «нет»
Это проверять нет необходимости, если строки с "да" при открытии файла удаляются.
Цитата

Если в нем уже написано «да», то строка таблицы должна вырезаться и вставляться в первую свободную строку в файл архив на соответствующий лист
Если книга "Архив" открыта то:
Код

Private Sub Workbook_Open()
Dim a
Windows("Книга1").Activate
Sheets("Лист1").Select 
For a = 1 To 100 'для 100 строк начиная с первой. Необходимо ввести количество строк или определить предварительно начало и конец
If Cells(a, 4) = "a" Then 'тоесть в столбце (C) установлен флажок
    Rows("" & CStr(a) & ":" & CStr(a) & "").Select
    Selection.Cut
    Windows("Архив").Activate
    Sheets("Лист1").Select
    Rows("1:1").Select
    Selection.Insert Shift:=xlDown
    Windows("Книга1").Activate
    Sheets("Лист1").Select
    Selection.Delete
End If
Next
End Sub


Примерно так. В чистовом виде можно зациклить для каждого листа и упростить код.

Автор: Staruha 6.4.2006, 19:25
Примерно так
For list=1 to 6
For rng=2 to 500
If Лист(x).cells(rng, 4)="да" Then

Автор: shovkoplyas 7.4.2006, 09:07
Что такое:
Цитата

Лист(x)

в этом примере.

Автор: Staruha 7.4.2006, 19:53
Извини описалась smile Вот код бежит по листам и строкам.
Код

Private Sub CommandButton1_Click()
For List = 1 To 3
For rng = 2 To 500
If Sheets("Лист" & List).Cells(rng, 4) = "да" Then
 MsgBox "jjj"
 End If
 Next
 Next
End Sub

Автор: Mrak 8.4.2006, 20:22
Надо попробовать, отпишусь о результатах. smile

Автор: Mrak 15.5.2006, 19:56
У меня был небольшой перерыв. Поэтому задачка замерла. Но теперь я к ней вернулся. 
shovkoplyas, код хороший почти во всем, кроме строчки 12. Rows(1:1).Select. При следующем открытии книги будет возникать ошибка, по причине того, что эта строчка уже заполнена. Что с этим делать?  

То есть единственное, чего я не понял - как определить последнюю непустую ячейку, запомнить ее строку, преобразовать ее в тип, пригодный для Rows(). 

Заранее спасибо за помощь и разъяснения. 

Автор: Artiom 16.5.2006, 09:39
Если у твоего файла регулярная структура (состоит только из таких строк) то можно использовать
Код

Dim rg As Range
Set rg = ActiveSheet.UsedRange
Dim max_row As Integer
max_row = rg.Rows.Count

max_row - номер последней используемой строки 

Автор: shovkoplyas 16.5.2006, 15:09
Загляни сам. Не хочу повторяться.

http://forum.sources.ru/index.php?showtopic=93671 

Автор: Mrak 19.5.2006, 14:02
Все спасибо! Задача решена smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)