Страницы: 1 2 След.
RSS
Использование макроса только к выделенным ячейкам
 
ех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
 
ТэнтаклсБлад, с вас файл-пример с 2мя листами "как есть" и "как надо"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Sub Ciklklkl()
Dim cell As Range
For Each cell In Selection
    cell = 1
Next
End Sub
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, можно проще:
Код
Sub Ciklklkl()
Selection = 1
End Sub
Изменено: Vladimir1336 - 08.05.2019 11:36:53
 
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 Famous - 08.05.2019 11:33:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
Код
Sub Ciklklkl()
Selection = Cells(ActiveCell.Row, ActiveCell.Column)-1
End Sub
Изменено: Vladimir1336 - 08.05.2019 13:32:26
 
Великолепно сработал вариант Alеmox'a! Спасибо всем за помощь! :)
Изменено: ТэнтаклсБлад - 08.05.2019 11:40:57
 
Vladimir1336, ваш код преобразует Selection в нули (если были числа)  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
ТэнтаклсБлад: сработал вариант Alеmox'a
Если на скрине - то, что вам нужно, тогда Vladimir1336 в #4 предложил вариант быстрее и короче. Но это не то, что вы описали в стартовом сообщении…
Изменено: Jack Famous - 08.05.2019 12:30:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, в 365-м Excel'е он работает корректно. Я бы не написал его сюда, если бы он не сработал у меня.
Изменено: Vladimir1336 - 08.05.2019 13:32:44
 
Vladimir1336, не верю. Работа такого простейшего кода не должна отличаться в разных версиях. Коды давно пишете?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, я не хочу спорить. Ваше право мне не верить. У меня этот код работает.
https://imgur.com/a/JItwTkt — скриншоты смотреть снизу вверх.
 
ТэнтаклсБлад,

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

готово и без макроса
Изменено: Ігор Гончаренко - 08.05.2019 11:58:33
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Vladimir1336: я не хочу спорить
тестируйте тщательнее  :D
1. При применении кода к диапазону одинаковых чисел он сработает (скрин). Но тогда зачем такой странный код с обращением к ActiveCell нужен, если можно Selection.Value2=Selection(1).Value2-1 или же менее подробно Selection=Selection(1)-1
2. При применении вашего кода к диапазону разных чисел будут нули.
Изменено: Jack Famous - 08.05.2019 12:08:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, откройте ту же ссылку, теперь там четыре скриншота.
Я сделал специально два диапазона с разными числами в ячейках. Активную ячейку видно — она белая. После запуска макроса всё корректно сработало. Причём в обоих диапазонах.
Изменено: Vladimir1336 - 08.05.2019 13:29:37
 
Vladimir1336, ах тут же ещё нужно активную ячейку установить правильно  :D
И всё равно у вас ОДНО И ТОЖЕ ЗНАЧЕНИЕ в диапазоне РАЗНЫХ чисел  :excl:
Не вижу смысла в дискуссии: ТС'у всё подходит - и ладно  ;)

Ваше решение мне напоминает обфускацию кода, ведь как по мне всё просто:
1. нужны одинаковые значения в диапазоне? Вычислил значение, наполнил диапазон (как Ctrl+Enter)
2. нужно произвести математику с каждой ячейкой? Цикл по каждой ячейке диапазона с попутным вычислением или (как предложилІгор Гончаренко) специальная вставка (ручками или кодом)
Изменено: Jack Famous - 08.05.2019 12:26:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, обфускацию? Серьёзно? Это наоборот упрощение.

Цикл? Цикл занимает гораздо больше времени и ресурсов. В моём примере VBA выполняет одну операцию и помещает результат во весь диапазон сразу. В цикле операция будет выполняться столько раз, сколько ячеек в выделенном диапазоне.
Не занимайтесь софистикой, обвиняя меня в якобы запутывании кода.
UPD:
Цитата
И всё равно у вас ОДНО И ТОЖЕ ЗНАЧЕНИЕ в диапазоне РАЗНЫХ чисел
Посмотрите сообщение топикстартера — ему это и нужно было. Переменные r и c в его задаче являются координатами активной ячейки. А применять, как он написал, нужно к выделенному диапазону (т. е. Selection).
Изменено: Vladimir1336 - 08.05.2019 13:30:14
 
OFF
Vladimir1336, значит так:
1. если нужны одинаковые данные в диапазоне: Selection.Value2=значение или Selection.Value2=ПредварительноВычисленноеЗначение
2. если каждую ячейку надо сложить/вычесть/умножить/разделить на заданное число:
    • цикл с математикой
    • специальная вставка
Цикл при этом можно делать не по ячейкам, а по массиву, что многократно ускорит макрос (особенно для сплошного диапазона с одной областью)

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

Размышления о скорости циклов и прочие сравнения в голове без тестов — всё это рассуждения в пользу бедных. Поверьте, тесты, порой, очень удивляют и вы даже не представляете от какого количества параметров, условий и нюансов зависит конечное время выполнения кода (именно поэтому, кстати, говорят, что под каждую задачу - своё решение). Если вы считаете, что специальная вставка действует с помощью магии, вычисляя новое значение для каждой ячейки мгновенно, то это не так))) практически на 100% уверен, что там те же циклы, просто вшитые.
Софи́зм
не похоже, чтобы я что-то из этого натворил  :D
Изменено: Jack Famous - 08.05.2019 12:52:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, не нужно мне рассказывать то, что я и так знаю (массивы). Я хоть и зарегистрировался здесь сегодня, но программирую уже давно. Вам, похоже, просто не с кем поговорить, раз вы строчите такие сочинения.

Кстати, вот это повеселило:
Цитата
ах тут же ещё нужно активную ячейку установить правильно
Задание автора читаем по диагонали, а потом удивляемся? Забавно.
Изменено: Vladimir1336 - 08.05.2019 13:30:33
 
Vladimir1336,
автор темы описывает задачу от КАЖДОГО значения в выделенном диапазоне отнять 1
Alemox
видимо, сделал опечатку:
cell = 1
вместо
cell = cell - 1
Вы резонно заметили, что то, что написал Alemox можно написать без циклов:
selection = 1
и после этого упорно решаете эту задачу: присвоить ячейкам отмеченного диапазона определенное значение, возможно к этому Вас подтолкнула фраза
Цитата
ТэнтаклсБлад написал:
Великолепно сработал вариант Alеmox'a!
поэтому - никто не знает, что нужно автору, если в первом сообщении он пишет
Цитата
ТэнтаклсБлад написал:
Сделал макрос с кнопкой  для вычитания из ячейки
, а потом пишет cell = 1 - подошло!
автор получил решение и давно ушел из темы, предлагаю остановить эту бесполезную перепалку ни о чем
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Vladimir1336, следите сами за своими сообщениями. Не нужно писать через несколько пустых строк.
 
Ігор Гончаренко, Игорь опечатки нет в моём коде. Я дал цикл перебора и единицу просто так написал, она не имеет никакого отношения к ТЗ. Я думаю, что автор это понял и смог уже применить всё правильно. Хотел вообще слово "Текст" написать, но 1 короче.  :D
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Ігор Гончаренко, вот да) спасибо  :)
Цитата
Alemox:Я дал цикл перебора и единицу просто так написал, она не имеет никакого отношения к ТЗ
тогда я вообще не понимаю, что было нужно  :D
1. автор пишет пример, в котором видно, что происходит вычитание единицы от ячейки
2. вы даёте пример, в котором в цикле (!!!) присваивается единица
3. Vladimir1336 вас поправляет, совершенно справедливо замечая, что Selection=1 будет короче (и быстрее)
4. я начинаю задавать вопросы
5. ТС'а устраивает ваш вариант
6. мы с Vladimir'ом ведём непринуждённый спор о разном

Жесть  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Vladimir1336 написал:
Задание автора читаем по диагонали
Цитата
ТэнтаклсБлад написал:
Возникла необходимость применять данный макрос только к выделенным через клавишу Ctrl  ячейкам
применять для активной ячейки по отдельности очень долго
в принципе, это можно читать как: взять каждую выделенную ячейку и вычесть из неё 1. Ведь исходный код делает именно это. И автор упоминает, что делать так для каждой ячейки - утомительно.
Vladimir1336, Ваш код этого не делает. Ваш код не вычитает из каждой выделенной через Ctrl ячейки 1 - он назначает всем выделенным ячейкам значение, вычисленное по схеме: из активной ячейки вычесть 1. Просто вчитайтесь не в то, что код одобрил кто-то, а в задачу и то, что предложили Вы.
Другой вопрос, что мы совершенно не знаем - вдруг у автора все значения одинаковые? :) Что, конечно, меняет подход.
Вот, сделал небольшую GIF-ку с работой разных кодов. Вначале записано применение к нескольким ячейкам по очереди кода автора:
https://yadi.sk/i/spdDyuM4WRrn4w
P.S. эх, видюшка не проигрывается автоматом с Яндекс.Диска, надо скачивать. Попробую в другое место выложить.
Изменено: Дмитрий(The_Prist) Щербаков - 08.05.2019 13:56:46
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вот чёрт я во всём виноват  :D
Каюсь.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Дмитрий(The_Prist) Щербаков, спасибо и вам)) я о том же и писал. Плюс, что применять ActiveCell'ы для диапазона не стоит (даже, если сработает корректно).

P.S.: подскажите гиф-мэйкер, пожалуйста… :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Щас медведь все опять испортит.

Что будет в случае вот такого селекта? :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: Что будет
думаю, что кого-то могут за такое упрятать  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
БМВ, это грустный SELECT. Тогда проверочку добавлять как минимум.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: грустный SELECT
:D ору))))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх