Ігор Гончаренко написал: Вы вместо того, чтобы обьяснить суть задачи, обьясняете как Вы ее решали и
Разве не написал? Данные бывают такие:
Цитата
Александр написал:3 месяца YYYY г.?(ода)? 6 месяцев YYYY г.?(ода)? 9 месяцев YYYY г.?(ода)?
т.е. в данном случае это период бухгалтерской отчетности - 3, 6, 9 месяцев 2017, 2018, 2019 и т.д. годов - значение. дата может быть с окончание г., или полностью года, а может не быть ничего.
Нужно привести данные указанного формата в формат Q YYYY. Т.е. номер квартала и год. по сути мне нужно только заменить 9 месяцев на цифру 3. 6 месяцев на 2, 3 месяца на 1.
Я и написал, что добавил вот такой блок. Который проверяет по регулярке "\D*\d месяц\D*(\d{2,4})\D*" значение ячейки, и если значение ячейки удовлетворяет условиям - то он должен менять 9 на 3 6 на 2 и 3 на 1. Александр, после такого преобразования
Скрытый текст
Код
If re.Test(tempString) Then re.Pattern = "9"
If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1
re.Pattern = "6" If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1
re.Pattern = "3" If re.Test(tempString) Then tempString = re.Replace(tempString, "1")End If
функция уже передает переменную дальше. Преобразование к нужному формату проходит корректно - единственный затык - функция не отрабатывает замену 9 на 3, 6 на 2 и 3 на 1. подозреваю, что неверно написал регулярное выражение, но сколько не смотрел - не увидел ошибки.
Столкнулся с некоторой задачей, которую пока никак не могу решить - возможно Вам покажется проще: есть некоторая функция (код ниже), которая приводит разномастные значения дат, кварталов к единому виду - "Q YYYY". Т.е. если у меня прописано в ячейке 30.06.2017 - функция приводит это к значению 2 2017 - т.е. номер квартала и четырехзначный номер года. Аналогично с римским обозначением квартала и т.д. До сей поры это все у меня работало прекрасно, пока не столкнулся с необходимостью добавить в функцию новые типы данных, а именно 3 месяца YYYY г.?(ода)? 6 месяцев YYYY г.?(ода)? 9 месяцев YYYY г.?(ода)?
Соответственно в функцию я добавил блок
Код
'Проверка наличия периодов бух.отчетности
re.Pattern = "\D*\d месяц\D*(\d{2,4})\D*"
If re.Test(tempString) Then
re.Pattern = "9"
If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1
re.Pattern = "6"
If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1
re.Pattern = "3"
If re.Test(tempString) Then tempString = re.Replace(tempString, "1")
End If
Но функция все-равно не заменяет месяцы на квартал и на выходе я получаю для примера. 3 2017 6 2017 9 2017 Может кто-нибудь подскажет, что делаю не так?
Код
Option Explicit
Public Function RgxData(astring As Range) As String
Dim re As RegExp, d As Date, s$
Dim tempString
Set re = New RegExp
re.Pattern = "(-|\г.+|\(|\)| )"
re.Global = True
re.IgnoreCase = True
tempString = re.Replace(astring, "")
'Проверка наличия в строке даты
re.Pattern = "\D*(\d\d?)\.(\d\d?)\.(\d{2,4})\D*"
If re.Test(tempString) Then
RgxData = DatePart("q", DateValue(re.Replace(tempString, "$1.$2.$3"))) & DatePart("yyyy", DateValue(re.Replace(tempString, "$1.$2.$3")))
d = CDate(tempString) - 1
s = DatePart("q", d) & " " & DatePart("yyyy", d)
If s <> RgxData Then RgxData = s
Exit Function
End If
'Проверка наличия периодов бух.отчетности
re.Pattern = "\D*\d месяц\D*(\d{2,4})\D*"
If re.Test(tempString) Then
re.Pattern = "9"
If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1
re.Pattern = "6"
If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1
re.Pattern = "3"
If re.Test(tempString) Then tempString = re.Replace(tempString, "1")
End If
'Проверка наличия в строке квартала написаного римской цифрой, буквами латиницы "I" и "V"
re.Pattern = "\D*(i{1,3}(?!i)v?(?!v))\D*(кв)?\D+(\d{2,4})\D*"
If re.Test(tempString) Then
re.Pattern = "iv"
If re.Test(tempString) Then tempString = re.Replace(tempString, "4"): GoTo 1
re.Pattern = "iii"
If re.Test(tempString) Then tempString = re.Replace(tempString, "3"): GoTo 1
re.Pattern = "ii"
If re.Test(tempString) Then tempString = re.Replace(tempString, "2"): GoTo 1
re.Pattern = "i"
If re.Test(tempString) Then tempString = re.Replace(tempString, "1")
End If
1:
'Проверка наличия в строке квартала написаного арабской цифрой
re.Pattern = "\D*(\d)\D*(кв)?\D+(\d{2,4})\D*"
If re.Test(tempString) Then
RgxData = re.Replace(tempString, "$1 $3")
Exit Function
End If
'Проверка наличия в строке квартала написаного арабской цифрой
re.Pattern = "\D*(\d{4})\D*"
If re.Test(tempString) Then
RgxData = re.Replace(tempString, "$1")
Exit Function
End If
RgxData = "Период не определен!"
End Function
Андрей, спасибо. Идея решить проблему регулярками (правда в веб) меня посетила, только вариантов адресов очень много. Не получится все запихнуть. на Вашем примере из 5 адресов макрос только один разобрал. Примеры адресов ниже.
Цитата
tolstak написал: нормировать через запрос к гугл-картам.
Спасибо, tolstak. Идея супер. Если б сработало - было б мне счастье. Да вот беда - из 5 тестовых адресов гугл нашел только 2. 2, 3 и 5 адрес он не ищет ни через парсер, ни через собственно сайт maps.google Хотя яндекс карты такие адреса находят. А такую
187026 Ленинградская область, Тосненский район, город Никольское Отрадненское шоссе дом 3
Хочу спросить у Вас подсказки. Вопрос старый, как мир. Есть набор почтовых адресов. Не типизированный - клиенты при регистрации бьют как хотят. Сейчас регистрационную форму будем переделывать. Но есть необходимость поработать с уже существующим массивом данных - больше 30 тыс адресов.
Знаю, что абсолютно точного метода автоматического разбора адресов не существует, но возможно Вы сможете подсказать инструмент, который сможет сделать этом с максимальной точностью. Возможно у кого-то есть уже макрос, либо платная какая-то утилита.
Буду благодарен за наводку - гугл результатов не дал толковых.
Есть у меня табличка, в ней небольшой код, который подставляет в соседнюю ячейку некоторое значение при изменении значения в столбце С диапазона (собственно код известный, много где в Интернете есть). Все хорошо и работает, но дело в том, что параллельно у меня есть макрос, который после заполнения пользователем таблицы отправляет копию файла на сетевой диск, а сам файл пользователя очищает от данных. Никак не могу сообразить, как переделать приведенный ниже код, чтобы значение в соседнюю ячейку проставлялось только если в ячейку что-то записали. А в случае, если ячейку очистили - он не отрабатывал.
Пробовал по поиску найти, но видно не так ищу.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Target
x = cell.Row - 1
If Not Intersect(cell, Range("C2:C50")) Is Nothing Then
With cell.Offset(0, -1)
.Value = "Значение"
.EntireColumn.AutoFit
End With
End If
x = x + 1
Next cell
End Sub
Спасибо. Вариант классный. В принципе именно то что нужно. Правда почему-то на таблицах свыше 10 тысяч строк начинает ощутимо подвисать и представление отрабатывает секунд за 15.
Да, Спасибо Юрий. Да, это подойдет. особенно если немного допилить - назначить на кнопку заполнение диапазона нужными критериями - и тогда получится то что нужно. надеюсь не будет так подтормаживать, как представления.
Добрый вечер, уважаемые форумчане. Вновь хочу спросить у Вас совета.
Итак, у меня в работе присутствует множество таблиц с большим количеством столбцов. Из этих таблиц часто приходится делать выборки, фильтруя определенные столбцы по нужным значениям. Но вот незадача - то забудешь выставить условие на один из столбцов, то выставишь не так - и выборка получается кривая - хорошо, если замечу вовремя. Да и в целом это отнимает время. Когда операция повторяется регулярно, по несколько раз в день - это конечно выливается в определенную потерю времени. И вот меня мучает вопрос - есть ли возможность назначить на определенную кнопку заранее заданный набор фильтров, чтобы таблица фильтровалась сразу по нескольким столбцам по одному клику. Пробовал искать на форуме что-то подобное, но не нашел (может быть неправильно искал?).
Приложил небольшой пример, чтобы объяснить наглядно. В данном примере мне необходимо: 1. Столбец G отфильтровать, исключив ячейки Банк 2. Столбец H отфильтровать, исключив пустые ячейки 3. Столбец К отфильтровать, оставив только пустые ячейки. Вот если набор подобных условий можно сохранить и назначить на кнопку - было бы просто идеально. Подозреваю, что без макроса тут не обойтись, но с ними у меня сложно(
Подскажите, что делаю не так. Лист events, столбец E содержит даты. В календаре хочу эти даты подсвечивать. Создаю правило условного форматирования для формулы
Код
=НЕ(ЕОШИБКА(ПОИСКПОЗ(B5;Events!$E$2:$E$249;0)))
Но он срабатывает, если распространяется только на конкретную ячейку. Если растягивать сразу на весь календарь - подсветка где-то промахивается, где-то просто не срабатывает.
Добрый день, форумчане. Хочу спросить Вашего мудрого совета.
Добавил в файл (в файле 1 лист) небольшой макрос, который при сохранении копии файла очищает содержимое диапазона D2:F90
Код
Sub saveas()
ActiveWorkbook.SaveCopyAs "C:\\" & Range("O1") & ".xls"
Dim cell As Range
For Each cell In Range("D2:F90")
cell.ClearContents
Next
Range("O1").ClearContents
End Sub
Но вот незадача, делает он это долго - задержка при очистке составляет - секунд 10-15, что при массовости операции даст большие потери по времени. Подскажите, есть ли способ ускорить процесс? Может добавить условие, чтобы он очищал только непустые ячейки, а не проходил по всем? Если да, то как? Может еще способ есть?
Добрый день, форумчане! Вновь требуется Ваш мудрый совет. Что-то сегодня голова не работает совсем. В ячейке есть функция
Код
=СУММЕСЛИМН(D3:D48;A3:A48;"Доп";C3:C48;1200)
Подскажите, как мне сюда добавить операцию сравнения? Мне нужно, чтобы он суммировал значения столбца D, если значение в столбце С меньше 1200. Сейчас он суммирует, если значение равно 1200.
Или допустим, чтобы он суммировал, если значение в столбце С больше 1200, но меньше 1300
В данном случае изменения - это изменения. Т.е. если в указанном диапазоне поменялось любое из значений ячеек.
Цитата
Попробуйте UDF, которая возвращает состояние книги: книга сохранена = ИСТИНА, несохранена = ЛОЖЬ.
Не получается. Видно делаю не так. значение в ячейку всегда приходит ЛОЖЬ/
Да и потом я не нашел способа настроить заливку диапазона в зависимости от сторонней ячейки. Обычно условное форматирование распространяется на ячейки, значения которых анализируются.
Да тут пример не нужен. Применительно к любой таблице нужно, чтобы диапазон ячеек A1:L75 окрашивался пусть в красный цвет. Если файл сохранен - зеленый, или вообще без заливки.
Добрый день, уважаемые форумчане! Возникла такая потребность - визуализировать то, что в файл вносились изменения и они не сохранены. Например какая-нибудь ячейка меняет цвет, или значение.
Если оставить первый множитель - он дает 0, хотя должен давать 1 Если оставить первое и второе дает #Н/Д Если первое и третье дает #ЗНАЧ
Совсем я что-то сегодня запутался - на пустом месте.
Если попробовать просчитать искомые значения функцией счётесли -работает, аналогичные функции в других книгах работают, а здесь ну на пустом месте затык
На выходе дает #ЗНАЧ. Вот и не пойму - вроде на соседнем листе аналогичная формула отрабатывает, а здесь нет. Но там она ссылается на статичное значение, а здесь на формулу.
Хм, пытался сварганить пример - в примере получилось, а в боевом файле не получается. Значит ошибка в формуле. Боевой к сожалению вывесить не могу - коммерческая информация. Пока будем думать самостоятельно.
Добрый день, гуру. Подскажите маленький вопрос - застопорился на нем. Как задать условием существования функции значение другой функции? Я пишу функцию СУММПРОИЗВ, в которой три условия из которых 2 - это значения которые должны принимать другие функции. Но он почему-то в указанном диапазоне не ищет значения. Даже ручным поиском он не ищет требуемые значения.
Не, как-то не пошло у меня - не хочет забирать он. Нули пишет, вместо забираемых значений.
Пошел с другого края - сделал шаблонную таблицу, в которую буду выгружать данные, а там с помощью выборочного суммирования настроил на проверку значений, имеющих нужный код в соседнем столбце. Громоздко, в лоб, но работает. Пока так. А над скриптом подумаю еще.
Т.е. в результате на выходе макрос должен дать табличку 14х3, где 14 - 13 проверяемых показателей+шапка таблицы, а 3 - число проверяемых отчетных периодов.
В идеале вся таблица должна быть заполнена нулями - это будет обозначать, что отчетность составлена корректно.
Давно не обращался я с Вам за советом. Вот вновь мне поставлена задача, требующая глубокого знания Excel. Я буду очень благодарен, если Вы поможете мне решить эту задачу, самостоятельно я ее не осилю.
Существует некая система, содержащая финансовые данные. В этой системе есть кнопка, которая выкидывает эти данные в таблицу excel (во вложении пример - обратите внимание - 2 листа).
Мне нужно сделать макрос, который при запуске будет проводить первичную проверку отчетности на сходимость (набор определенных строк в сумме должен совпадать с другой определенной строкой). Определять, какие строки нужно складывать макрос должен по соседнему столбцу "Код стр."
Подробные формулы (значения кодов строк которые надо складывать и вычитать) для проверки я могу предоставить, если задача будет иметь решение.
Особый момент заключается в том, что макрос должен быть доступен не в конкретном файле а по умолчанию в Excel. Т.к. файл всегда создается системой заново перед выгрузкой в него информации.
Резюмируя алгоритм должен быть таким: 1. Нажимаем на кнопку - открывается таблица. 2. Запускаем макрос, в рандомном месте на листе выводятся результаты нескольких вычислений по обоим листам.
Примечания: - Формат файла именно такой, код строк и остальные данные выводятся именно в таком формате. Поэтому инфа на листе как данность - менять формат и положение нельзя, т.к. тогда смысл пропадет.
- Порядок строк не всегда именно такой - могут присутствовать промежуточные, поэтому надо ориентироваться именно на код строки.
Подскажите, Гуру, есть ли возможность решить задачу в этом ключе?
Ситуация такая - долго консолидирвал в базу множество листов с самыми различными данными, на каждом листе уже сейчас до 20 тыс строк. На каждом листе - 2-3 столбца - функции и сложные по множеству условий. Т.е. представьте - 1 лист уже содержит 60 тыс функций завязанных на 3-4 массива. А их сейчас 10 листов, т.е. около 600 тыс ячеек перевязанных друг с другом не по одному разу. А помимо этого еще есть несколько макросов.
Поставленной задачи я добился - в базе автоматизировано множество процессов, что резко повысило администрирование и контроль процессов.
Но вот беда - тормозит. Любое изменение данных в таблицах влечет подвисание на пару минут. Что мешает.
Хочу спросить Вас, господа - возможно ли сделать макрос, который отключает выполнение функций в определенном диапазоне?
Скажем - есть на листе ряд галочек (чек-боксов) с названием диапазонов. Отжал галку - ёксель забыл про определенный диаазон с функциям. Нажал галочку - вновь проводится рассчет по диапазону.
Может кто-то сталкивался с подобной проблемой.
PS: Да простят меня модераторы и форумчане - без примера. затенять закрытые данные - с ума сойдешь в таком файле. А создавать пример - тоже не отобразишь всего, что есть.
Буду рад любым предложениям - если что, я уже сам подгоню под свои условия подсказанную идею, или макрос. Знаю, наверняка сейчас многие кинутся говорить, что такие объемы это надо минимум в аccess, а еще лучше на oracle или что там есть. Выбор обусловлен технологическими особенностями, да и не умею я особо с access.