Правила работы в Excel1
Главное правило по прошествии лет:
Не объединяй ячейки, если от этого не зависит спасение мира
Возможно, уважаемые пользователи поделятся результатами своих наблюдений)
Главное правило по прошествии лет:
Не объединяй ячейки, если от этого не зависит спасение мира
Возможно, уважаемые пользователи поделятся результатами своих наблюдений)
Я решил с двух ног ворваться в тему макросов.
Кто-то про них слышал, кто-то даже видел, отдельные сверхразумы их даже использовали. Сегодня будет ознакомительный пост: что это вообще такое и как с этим начать работать. Обратите внимание – этот пост тех, кто не знает, что такое макросы и никогда с ними не работал
Первым делом нужно включить вкладку «Разработчик». По умолчанию в Excel ее спрятали, чтобы не взорвать мозг юзерам. Идем в Параметры -> Настройка ленты -> Основные вкладки -> Разработчик (поставить галочку).
Теперь идем в эту вкладку, нажимаем «Записать макрос» выбираем имя жмакаем «ок». Все, теперь любые действия в Excel надежным образом записываются.
Давайте теперь что-то сделаем. На пример поменяем заливку ячейки А1, в ячейку A2 напишем значение «Мама, я программист», а в ячейке А3 пропишем формулу текущей даты «=Сегодня()»
Останавливаем запись макроса. Нажимаем иконку «Макросы», выбираем наш макрос как мы его обозвали, нажимаем кнопку «изменить».
Появляется окно Microsoft Visual Basic for Applications. Кстати оно также вызывается комбинацией клавиш (Alt + F11) У меня почему-то вызывается только левым Altом, а правым нет, видимо намекая на то что для написания макросов лучше иметь 2 руки (хотя я и одной нажать могу). Появился редактор языка VBA – это язык, который написан специально под офис чтобы на нем писать макросы. В основном окне видим саму эту запись, которую автоматически сделал Excel.
Sub Макрос2()
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("A2").Select
ActiveCell.FormulaR1C1 = "Мама, я программист"
Range("A3").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("A4").Select
End Sub
Такой инструмент автоматической записи называется макрорекордер, по началу он хорошо помогает вообще понять, что происходит. Теперь давайте разберемся как выглядит записанный макрос (записанный макрос у автора этой статьи может различаться с записанным макросом у вас поскольку форма записи с макроса зависит от последовательности нажатий, способах ввода информации и криворукости пользователь, в любом случае автор этой статьи снимает с себя всю ответственность за любые действия которые привели или могут привести к изменению годовых отчетов, искажению пространственное – временного континуума и прочих непредвиденных вымираний.)
Теперь давайте разбираться что делает этот макрос
Sub Макрос2()
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
(Весь этот кусок от начала говорит нам о том, что с тем элементом что был выделен ранее происходит некоторое дерьмо, в том числе изменение цвета. Вот там, где Color = 255. Все остальное это параметры заливки, которые по итогу не менялись, но макрорекордер решил их тоже записать, на всякий. Это связано с внутренними особенностями работы excel как я понял. Вообще привыкайте к тому что макрорекордер пишет много того что потом вообще можно удалить. Конструкция With – End With позволяет делать несколько действий с одним объектом, на пример выше берется объект Selection.Interior, то есть фон выбранной области и ряду параметров этой заливки назначаются конкретные значения. То есть With нужен для облегчения записи кода, чтобы Selection.Interior не писать вначале каждой строчки.
Range("A2").Select –выделяем ячейку «A2»
ActiveCell.FormulaR1C1 = "Мама, я программист" – пишем в ячейку значение
Range("A3").Select – выделяем ячейку «А3»
ActiveCell.FormulaR1C1 = "=TODAY()" –пишем в ячейку формулу
Range("A4").Select – зачем то выделяем ячейку А4.
End Sub
Теперь при создании нового листа и запуске этого макроса он будет делать все то же самое.
Тут стоит понимать, что половину того что записал макрос можно опустить, так как нам важен результат, а не путь по которому к этому результату пришли, а макрорекордер записывает именно путь. На пример вместо всей конструкции With можно записать
Range("A1").Interior.Color = 255
так как мы точно знаем, что хотим поменять только цвет в ячейке А1. Также вместо того чтобы выделять ячейку, а потом в активной ячейке писать формулу можно сразу записать нужное значение в ячейку
Range(“A2”).Value = ”Мама, я программист”
или писать формулу как в третей ячейке
Range(“A3”).FormulaR1C1 = ”=TODAY()”
С формулами и значениями лично мне не понятно, как excel их интерпретирует, но в макрорекордре он записывает любой ввод в ячейку как ввод формулы. Благо лично у меня при написании макросов не возникает необходимости писать формулы в ячейки. На пример вместо вставки формулы как это было выше можно написать Range(“A3”).Value = Date(), тогда макрос вставит сразу текущую дату в ячейку как значение.
Опытные макроделы пишут макросы сразу без их записи макрорекордером, но это полезный инструмент для самостоятельного изучения при написании макросов: если не знаешь, что как делается в VBА то запускаешь и делаешь, потом смотришь что он там написал.
Теперь давайте напишем какой ни будь полезный макрос, я буду писать строчки и как можно подробнее их комментировать. Комментарии от программы отделяются символом «‘», он ставится вначале комментария. Прошу учесть, что я самоучка и многого не знаю, и просто напишу так ка делаю это сам, возможно есть более изящные решения. Напоминаю, что это просто ознакомительный опус для тех, кто не в зуб ногой.
Sub Colorization()
'начало нашего макроса и его название
Dim x As Integer
'объявляем переменную х типа интеджер, это тип для целых чисел от -32 768 до 32 767 (2 байта),
'она нам нужна для перебора ячеек
For x = 1 To ActiveSheet.UsedRange.Rows.Count
'перебираем х от 1 до конца использованной части листа, то есть не весь лист, а там где есть данные.
'Тут цикл For повторяется от этой строки до строки Next x, которая прописана ниже
If Cells(x, 1).Value = "красный" Then Cells(x, 1).Interior.Color = RGB(255, 0, 0)
'если значение в ячейке равно "красный" то закрашиваем ячейку в красный цвет. Функция If выполняет часть
'после Then если условие между If и Then верно. Так как у нас необходимое действие занимает одну
'строку можно писать в таком виде, если же действий несколько применяется конструкция:
'If … Then
'…
'…
'End If
If Cells(x, 1).Value = "зеленый" Then Cells(x, 1).Interior.Color = RGB(0, 255, 0)
'как выше только в зеленый цвет
If Cells(x, 1).Value = "синий" Then Cells(x, 1).Interior.Color = RGB(0, 0, 255)
'в синий цвет
Next x 'берем следующее значение х, конец цикла For, который мы начали выше
End Sub 'конец макроса
Как работает этот макрос: берет первый столбец, сначала 1 ячейку, смотрит что в ней написано, и если это равно «красный», «зеленый» или «синий», то красит фон ячейки в этот цвет, если нет по пропускает. Потом берет вторую и т. д. до конца активной части текущего листа.
Для проверки работы макроса нам нужен лист, где в первом столбце будут случайным образом прописаны цвета «красный», «зеленый», «синий». Запускаем макрос – когда он отработает ячейки будут раскрашены:
Некоторые пояснения: если не писать просто Cells то макрос будет делать все в активном листе активного окна. Но макрос может идти и в другие листы, файлы, даже в другие приложения офиса, но об этом не сегодня.
После того, как макрос поработал с документом, не удастся кнопкой «назад» вернуть все изменения, так что, если данные важны, то сохраняйте их отдельно и макросом работайте с копией, макросы беспощадны.
Итак, на этом пока все. Надеюсь теперь те, кто никогда не видел макросов получат о них начальное представление. Дальше буду писать про более практичное применение.
Есть таблица с телефонными номерами, примерно 150 шт. Из них нужно выбрать 70 тлф согласно списка. Ненужные строки удалить. Можно конечно и фильтром, но это очень геморно. Спасибо
Решил попробовать формат коротких постов по Excel
Дети, сегодня я расскажу вам о такой удобной функции в Excel как ЕСЛИ.
В общем виде выглядит так:
ЕСЛИ (условие; результат если условие верное; результат если условие не верное)
Я буду писать формулу, а на картинке будет результат этой формулы в 5 столбце
=ЕСЛИ(A2="овощи";"да";"нет")
При множественных условиях иногда удобно применять функции И, и ИЛИ, которые позволяют соединять несколько условий
=ЕСЛИ(И(A2="овощи";D2>50);"дорогой овощ";"либо не дорогой, либо не овощ")
Не забываем, что можно комбинировать несколько ЕСЛИ Главное не запутаться в скобках и точках с запятыми.
=ЕСЛИ(A2="фрукты";ЕСЛИ(D2>100;"дорогой фрукт";"не дорогой");"не фрукт")
Как видим результат получается довольно гибкий.
Также напомню, что есть операторы сравнения <,>,<=,>=,=,<>.
А на этом сегодня все, пойду дальше писать про макросы…
Ребяты, нужна помощь. Никак не могу понять, как провернуть такую штуку:
Есть несколько блоков данных на разных страницах (для примера, используем вот такую)
Суть такая, нужно прописать в ячейках итоговой таблицы функцию, которая будет сравнивать (искать максимальное) цифры в первой таблице и выводить значение в итоговую и такая же тема со второй таблицей.
Т.е., в данном случае, в итоговой таблице должно быть записано "пять" напротив первой таблицы и "пятнадцать" напротив второй.
Я, конечно, извернулся используя связку если и макс, зациклив их несколько раз, но на каждую таблицу у меня так сделать не получается, по тому что я заебался подстраивать эту формулу на каждую из 30 таблиц и где-то накосячил так, что концов не найду и проще заново прописывать всю формулу
В общем вопрос такой - есть, к примеру, вордовский файл. Если я его открываю с помощью гугл документов и сделаю хоть одну правку, то потом, когда открою его в ворде, то появится такая хрень:
Т.е. разбивает текст на блоки, которые непонятно как убрать, а это ооочень сильно мешает. Может, кто знает как -
1. Отключить это в гугл документах, чтобы он не дробил текст так.
2. Может, есть настройка в ворде, которая убирает такое дробление.
День добрый!
Не могу понять, почему странно считает, есть две сводные таблицы, данные берутся из одной общей таблицы, создаю в каждой из них рассчитываемое поле для суммы по условию, если поле 'Причина отказа' не имеет значение, то суммируем полю 'Сумма сделки', иначе 0
Для 1-й если поле 'Причина отказа' не имеет значение, то суммируем полю 'Сумма сделки', иначе 0:
=IF(ISBLANK('Причина отказа');SUM('Сумма сделки');0)
Для 2-й суммируем наоборот, если есть значение, сумму выводим:
=IF(ISBLANK('Причина отказа');0;SUM('Сумма сделки'))
И собственно не могу понять почему значения заполняет в обеих сводных таблицах, 'Причина отказа' в общей таблице заполнено и по логике в 1-ю таблицу не должно подтягивать, только во 2-ю. Что не так сделал?
