заполнение таблицы Еxcel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
LuNa
Сообщения: 5
Зарегистрирован: 06 май 2014, 21:42
Откуда: Москва
Контактная информация:

Доброго всем вечера!
может быть оперативно поможет кто :confused: :rolleyes:
Есть таблица в файле: БЗП(1).xlsx
Вот интересно, он у меня прикрепился :confused: Не пойму как это правильно сделать? Когда загружаю файл, стоит значек некорректного файла

Хотелось бы, чтобы получилось два разных макроса:
1 если в строке в столбце 2 пусто, а в 7 нет, то в пустые ячейки внести данные из верхней строки, кроме столбцов 6,7 и 8 (там свои данные), в прикрепленном файле выделено желтой заливкой, то, что должно быть заполнено
2. если в столбце 2 дата меньше, чем текущая, то вся строка с этого листа перемещается на другой лист, например, Удаленные. (то, что должно в примере переместиться выделено зеленой заливкой)
Буду признательна за любую помощь :rolleyes:
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

стоит значек некорректного файла
на данном форуме нельзя прикрепить файл *.xlsx , но можно *.zip
смотрите правила.
LuNa
Сообщения: 5
Зарегистрирован: 06 май 2014, 21:42
Откуда: Москва
Контактная информация:

Предыдущую задачу решила с горем пополам ))), теперь новая ) Тоже вроде бы получилась, но я чайник, поэтому и решение корявое, да еще не корректное. Может подскажет кто где ошибка и "причешет" мой макрос )))
В общем, задача такая - на Листе "Защищенные проекты" есть таблица с данными начиная с 4 строки, столбцов 17, количество строк меняется.
Необходимо проверить все на наличие условий, если в столбце 3 дата меньше текущей (в ячейке Cells(1, 11))или в столбце 11 значение равно "отказались" или "реализован", то такая строка "переносится" полностью на Лист "Архив" в первую пустую строку (проверка заполненности тоже по столбцу 11), в 18 столбце которой вставляется текущая дата переноса информации ( в этом макросе не реализовано).
Цикл проверки останавливается когда на Листе "Защищенные проекты" в столбце11 пусто.

Sub ПереносСтрок()

' переносим строки на лист Архив, если срок защиты истек или статус "Реализован" или "Отказались"

' создаем формулу для удаления строки по условию

Sheets("Защищённые проекты").Cells(4, 18).Select
ActiveCell.FormulaR1C1 = "=IF(OR(RC[-3]=Спр.!R3C12,RC[-3]=Спр.!R4C12),1,"""")"
ActiveCell.Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:A500")


IMAX = Cells(Rows.Count, 11).End(xlUp).Row
JMAX = Cells(4, Columns.Count).End(xlToLeft).Column

' выполнялся цикл, если в 18 столбце не пусто, то данные переносим на лист "Архив"

k = Sheets("Архив").Cells(Rows.Count, 11).End(xlUp).Row
For i = 2 To IMAX
If Cells(i, 3) < Cells(1, 11) Or Cells(i, 18) = "1" Then
Sheets("Архив").Cells(k + 1, 1) = Cells(i, 1)
Sheets("Архив").Cells(k + 1, 2) = Cells(i, 2)
Sheets("Архив").Cells(k + 1, 3) = Cells(i, 3)
Sheets("Архив").Cells(k + 1, 4) = Cells(i, 4)
Sheets("Архив").Cells(k + 1, 5) = Cells(i, 5)
Sheets("Архив").Cells(k + 1, 6) = Cells(i, 6)
Sheets("Архив").Cells(k + 1, 7) = Cells(i, 7)
Sheets("Архив").Cells(k + 1, 8) = Cells(i, 8)
Sheets("Архив").Cells(k + 1, 9) = Cells(i, 9)
Sheets("Архив").Cells(k + 1, 10) = Cells(i, 10)
Sheets("Архив").Cells(k + 1, 11) = Cells(i, 11)
Sheets("Архив").Cells(k + 1, 12) = Cells(i, 12)
Sheets("Архив").Cells(k + 1, 13) = Cells(i, 13)
Sheets("Архив").Cells(k + 1, 14) = Cells(i, 14)
Sheets("Архив").Cells(k + 1, 15) = Cells(i, 15)
Sheets("Архив").Cells(k + 1, 16) = Cells(i, 16)
Sheets("Архив").Cells(k + 1, 17) = Cells(i, 17)
Cells(i, 3).EntireRow.Delete
k = k + 1
End If
Next

End Sub

не корректность в том, что не все строки переносит, а только половину, из 10 только первых 5, из 4 первые 2, из 2 только одну(
Мир же не без добрых людей)))
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Попробую разобрать :)
1) Обязательно используйте Option Explicit и обьявляйте переменные
Dim IMAX As Long, JMAX As Long, k As Long, i As Long
2) Вы вводите дополнительный столбец с условием формулой. Я бы не использовал формулы - их сложнее отладить. Или как вариант использовал только формулы.
3) Представленная формула не имеет к заданию отношения. И вдобавок ссылается на неизвестный лист :)
4) Не используйте в макросах Select, например:

Код: Выделить всё

' создаем формулу для удаления строки по условию
 IMAX = Sheets("Защищенные проекты").Cells(Rows.Count, 11).End(xlUp).Row
 
 Sheets("Защищенные проекты").Cells(4, 18).FormulaR1C1 = "=IF(OR(RC[-3]=Спр.!R3C12,RC[-3]=Спр.!R4C12),1,"""")"
 Sheets("Защищенные проекты").Cells(4, 18).AutoFill Destination:=Sheets("Защищенные проекты").Range(Cells(4, 18), Cells(IMAX, 18))

 JMAX = Cells(4, Columns.Count).End(xlToLeft).Column ' не нужная в данном макросе переменная
5) В цикле идёт удаление строк. Строка удаляется - последующие строки спускаются на 1 вниз - необработанная строка замещает обработанную - цикл идёт дальше уже не глядя на строку заменившую обработанную. Выход - идите циклом от конца в начало.
6) ну и копировать надо не по ячейке а диапазоном (или строкой полностью)

Код: Выделить всё

k = Sheets("Архив").Cells(Rows.Count, 11).End(xlUp).Row + 1
 With Sheets("Защищенные проекты")
 For i = IMAX To 4 Step -1
    'If .Cells(i, 3) < .Cells(1, 11) Or .Cells(i, 18) = "1" Then
       Sheets("Архив").Range(Sheets("Архив").Cells(k, 1), Sheets("Архив").Cells(k, 17)) = .Range(.Cells(i, 1), .Cells(i, 17)).Value
       .Rows(i).Delete
       k = k + 1
    'End If
 Next
 End With
LuNa
Сообщения: 5
Зарегистрирован: 06 май 2014, 21:42
Откуда: Москва
Контактная информация:

БОЛЬШОЕ СПАСИБО!!! Выручили!!! Чувствую себя собака: все понимаю, а сказать не могу, вот и понимаю, а языка, кодов не знаю ((( Скачала книгу VBA для чайников, изучаю.
Если интересно, то мой макрос работает вот в таком виде:

Sub ПереносСтрок()

' переносим строки на лист Архив, если срок защиты истек или статус "Реализован" или "Отказались"
' создаем формулу для удаления строки по условию со ссылкой на др. лист :)
Dim IMAX As Long
Dim k As Long
Dim i As Long
Sheets("Защищённые проекты").Cells(4, 25).Select
ActiveCell.FormulaR1C1 = "=IF(OR(RC[-10]=Спр.!R3C12,RC[-10]=Спр.!R4C12),1,"""")"
ActiveCell.Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:A500")
IMAX = Cells(Rows.Count, 11).End(xlUp).Row
k = Sheets("Архив").Cells(Rows.Count, 11).End(xlUp).Row + 1
For i = IMAX To 4 Step -1
If Cells(i, 3) < Cells(1, 11) Or Cells(i, 25) = "1" Then
Sheets("Архив").Range(Sheets("Архив").Cells(k, 1), Sheets("Архив").Cells(k, 17)) = Range(Cells(i, 1), Cells(i, 17)).Value
Rows(i).Delete
k = k + 1
End If
Next

End Sub

Какой он стал красивенький )))
Еще раз, спасибо, доброму человеку!!!
Ответить