Здравствуйте, уважаемые форумчане.
Не прошло и полгода, и я опять прошу Вашей помощи.
Отписываюсь в этой теме, т.к. сложности плавно вытекли из неё, суть вопроса осталась та же, так как предложенное AlexM решение проблемы теперь не помогает. Проблема была такая:
«Есть файл (во вложении), в котором существует огромный список адресов (каждая строка это отдельный адрес с кучей нужной информации по нему).
Каждая строка (т.е. каждый адрес) имеет 2 состояния (столбец «H») «Закрыт» и «В работе».
Задача у меня такая: скопировать на другой лист, который «ОТК», все строки, имеющие статус «В работе».»
Теперь же появилось третье состояние этого столбца (в примере P) — «На выплату» (дополнительно меня нагрузили теперь бухгалтерскими вопросами) и данная формула не помогает:
Код
=ИНДЕКС(Адреса!$A$1:$A$175;НАИМЕНЬШИЙ(ЕСЛИ(Адреса!$H$5:$H$175<>"Закрыт";СТРОКА($A$5:$A$175));СТРОКА(A1)))
, т.к. в листе ОТК теперь выводятся и объекты в работе и на выплату.
Попытка заменить «<> «Закрыт» на «= «В работе» приводит у тому, что пустые клетки выдают ошибку «!#ЧИСЛО».
Собственно 1 вопрос в том, как грамотно поменять формулу, чтобы сохранить функционал.
Есть 2 вопрос, уже бухгалтерский: в том же примере есть окно «Бухгалтерия», в котором я пытался автоматизировать подсчет зарплаты. Т.е. мне надо, чтобы все объекты со статусом «На выплату» автоматически забивались в ведомость, соответственно если одна фамилия встречается более 1 раза, зарплата суммировалась.
Буду благодарен, если кто поможет решить задачу или подскажет, как её победить.
Заранее спасибо.
Миха73 Пользователь Сообщений: 6 |
Доброе время суток, уважаемые форумчане! Столкнулся с проблемой, которая, откровенно говоря, привела меня в некий ступор. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Чем автофильтр не устраивает? Я сам — дурнее всякого примера! … |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Если сломан автофильтр… |
Миха73 Пользователь Сообщений: 6 |
огромное спасибо! |
а нельзя сделать, чтобы при заполнении Листа3 данные добавлялись, а не заполнялись по новой? |
|
Миха73 Пользователь Сообщений: 6 |
а нельзя сделать, чтобы при заполнении Листа3 данные добавлялись, а не заполнялись по новой? |
Hugo Пользователь Сообщений: 23249 |
Как такой вариант — ставите вызов кода Юрия на событие активации листа (отключив обновление экрана на время работы). If .Cells(i, 3) Like «######» Then |
Миха73 Пользователь Сообщений: 6 |
попробую с этим разобраться |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
{quote}{login=}{date=11.11.2011 10:38}{thema=}{post}а нельзя сделать, чтобы при заполнении Листа3 данные добавлялись, а не заполнялись по новой?{/post}{/quote}А смысл? Результат будет тот же самый. Берите что дают, а то скачаю обратно. |
Миха73 Пользователь Сообщений: 6 |
Смысл есть, при изменении уже скопированных строк на Листе3 и последующем выполнении макроса измененные данные, на Листе3, будут переписаны и нужно будет либо по новой вносить изменения или дублировать полученные данные на другом листе. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Изменяют строки обычно в исходных данных, а по ним уже строится отчёт. Если Вы планируете изменять сам отчёт — делайте это на копии листа 3. |
Миха73 Пользователь Сообщений: 6 |
да, обычно так и происходит, в смысле изменение данных в исходном документе, работать с копией полученного отчета, не проблема, вот только при создании нового отчета нужно будет учитывать, ранее полученный отчет… |
Просматривая ответ на интересующий меня вопрос, нашел данную тему. Очень помогла. Скажите, а как можно было бы ограничить число копируемых ячеек в строке, например если исходная таблица имеет 10 ячеек в строке, а на том листе, куда переноситься (лист2 например) необходимы только 4 первых ячейки в строке (4 столбца)? |
|
Hugo Пользователь Сообщений: 23249 |
Range(Cells(i, 1), Cells(i, 4)).Copy |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Если правильно понял вопрос: |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#16 21.08.2012 16:02:45 {quote}{login=}{date=21.08.2012 03:52}{thema=}{post}Просматривая ответ на интересующий меня вопрос{/post}{/quote}Просматривая Ваш вопрос, обнаружил, что Вы не подписываетесь. Анонимно легче? Наоборот: многие их тут не любят |
Копирование строк по условию |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Всем добра.
Задача:
В некую таблицу скопировать все значения из столбца другой таблицы где значение справа равно некоторому.
Мысли:
Когда у меня первый раз спросили про такое, я ответил- фигушки, без макроса никак, по крайней мере для неопределенного количества найденных строк.
Спустя время мне задали этот вопрос повторно и тут меня осенило — это не невозможно.
Итак в чем заключается мысль?, а мысль в доп столбце, в котором хранится номер позиции вхождения в некотором диапазоне, где начало диапазона определяется предыдущим.
на деле это выглядит так:
Искать будем значение из ячейки $B$5 (в этой ячейке динамический выпадающий список) в другом листе:
=ПОИСКПОЗ($B$5;ЛИСТ2!B:B;0)
ПоискПоз — ищет вхождения в диапазоне
Результат формулы = 8, т.е. восьмая строчка
Проверяем, и вправду так.
Последующие ячейки при расчете будут учитывать предыдущую:
=ПОИСКПОЗ($B$5;ДВССЫЛ(«Карт.сч.!R»&$C16+1&»C2:R[1000]C2»;ЛОЖЬ);0)+C16)
Во втором аргументе формулы ПоискПоз ( ДВССЫЛ(«Карт.сч.!R»&$C16+1&»C2:R[1000]C2»;ЛОЖЬ); ) формируется диапазон $B$0+предыдущее положение+1 т.е. R9C2:R1000C2
Т.о. мы исключаем уже найденную строку из массива для поиска.
В итоге вот такой формулой
ДВССЫЛ(«Карт.сч.!R»&C16&»C5»;ЛОЖЬ)
Мы получаем значение из пятой колонки строки номер 8, и так далее.
Это можно записать в одну ячейку, но в моем случае получается очень громоздкая конструкция:
=ЕСЛИОШИБКА(ЕСЛИ(ЕПУСТО(ДВССЫЛ(«Карт.сч.!R»&ЕСЛИОШИБКА(ПОИСКПОЗ(ДВССЫЛ(«$B»&СТРОКА()-B17-10;ИСТИНА);ДВССЫЛ(«Карт.сч.!R»&$C16+1&»C2:R[1000]C2″;ЛОЖЬ);0)+C16;»-«)&»C5″;ЛОЖЬ));»АВАНС «;»»)&ТЕКСТ(ДВССЫЛ(«Карт.сч.!R»&ЕСЛИОШИБКА(ПОИСКПОЗ(ДВССЫЛ(«$B»&СТРОКА()-B17-10;ИСТИНА);ДВССЫЛ(«Карт.сч.!R»&$C16+1&»C2:R[1000]C2″;ЛОЖЬ);0)+C16;»-«)&»C3″;ЛОЖЬ);»дд.ММ.гггг»);»»)
Для двойных/тройных условий в поиске предлагаю использовать доп колонку, в таблице поиска, с конкатенацией колонок.
Копирование строк по условию из существующего набора данных в отдельную таблицу с помощью кода VBA Excel. Определение числа строк в исходной таблице.
Условие задачи
Есть исходная таблица (набор данных) со списком файлов, расположенных в двух папках. Необходимо строки таблицы, содержащие слово «Изображения», скопировать в новую таблицу, расположенную ниже исходного набора данных, через одну пустую строку. В результате должно получиться, как на изображении ниже:
Решение задачи
Код VBA Excel для копирования строк исходного набора данных по условию в отдельную таблицу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub KopirovaniyeStrok() Dim s As String, n As Long, m As Long, i As Long ‘Задаем условие поиска s = «Изображения» ‘Определяем номер последней строки исходной таблицы n = Range(«A2»).CurrentRegion.Rows.Count ‘Задаем номер первой строки новой таблицы m = n + 2 For i = 2 To n ‘Проверяем условие If Cells(i, 1) = s Then ‘Копируем строку, удовлетворяющую условию, в новую таблицу Cells(i, 1).Resize(1, 3).Copy Cells(m, 1) m = m + 1 End If Next End Sub |
При желании, можно добавить в эту процедуру еще одну переменную и автоматическое определение количества столбцов:
Dim c As Long c = Range(«A2»).CurrentRegion.Columns.Count |
Тогда выражение копирования примет следующий вид:
Cells(i, 1).Resize(1, c).Copy Cells(m, 1) |