Макрос excel по выделенным ячейкам

 

ТэнтаклсБлад

Пользователь

Сообщений: 2
Регистрация: 08.05.2019

#1

08.05.2019 10:21:56

ехcel 2007.  Сделал макрос с кнопкой  для вычитания из ячейки:

Код
Sub Кнопка1_Щелчок()
r = ActiveCell.Row
c = ActiveCell.Column
Cells(r, c) = Cells(r, c) - 1
End Sub

Возникла необходимость применять данный макрос

только к выделенным через клавишу Ctrl  ячейкам

для упрощения ведения (применять для активной  ячейки по отдельности очень долго.) Диапазон значений столбца — В1:B18. Через Range сделать не получилось.  Заранее благодарен!

Изменено: ТэнтаклсБлад08.05.2019 11:36:11

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

ТэнтаклсБлад, с вас файл-пример с 2мя листами «как есть» и «как надо»

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

#3

08.05.2019 10:48:00

Код
Sub Ciklklkl()
Dim cell As Range
For Each cell In Selection
    cell = 1
Next
End Sub

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

Vladimir1336

Пользователь

Сообщений: 8
Регистрация: 08.05.2019

#4

08.05.2019 11:17:57

Alemox, можно проще:

Код
Sub Ciklklkl()
Selection = 1
End Sub

Изменено: Vladimir133608.05.2019 11:36:53

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

08.05.2019 11:33:08

Alemox, Vladimir1336, ну вообще-то Selection=1 и Cells(r, c) = Cells(r, c) — 1 — не одно и тоже. Тогда уж:

Код
Sub Ciklklkl()
Dim cell As Range
For Each cell In Selection
    cell.Value2 = cell.Value2-1
Next
End Sub

Изменено: Jack Famous08.05.2019 11:33:55

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Vladimir1336

Пользователь

Сообщений: 8
Регистрация: 08.05.2019

#6

08.05.2019 11:37:49

Jack Famous,

Код
Sub Ciklklkl()
Selection = Cells(ActiveCell.Row, ActiveCell.Column)-1
End Sub

Изменено: Vladimir133608.05.2019 13:32:26

 

Великолепно сработал вариант Alеmox’a! Спасибо всем за помощь! :)

Изменено: ТэнтаклсБлад08.05.2019 11:40:57

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Vladimir1336, ваш код преобразует Selection в нули (если были числа)  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#9

08.05.2019 11:46:42

Цитата
ТэнтаклсБлад: сработал вариант Alеmox’a

Если на скрине — то, что вам нужно, тогда Vladimir1336 в #4 предложил вариант быстрее и короче. Но это не то, что вы описали в стартовом сообщении…

Прикрепленные файлы

  • 3.png (3.19 КБ)

Изменено: Jack Famous08.05.2019 12:30:55

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous, в 365-м Excel’е он работает корректно. Я бы не написал его сюда, если бы он не сработал у меня.

Изменено: Vladimir133608.05.2019 13:32:44

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Vladimir1336, не верю. Работа такого простейшего кода не должна отличаться в разных версиях. Коды давно пишете?

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous, я не хочу спорить. Ваше право мне не верить. У меня этот код работает.

https://imgur.com/a/JItwTkt

— скриншоты смотреть снизу вверх.

 

ТэнтаклсБлад,

1. в любую ячейку пишете 1
2. копируете ее
3. отмечаете требуемые Вам ячейки
4. правая кнопка мыши, специальная вставка, в группе операции «вычесть», Ок

готово и без макроса

Изменено: Ігор Гончаренко08.05.2019 11:58:33

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#14

08.05.2019 12:05:38

Цитата
Vladimir1336: я не хочу спорить

тестируйте тщательнее  :D
1. При применении кода к диапазону одинаковых чисел он сработает (скрин). Но тогда зачем такой странный код с обращением к ActiveCell нужен, если можно Selection.Value2=Selection(1).Value2-1 или же менее подробно Selection=Selection(1)-1
2. При применении вашего кода к диапазону разных чисел будут нули.

Изменено: Jack Famous08.05.2019 12:08:43

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous, откройте ту же ссылку, теперь там четыре скриншота.
Я сделал специально два диапазона с разными числами в ячейках. Активную ячейку видно — она белая. После запуска макроса всё корректно сработало. Причём в обоих диапазонах.

Изменено: Vladimir133608.05.2019 13:29:37

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Vladimir1336, ах тут же ещё нужно активную ячейку установить правильно  :D
И всё равно у вас ОДНО И ТОЖЕ ЗНАЧЕНИЕ в диапазоне РАЗНЫХ чисел  :excl:
Не вижу смысла в дискуссии: ТС’у всё подходит — и ладно  ;)

Ваше решение мне напоминает

обфускацию

кода, ведь как по мне всё просто:
1. нужны одинаковые значения в диапазоне? Вычислил значение, наполнил диапазон (как Ctrl+Enter)
2. нужно произвести математику с каждой ячейкой? Цикл по каждой ячейке диапазона с попутным вычислением или (как предложилІгор Гончаренко) специальная вставка (ручками или кодом)

Изменено: Jack Famous08.05.2019 12:26:59

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Vladimir1336

Пользователь

Сообщений: 8
Регистрация: 08.05.2019

#17

08.05.2019 12:33:41

Jack Famous

, обфускацию? Серьёзно? Это наоборот упрощение.

Цикл? Цикл занимает гораздо больше времени и ресурсов. В моём примере VBA выполняет одну операцию и помещает результат во весь диапазон сразу. В цикле операция будет выполняться столько раз, сколько ячеек в выделенном диапазоне.
Не занимайтесь софистикой, обвиняя меня в якобы запутывании кода.
UPD:

Цитата
И всё равно у вас ОДНО И ТОЖЕ ЗНАЧЕНИЕ в диапазоне РАЗНЫХ чисел

Посмотрите сообщение топикстартера — ему это и нужно было. Переменные r и c в его задаче являются координатами активной ячейки. А применять, как он написал, нужно к выделенному диапазону (т. е. Selection).

Изменено: Vladimir133608.05.2019 13:30:14

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#18

08.05.2019 12:50:19

OFF
Vladimir1336, значит так:
1. если нужны одинаковые данные в диапазоне: Selection.Value2=значение или Selection.Value2=ПредварительноВычисленноеЗначение
2. если каждую ячейку надо сложить/вычесть/умножить/разделить на заданное число:
    • цикл с математикой
    • специальная вставка
Цикл при этом можно делать не по ячейкам, а по массиву, что многократно ускорит макрос (особенно для сплошного диапазона с одной областью)

Оскорбить вас или как-то унизить я ни в коем случае не хотел. Представьте, что вы ремонтируете автомобили и знаете, что если не закрутить гайку, то отвалится колесо. А другой эту гайку приварил, что, безусловно тоже сработает, но создаст дополнительные трудности при дальнейшей эксплуатации)) как-то так  :)

Размышления о скорости циклов и прочие сравнения в голове без тестов — всё это рассуждения в пользу бедных. Поверьте, тесты, порой, очень удивляют и вы даже не представляете от какого количества параметров, условий и нюансов зависит конечное время выполнения кода (именно поэтому, кстати, говорят, что под каждую задачу — своё решение). Если вы считаете, что специальная вставка действует с помощью магии, вычисляя новое значение для каждой ячейки мгновенно, то это не так))) практически на 100% уверен, что там те же циклы, просто вшитые.

Софи́зм

не похоже, чтобы я что-то из этого натворил  :D

Изменено: Jack Famous08.05.2019 12:52:23

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Vladimir1336

Пользователь

Сообщений: 8
Регистрация: 08.05.2019

#19

08.05.2019 13:03:57

Jack Famous, не нужно мне рассказывать то, что я и так знаю (массивы). Я хоть и зарегистрировался здесь сегодня, но программирую уже давно. Вам, похоже, просто не с кем поговорить, раз вы строчите такие сочинения.

Кстати, вот это повеселило:

Цитата
ах тут же ещё нужно активную ячейку установить правильно

Задание автора читаем по диагонали, а потом удивляемся? Забавно.

Изменено: Vladimir133608.05.2019 13:30:33

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#20

08.05.2019 13:26:16

Vladimir1336,
автор темы описывает задачу от КАЖДОГО значения в выделенном диапазоне отнять 1

Alemox

видимо, сделал опечатку:
cell = 1
вместо
cell = cell — 1
Вы резонно заметили, что то, что написал

Alemox

можно написать без циклов:
selection = 1
и после этого упорно решаете эту задачу: присвоить ячейкам отмеченного диапазона определенное значение, возможно к этому Вас подтолкнула фраза

Цитата
ТэнтаклсБлад написал:
Великолепно сработал вариант Alеmox’a!

поэтому — никто не знает, что нужно автору, если в первом сообщении он пишет

Цитата
ТэнтаклсБлад написал:
Сделал макрос с кнопкой  для вычитания из ячейки

, а потом пишет cell = 1 — подошло!
автор получил решение и давно ушел из темы, предлагаю остановить эту бесполезную перепалку ни о чем

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Vladimir1336, следите сами за своими сообщениями. Не нужно писать через несколько пустых строк.

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

Ігор Гончаренко, Игорь опечатки нет в моём коде. Я дал цикл перебора и единицу просто так написал, она не имеет никакого отношения к ТЗ. Я думаю, что автор это понял и смог уже применить всё правильно. Хотел вообще слово «Текст» написать, но 1 короче.  :D

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#23

08.05.2019 13:47:26

Ігор Гончаренко, вот да) спасибо  :)

Цитата
Alemox:Я дал цикл перебора и единицу просто так написал, она не имеет никакого отношения к ТЗ

тогда я вообще не понимаю, что было нужно  :D
1. автор пишет пример, в котором видно, что происходит вычитание единицы от ячейки
2. вы даёте пример, в котором в цикле (!!!) присваивается единица
3. Vladimir1336 вас поправляет, совершенно справедливо замечая, что Selection=1 будет короче (и быстрее)
4. я начинаю задавать вопросы
5. ТС’а устраивает ваш вариант
6. мы с Vladimir’ом ведём непринуждённый спор о разном

Жесть  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#24

08.05.2019 13:50:07

Цитата
Vladimir1336 написал:
Задание автора читаем по диагонали
Цитата
ТэнтаклсБлад написал:
Возникла необходимость применять данный макрос только к выделенным через клавишу Ctrl  ячейкам
применять для активной ячейки по отдельности очень долго

в принципе, это можно читать как: взять каждую выделенную ячейку и вычесть из неё 1. Ведь исходный код делает именно это. И автор упоминает, что делать так для каждой ячейки — утомительно.
Vladimir1336, Ваш код этого не делает. Ваш код не вычитает из каждой выделенной через Ctrl ячейки 1 — он назначает всем выделенным ячейкам значение, вычисленное по схеме: из активной ячейки вычесть 1. Просто вчитайтесь не в то, что код одобрил кто-то, а в задачу и то, что предложили Вы.
Другой вопрос, что мы совершенно не знаем — вдруг у автора все значения одинаковые? :) Что, конечно, меняет подход.
Вот, сделал небольшую GIF-ку с работой разных кодов. Вначале записано применение к нескольким ячейкам по очереди кода автора:

https://yadi.sk/i/spdDyuM4WRrn4w

P.S. эх, видюшка не проигрывается автоматом с Яндекс.Диска, надо скачивать. Попробую в другое место выложить.

<#1>

Изменено: Дмитрий(The_Prist) Щербаков08.05.2019 13:56:46

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

Вот чёрт я во всём виноват  :D
Каюсь.

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Дмитрий(The_Prist) Щербаков, спасибо и вам)) я о том же и писал. Плюс, что применять ActiveCell’ы для диапазона не стоит (даже, если сработает корректно).

P.S.:

подскажите гиф-мэйкер, пожалуйста… :)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

БМВ

Модератор

Сообщений: 21385
Регистрация: 28.12.2016

Excel 2013, 2016

Щас медведь все опять испортит.

Что будет в случае вот такого селекта? :-)

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#28

08.05.2019 14:49:04

Цитата
БМВ: Что будет

думаю, что кого-то могут за такое упрятать  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

БМВ, это грустный SELECT. Тогда проверочку добавлять как минимум.

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#30

08.05.2019 15:00:31

Цитата
Alemox: грустный SELECT

:D ору))))

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

применение макроса к выделенным ячейкам, возможно ли такое?

Автор GregorY, 27.03.2009, 15:17

« назад — далее »

Уважаемые специалисты!
Прошу подсказать возможно ли применение макроса к выделенному диапазону ячеек?
А возник этот вопрос в связи с простенькой задачкой:
Есть накладная с большим кол-вом позиций (сотни) в которой указанна только марка (например К50-35), но нет наименования. Необходимо добавить к марке наименования — конденсатор, резистор и т.п.
А т.к., например,конденсаторов очень много, то логично было бы выделить диапазон ячеек и выполнив макрос по добавлению к ним слова Конденсатор. Макрос для исправления одной ячейки пишется элементарно, а вот к выделенному диапазону я нигде информации не нашел.


Формулой проще… B1=»Конденсатор»&A1,
где A1 — ячейка с маркой… после, например, результат скопировать как значения… три клавиши нажать…

Если хотите обрабатывать выделенные ячейки макросом, то используйте Selection.
Пример..

Sub AddStr()
    Dim vStr As String, c As Variant
    vStr = InputBox("Ведите добавляемую текстовую строку:", "Ввод данных")
    For Each c In Selection.Cells
        c.Value = vStr & c.Value
    Next
End Sub


Andrey Lenets, болшое спасибо за оперативный и исчерпывающий ответ! Хочу тоже научиться писать такие аккуратные и изящные макросы! Есть рекомендации где взять информацию для обучения(книги, сайты)?


Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


Большое спасибо за совет, Шпец Докапыч!


Всем добрый день, Прочитав данный топик у меня возник вопрос, что нужно  сделать в в строчке кода «c.Value = vStr & c.Value»    что бы вводимое значение затирало последний символ в ячейке. Ну например в ячейке значение «111» и при вводе значения в InputBox «9» конечное значение в ячейки было бы «119»  ?


Цитата: DENGA от 26.04.2009, 00:52
…что нужно  сделать в строчке кода «c.Value = vStr & c.Value», чтобы вводимое значение затирало последний символ в ячейке?..

Поменять на такую:

If Len(c.Value) > 0 Then c.Value = Left(c.Value, Len(c.Value) - 1) & vStr

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


Большое Вам спасибо  Шпец Докапыч!


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • применение макроса к выделенным ячейкам, возможно ли такое?

В данном примере мы VBA код который позволяет найти и выделить ячейку макросом. Выделение ячеек с учетом нестандартных условий может оказаться весьма непростой задачей в Excel. В этом примере описано как легко решается данный тип задач с использованием макроса.

Выделение несмежных диапазонов с помощью макроса

У нас иметься таблица уровней расходов отделов по отношению к расходам труда, произведенного в отдельных отделах за первое полугодие. Часть ячеек, для которых неопределенны показатели содержат значение «нд».

таблица расходов.

Нам необходимо экспонировать ячейки, которые содержат значение «нд» выделив их серым цветом заливки фона. В таблице на десятки тысяч строк сложно искать все эти ячейки. А если редактировать каждую ячейку вручную, тогда потребуется много сил и времени. Без условно можно воспользоваться инструментом «Условное форматирование». Но иногда для автоматизированного решения данной задачи лучше написать свой собственный макрос. Дело в том, что несмотря на широкие возможности условного форматирования – макрос является более гибким инструментом. Его потом можно применять разным способом. Ведь в основе его принципа действия лежит выделение ячеек с определенным значением. После того как ознакомившись с нашей версией макроса вы сможете его легко изменять, придавая ему все новые функциональные возможности. В результате чего вас будет ограничивать только высота полета вашей фантазии.

Откройте редактор: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» (ALT+F11):

ALT+F11.

В редакторе создайте новый модуль выбрав инструмент: «Insert»-«Module» и введите в него следующий VBA-код макроса:

Sub PoiskZnach()
Dim i As Long
Dim znach As Variant
Dim diapaz1 As Range
Dim diapaz2 As Range
znach = InputBox("Введите исходное значение")
If znach = "" Then Exit Sub
If IsNumeric(znach) Then znach = znach * 1
Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
If diapaz1 Is Nothing Then
  MsgBox "Сначала выделите диапазон!"
  Exit Sub
Else
   For i = 1 To diapaz1.Count
     If diapaz1(i) = znach Then
       If diapaz2 Is Nothing Then
         Set diapaz2 = diapaz1(i)
         Else
         Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
End If
If diapaz2 Is Nothing Then
Else
  diapaz2.Select
End If
End Sub

Макро-Код.

Теперь если мы хотим выделить все ячейки которые содержать значение «нд» в таблице отчета уровня расходов по отделам и присвоить им серый фон, тогда выделите диапазон B2:F12 выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«PoiskZnach»-«Выполнить».

В результате скачала появиться диалоговое окно, в котором следует ввести исходное значение для поиска «нд» и нажать ОК:

PoiskZnach.

После чего макрос выполнит все инструкции, описанные в его коде на языке программирования VBA. Он автоматически и самостоятельно выделит все ячейки в выделенном диапазоне, которые содержат значение «нд»:

автоматически выделит все ячейки.

Результат автоматического выделения макросом группы ячеек соответствующие критерию поиска.

В начале кода объявлены 4 переменные:

  1. i – счетчик цикла.
  2. znach – значение которое должна содержать ячейка.
  3. diapaz1 – адрес проверяемого диапазона.
  4. diapaz2 – адрес для несмежного диапазона, соответствующий критериям пользователя.

Внимание! Понятие несмежный диапазон ячеек подразумевает то, что этот диапазон состоит из нескольких отдельных областей ячеек. Выделение нескольких диапазонов ячеек можно реализовать вручную с нажатой клавишей CTRL на клавиатуре при выделении мышкой разных областей на листе.

После декларации переменных вызываем окно для ввода критериев поиска необходимого значения и передаем эти же критерии в переменную znach. Сразу в коде описываем инструкцию для проверки на пустые критерии. Если пользователь оставил поле ввода пустым или нажал на кнопку «Отмена», тогда работа макроса будет прервана остановкой с помощью вызова соответствующей инструкции:

Exit Sub

Также проверяется: если пользователь ввел текст похожий на числовое значение, тогда преобразовываем критерий поиска в числовые значения с помощью умножения его на число 1.

На следующей строке кода оператором Set создаем ссылку и в переменную diapaz1 присваиваем диапазон ячеек, который состоит из двух частей:

  1. адрес выделенного диапазона ячеек.
  2. адрес используемого диапазона рабочего листа Excel.

Внимание! Используемый диапазон рабочего листа получаем с помощью свойства UsedRange. Это адрес диапазона, который охватывает все ячейки с любыми значениями или измененные форматом на текущем рабочем листе Excel:

Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)

Поэтому если предварительно не был выделен диапазон ячеек в области используемого диапазона рабочего листа Excel, тогда объект для переменной diapaz1 будет пустым (без ссылки). И дальнейшая работа макроса – не возможна. Поэтому следует проверить не является ли пустым объект в переменной diapaz1:

If diapaz1 Is Nothing Then ‘проверяем пустой ли объект Range в переменной diapaz1

Если перед выполнением макроса не был выделен диапазон в используемой области листа – объект пустой, тогда выводиться соответствующее сообщение с помощью функции:

MsgBox «Сначала выделите диапазон!»

И выполнение кода снова прерывается функцией Exit Sub. Если же пользователь сделал все верно, тогда дальше беспрепятственно выполняется следующая строка в коде макроса.

В следующей части VBA-макроса создан цикл, внутри которого по очереди все ячейки в диапазоне определенным переменной diapaz1 проверяются на наличие искомого значения:

For i = 1 To diapaz1.Count
If diapaz1(i) = znach Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next

Если диапазон переменной diapaz1 содержит ячейку с таким же значением, как и в переменной znach, тогда несмежный диапазон ячеек в переменной diapaz2 увеличивается на один адрес для включения этой ячейки. Таким образом несмежный диапазон в переменной diapaz2 включая в себя все адреса найденных ячеек. Реализовывается увеличение несмежного диапазона в переменной diapaz2 с помощью свойства Union, оно позволяет создавать несмежные диапазоны.

В конце макроса выполняется одно из двух условий: или выделяются все найденные ячейки, или же выводиться сообщение:

MsgBox «Не найдено исходное значение»



Макрос для пересчета выделенной области

Теперь вы самостоятельно можете модифицировать макрос. гибко настраивая его под самые привередливые потребности. Например, добавим новую возможность. Макрос будет сообщать нам о количестве найденных ячеек, соответствующих критерию поиска. Для этого в конце макроса после строки diapaz2.Select следует добавить новую строчку кода:

MsgBox «Найдено: » & diapaz2.Count & » ячеек!»

После выполнения макроса и выделения ним ячеек мы будем получать сообщение о их количестве:

MsgBox.

Чтобы макрос умел работать с ключами поиска для многозначных значений (например, звездочка «*» – для всех символов), тогда следует изменить соответствующий оператор в коде. Перейдите на строку макроса №15 где указана инструкция для проверки соответствия значений просматриваемых ячеек в диапазоне со значением переменной znach. Затем измените оператор сравнение на оператор Like:

If diapaz1(i) Like znach Then

Теперь после такой модификации кода макроса в критерии поиска можно использовать ключ звездочку «*» (для всех символов). Например, если мы в поле ввода введем значение «н*» макрос будет учитывать все ячейки, значение которых начинается с символа буквы «н».

ключ символ звездочки.

В Excel можно использовать только 2 ключа многозначного значения запроса в поиске:

  1. «*» – символ звездочки (любые другие символы).
  2. «?» – вопросительный знак (отдельный символ) например, так:

ключ вопросительный знак.

Если нужно сделать так, чтобы макрос не был чувствителен к регистру вводимых текстовых символов? Если макрос должен одинаково находит значения не зависимо большая или маленькая буква в критерии поиска и выдавать один и тот же результат? Тогда в строке №15 , где проверяется значение ячейки используйте функцию LCase следующим образом:

If LCase(diapaz1(i)) Like LCase(znach) Then

Задача функции LCase замена всех символов в тексте на нижний регистр (маленькие буквы):

LCase.

Полная новая версия кода модифицированного макроса для выделения ячеек выглядит так:

Sub PoiskZnach()
Dim i As Long
Dim znach As Variant
Dim diapaz1 As Range
Dim diapaz2 As Range
znach = InputBox("Введите исходное значение")
If znach = "" Then Exit Sub
If IsNumeric(znach) Then znach = znach * 1
Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
If diapaz1 Is Nothing Then
  MsgBox "Сначала выделите диапазон!"
  Exit Sub
Else
   For i = 1 To diapaz1.Count
     If LCase(diapaz1(i)) Like LCase(znach) Then
       If diapaz2 Is Nothing Then
         Set diapaz2 = diapaz1(i)
         Else
         Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
End If
If diapaz2 Is Nothing Then
  MsgBox "Не найдено исходное значение"
Else
  diapaz2.Select
  MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub

Изучая возможности языка программирования VBA, вы можете самостоятельно совершенствовать свой макрос подобным способом как приведено в данном примере.

This macro will highlight the row and column of the active cell. This will fill the row of the active cell with a solid background color and remove the color when a different cell is selected within the excel spreadsheet. Anytime you select a different cell, the new column and row will be highlighted. This is a great macro for zeroing in on a specific cell during a presentation or just when working in a really big spreadsheet. Also, if you remove the gridlines from the spreadsheet, it can be hard to determine which row or column a cell is in and this will allow you to figure that out much quicker.

This macro will overwrite any previous color in the selected cell and row. That means that if you have a worksheet with a lot of background colors and you use this macro and start selecting cells, the previous background colors will disappear.

To change the color of the highlight change the number in this line of code .ColorIndex = 6.

Where to install the macro:  Worksheet

Highlight the Row of the Selected Cell

Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Static rr

If rr <> "" Then
 With Rows(rr).Interior
  .ColorIndex = xlNone
 End With
End If r = Selection.Row
rr = r With Rows(r).Interior
 .ColorIndex = 6
 .Pattern = xlSolid
End With End Sub


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

Excel VBA MsgBox — Message Box Macro

Tutorial: Create a pop-up message box in Excel using VBA Macros. This allows you to show a message t…

Pass Arguments to a Macro Called from a Button or Sheet in Excel

Tutorial: How to pass arguments and values to macros called from worksheets, buttons, and anything e…

Select Ranges in the Worksheet from a UserForm

Tutorial: Select a range in Excel from a UserForm and have that range input into the form so that yo…

NPER Function — Calculate Number of Periods Needed for a Set of Payments in Excel

Tutorial: How to calculate the number of periods required for an investment in order to get the desi…

Count the Occurrences of the Largest or Smallest Value in a Range

Tutorial:
How to count the occurrence of the largest or smallest value in a range; basically, how m…

How to Install the Macro

  1. Select and copy the text from within the grey box above.
  2. Open the Microsoft Excel file in which you would like the Macro to function.
  3. Press «Alt + F11» — This will open the Visual Basic Editor — Works for all Excel Versions.
     Or For other ways to get there, Click Here.
  4. On the new window that opens up, go to the left side where the vertical pane is located. Locate your Excel file; it will be called VBAProject (YOUR FILE’S NAME HERE) and click this.
  5. If the Macro goes in a Module, Click Here, otherwise continue to Step 8.
  6. If the Macro goes in the Workbook or ThisWorkbook, Click Here, otherwise continue to Step 8.
  7. If the Macro goes in the Worksheet Code, Click Here, otherwise continue to Step 8.
  8. Close the Microsoft Visual Basic Editor window and save the Excel file. When you close the Visual Basic Editor window, the regular Excel window will not close.
  9. You are now ready to run the macro.

Similar Content

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

Excel VBA MsgBox — Message Box Macro

Tutorial: Create a pop-up message box in Excel using VBA Macros. This allows you to show a message t…

Pass Arguments to a Macro Called from a Button or Sheet in Excel

Tutorial: How to pass arguments and values to macros called from worksheets, buttons, and anything e…

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

АЛКС

5 / 3 / 2

Регистрация: 17.02.2016

Сообщений: 344

1

Заложить в макрос выделенный диапазон на листе

23.09.2016, 19:27. Показов 4166. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Подскажите пожалуйста, как можно сослаться в макросе на выделенный диапазон на листе

есть такой способ, но он не всегда удобен

Visual Basic
1
2
3
4
5
6
7
8
Public Sub Значки()
Dim cCell As Range
 
For Each cCell In Range(Cells(6, 5), Cells(28, 9))
    Call green(cCell)
Next
 
End Sub



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.09.2016, 19:27

1

pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

23.09.2016, 19:38

2

Лучший ответ Сообщение было отмечено АЛКС как решение

Решение

Visual Basic
1
2
3
4
Dim cCell As Range
For Each cCell In ActiveWindow.RangeSelection
    
Next

или

Visual Basic
1
2
3
4
5
6
7
If TypeName(Selection) <> "Range" Then _
MsgBox "Выделите диапазон": Exit Sub
 
Dim cCell As Range
For Each cCell In Selection
    
Next



1



Понравилась статья? Поделить с друзьями:
  • Макрос excel печать одной страницы
  • Макрос excel печать на принтере
  • Макрос excel перенос строк
  • Макрос excel перенос столбца
  • Макрос excel перенос листов на один