Страницы: 1
RSS
Макрос: несколько условий, вставка в другой лист, исключая пустые ячейки
 
Добрый день!

В теме макросов я новичок, пытаюсь во всем разобраться сама, но что-то пошло не так..Вторые сутки не могу сообразить, как написать его кратко, понятно и, что самое главное, чтоб работал.

У меня есть Расходы и Доходы, у каждой статьи расходов и доходов прописана определенная дата.
Мне необходимо, чтобы расходы и доходы, которые попадают в определенный диапазон дат, попадали в другой лист, где указаны планируемые движения ДС.
Причем итоговый список должен быть без пустых строк.

Файл пример во вложении.

Если идти прям по файлу, то алгоритм получается следующий:
1. Лист "Доходы" Если дата в ячейках диапазона С3:С9, попадает в диапазон ячеек А2 и А14 листа "Общий", то необходимо с листа "Доходы" скопировать идущие слева от даты ячейки (например, А3:В3) и вставить на лист "Общий" в ячейки B5:С5 соответственно, если данные ячейки пустые
2. Если условие по датам выполняется, но ячейки B5:С5 на листе "общий" уже заняты, то вставить ниже, например B6:C6.
3.та же самая процедура с листом "Расходы", только необходимо вставлять на лист "Общий" начиная с ячеек D6:Е6 и в обратном порядке, то есть сначала сумма, затем наименование клиента.
 
Цитата
пытаюсь во всем разобраться сама, но что-то пошло не так
В примере нет никаких макросов. Где ваши попытки?
На листе Общий приведите пример как должен выглядеть результат для дат в А2 и в А14.
 
Макросом долго и муторно. Вот вариант получения нужной таблицы на PQ.

UPD. В моём варианте есть существенный косяк, если в один день есть записи и в Расходах и в Доходах, причём в одной из таблиц в этот день несколько записей, то они дублируются((
Изменено: Wiss - 14.11.2019 16:39:16
Я не волшебник, я только учусь.
 
Добавила свой макрос.
Даты в ячейках А2 и А14 на листе "Общий" - это единственная область, которую пользователь сможет менять руками. От этих ячеек на листе "Общий" зависит практически все.
 
Вот первые попытки реализовать подобный макрос (в файле). Здесь все абсолютно на примитивном уровне и с прописанными адресами для каждой вставки, то есть не учитывается, что идущие выше ячейки пустые
 
Добрый день!

Нарисовал макрос для Вашей задачи.
1. Для ввода используются именованные диапазоны. Ели захотите задавать исходные диапазоны иначе меняйте строчки
Set rngX = Range("Доходы"), Set rngY = Range("Расходы") остальной код всё будет работать.
2. Не совсем понятно куда и как выводить результат, так что сделал вывод просто на "Лист1".
3. Результат не отсортирован по дате. Хорошо бы его отсортировать в массиве ещё до выгрузки на лист. Это задача типовая, но слегка муторная, так что я отсортировал результирующий диапазон.
Я не волшебник, я только учусь.
 
Для вашего примера из сообщения #5
Макрос запускать при активном листе Проба
Код
Sub Perenos()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
   'ищем на листе Пробв последнюю заполненную ячейку в столбце А
   'и прибавляем +3 , это будет 4-ая строка, куда будем переносить данные
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 3
  With Worksheets("Данные")   'там где есть точка перед функцией - это к листу Данные
    iLR = .Cells(.Rows.Count, 1).End(xlUp).Row  'последняя ячейка в столбце А на листе Данные
    For i = 6 To iLR   'цикл по строкам ваших данных на листе Данные
      If .Cells(i, 3) > Cells(1, 1) Then  'если содержимое столбца С > содержимого ячейки А1
        .Range("A" & i & ":B" & i).Copy Cells(iLastRow, 2)  'копируем ячейки от Аi до Сi и вставляем на лист Проба
        iLastRow = Cells(Rows.Count, 2).End(xlUp).Row + 1  'свободная ячейка в столбце В листа Проба
      End If
    Next
  End With
End Sub
Изменено: Kuzmich - 21.11.2019 08:08:38 (добавил по просьбе ТС комментарии к коду)
 
Wiss, Kuzmich, спасибо большое!
Макрос написала. Пытаюсь преобразить его по вашим примерам
 
EAV,
Цитата
Макрос написала
Поделитесь с форумом
 
Прописала для каждой строки, выглядит очень массивно и заняло время, но работает. Как преобразовать пока не дошло...
Код
Sub Добавление_расходы1()
Application.ScreenUpdating = False
If Sheets("Расходы").[c17].Value >= Sheets("Общий").[B2].Value And Sheets("Расходы").[c17].Value <= Sheets("Общий").[B32].Value = True Then
Worksheets("Расходы").[A17:B17].Copy
n = Sheets("Общий").[e1].End(xlDown).Row
Sheets("Общий").Cells(n + 1, 5).PasteSpecial Paste:=xlPasteValues
End If
 
EAV,
Цитата
Прописала для каждой строки
А мой макрос не подошел?
 
Kuzmich, макрос выдавал ошибку. В теме переменных - вообще не понимаю. Поэтому взяла то, что было понятно
 
Цитата
макрос выдавал ошибку.
В примере из сообщения #5?
Макрос в стандартный модуль, запускать при активном листе Проба
 
Kuzmich, извиняюсь. Сейчас вновь попробовала - все работает!
На уровне догадок понимаю, что вы прописали, но если не сложно, вы могли бы прокомментировать строки с 5 по 11?
Сейчас пишу подобный макрос, данные на 330 строк, прописывать для каждой строки, как я сделала ранее, не вариант, конечно. Хочу попробовать написать по вашему примеру.
 
EAV,
Добавил комментарии в сообщение выше. Вам для вашей задачи видимо нужно
будет сделать два цикла: по листу доходов и расходов.
Попробуйте пройти по коду в пошаговом режиме (по F8) и посмотреть, как будут
меняться переменные. Удачи вам!
 
Kuzmich, Огромное спасибо вам за пояснения!!!
Только что переделала немного под свои новые данные макрос, и все работает!

Sub Perenos()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
   iLastRow = Sheets("Фильтр").Cells(Rows.Count, 1).End(xlUp).Row + 1
 With Worksheets("Исходник")
   iLR = .Cells(.Rows.Count, 1).End(xlUp).Row
   For i = 2 To iLR
     If .Cells(i, 9) >= Cells(1, 2) And .Cells(i, 11) >= Cells(1, 4) Then
       .Range("H" & i).Copy Cells(iLastRow, 1)
       iLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
     End If
   Next
 End With
End Sub
Страницы: 1
Наверх