Страницы: 1
RSS
Ctrl+A в макросе, Как реализовать функцию "выделить все" (Ctrl+A) в макросе экселя
 
Доброго времени суток, господа.
Созрел у меня вопрос: как реализовать функцию "выделить все" (Ctrl+A) в макросе экселя?
Допустим есть таблицы, число строк у которых всегда разное. Если записать макрос использовав сочитание клавиш Ctrl+A, то в макросе будет записан диапазон ячеек. Например, если таблица имеет 3 столбика и 20 строк, то в макросе будет диапазон A1:C20. Все бы ничего, но при работе с другой таблицей, у которой 3 столбца и 50 строк, макрос будет работать не правильно (ибо диапазон, после A1:C20 не будет обрабатываться).
Как вариант, я поставил диапазон A1:C5000 (заведомо огромный, чтобы включить возможные размеры таблиц), но подозреваю, что есть более простой вариант реализации  :)  
Так как же "выделить все" макросом, не зная за ранее размеров таблицы?
 
Вычислить номер последней строки и номер последнего столбца. И уже потом выделять.
 
В общем случае это может выглядеть так:
Код
Sub qqq()
Dim LastRow As Long, LastColumn As Integer
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'последняя строка по столбцу А
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column 'последний столбец по первой строке
    Range(Cells(1, 1), Cells(LastRow, LastColumn)).Select
End Sub
 
поэкспериментиовал...
насколько я понял, Ctrl+A аналогично свойству CurrentRegion
за одним исключением - если в CurrentRegion окажется только одна ячейка (даже объединенная) - то тогда берется Worksheet.Cells
именно все Cells листа, а не UsedRange

имхо, Cells брать смысла нет, остается выбрать между CurrentRegion и UsedRange - смотря по задаче.
Изменено: ikki - 08.01.2013 22:07:47
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В строке макроса в место
Range("A1:C20").Select или Range("A1:C5000").Select
поставить
Cells.Select
(это Ctrl+A в макросе)
или как предлагает Юрий М
 
Цитата
Андрей пишет:
Cells.Select
Это Вы немного погорячились :)
 
Андрей, я так пытался сделать, но макрос после этого вместо 2х секунд начал выполняться 20 минут  :)

ikki, это хороший вариант. Загуглю позже, спасибо за посказку.

Юрий М, спасибо. Сейчас буду пробовать, позже отпишусь о результатах.
 
Вот что мне помогло - http://www.youtube.com/watch?v=YXDJjTzB6EQ
В моем случае Ctrl+A работает как CurrentRegion.

Юрий М, я так и не осилил вашу часть кода (не шибко то я опытен в программировании vba), не могли бы вы описать в чем собственно заключается идея исспользования данного кода?
 
Цитата
Derian Fox пишет:
макрос после этого вместо 2х секунд начал выполняться 20 минут
Совет Cells.Select - плохой совет: будут выделены все ячейки на листе
Идея заключается в том, что Вы и хотели добиться :-) - определять последнюю строку и последний столбец (чтобы не выделять лишних ячеек).
===
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Эта строка кода найдёт последнюю заполненную ячейку в столбце А. Если нужно по другому столбцу - поменяйте 1 на номер нужного столбца.
LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
Эта строка кода просмотрит ПЕРВУЮ строку на листе и определит последнюю заполненную ячейку: это и будет номер столбца.
Цитата
Derian Fox пишет:
Юрий М, я так и не осилил вашу часть кода
А что её осиливать? На чистом листе введите что-нибудь, например, в ячейки А10 и F1. Затем выполните тот маленький макрос. Будет выделен ТОЛЬКО диапазон, не выходящий за пределы ячеек с данными.
 
Юрий М, Потестил. Все шикарно работает, спасибо за обьяснение.
 
Не мало лет уже минуло... авось, кому-то и сгодится.
Код
Sub Выделить()
Application.SendKeys ("^a") '( Ctrl + a ) 
End Sub
Если к активной ячейке примыкает хотя бы одна заполненная ячейка, выделяется диапазон из примыкающих ячеек.
Если к активной ячейке не примыкает ни одной - выделяется весь лист.
 
Ликсеич, не учите плохому начинающих :) SendKeys метод не надежный, а в данном конкретном случае весьма избыточный, т.к. уже есть абсолютно тоже самое встроенными методами:
Код
ActiveCell.CurrentRegion.Select
'или
Selection.CurrentRegion.Select
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков Здравствуйте
Цитата
Ликсеич, не учите плохому начинающих
А мы и не будем учится
 
Был задан конкретный вопрос:
Цитата
как реализовать функцию "выделить все" (Ctrl+A) в макросе экселя?
Ну, а потом почему-то начались пляски с бубном вокруг, да около...
Предложенные функции... да, очень похожи, но всё же не ответ на ЗАДАННЫЙ вопрос, а неточные ответы... это как перепрыгнуть пропасть на 99%. (МЛМ)
Что же касается обучения молодёжи... мой опыт показывает, что они никогда не слушают, что им говорят. Они всегда смотрят, что делают старшие. Так что научить плохому их можно только личным примером  ;)  
 
Цитата
Ликсеич написал:
но всё же не ответ на ЗАДАННЫЙ вопрос, а неточные ответы... это как перепрыгнуть пропасть на 99%
А если спросят как создать новую книгу в макросе, типа как Ctrl+N - тоже будете вызовом клавиш Ctrl+N советовать делать? :) А копирование и вставка диапазона - Ctrl+C -> Ctrl+V - тоже будем сочетаниями проделывать, т.к. встроенные методы Copy и Paste не на 100 процентов отвечают на вопрос "А как в макросе сделать тоже, что делает сочетание этих клавиш?" :) Не путайте людей и не давайте вредных советов.
Приведенные ответы с CurrentRegion именно на 100% отвечают на поставленный вопрос и более грамотно и стабильно решают задачу, чем вызов нажатия клавиш на клавиатуре.
Цитата
Ликсеич написал:
а потом почему-то начались пляски с бубном вокруг, да около
Пляски с бубном как раз Ваши сочетания. А CurrentRegion делает ровно то, что делает вызов сочетания Ctrl+A, только более стабильно и не зависит от того, будет в текущий момент на экране лист Excel или другое приложение.
Представьте себе код не в одну строку, а более длинный и долгий, может на минуту-другую(ну всякое бывает). И вот человек, которому Вы так убедительно посоветовали сочетание клавиш для выделения диапазона, прислушался к Вашему "профессиональному" совету. А далее происходит следующее: код выполняется достаточно долго и пользователь(естественно) после его запуска просто продолжает делать другую работу, чтобы время не терять. Например, заполнять бланки в Word. И пока он заполняет и что-то пишет, копирует, вставляет - наш код работает. И вот он дошел до Вашей чудо-строки и...Правильно - Ctrl+A сработали безукоризненно - выделили весь текст в окне приложения, которое на данный момент на экране. Т.е. весь текст приложения Word. Но никак не ячейки на листе. Ну и каким словом Вас после этого вспомнят с Вашим 100% ответом? :)
Если не верите - можете проверить.
Код
Sub ВыделитьЧерез10Секунд()
    Application.OnTime Now + TimeSerial(0, 0, 10), "Выделить"
End Sub
Sub Выделить()
Application.SendKeys ("^a") '( Ctrl + a )
End Sub
Выполните код "ВыделитьЧерез10Секунд" и перейдите в любое другое приложение, хотя бы сюда на форум. И посмотрите, что у Вас в итоге будет выделено в браузере, а что в Excel через 10 секунд.
Именно поэтому сочетания клавиш не рекомендуется к использованию. Потому что макросы пишут для автоматизации рутины и во время их выполнения человек вполне может делать совершенно иные задачи.
Изменено: Дмитрий(The_Prist) Щербаков - 10.11.2023 08:32:22
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 

Здравствуйте

Я хотел бы дополнить немного к сообщению Дмитрия. Дело в том, что в разных версиях эксель действия на сочетания клавиш могут отличаться. Например в эксель 2002 Ctrl+A всегда выделит весь лист, а в эксель 2010 если активная ячейка не входит в CurrentRegion выделится весь лист, если входит то выделится CurrentRegion. Поэтому Ликсеич, чтобы использовать ваш код, надо еще проверять какая версия эксель.

 
Цитата
А если спросят как создать новую книгу в макросе, типа как Ctrl+N - тоже будете вызовом клавиш Ctrl+N советовать делать?
Смотря как будет задан вопрос.

Цитата
Не путайте людей и не давайте вредных советов.
1. Слышали пословицу: «Не говори мне, что делать и я не скажу куда тебе сходить» ?) Так вот это тот самый случай, когда к даче советов нужно относиться со всей возможной тщательностью !)
2. Стиль программирования - вопрос концептуальный.
3. Про «вредность» забыли добавить МЛМ (моё личное мнение) поскольку это, действительно, всего лишь Ваше личное мнение (если не согласны - смотрите п.2).

Цитата
Приведенные ответы с CurrentRegion именно на 100% отвечают на поставленный вопрос
ВЛМ.

Цитата
Пляски с бубном как раз Ваши сочетания.
Вы до сих пор пользуетесь детсадовской присказкой «Сам дурак» ?))

Цитата
А CurrentRegion делает ровно то, что делает вызов сочетания Ctrl+A,
Прошу прощения, но если Вы действительно так считаете - позволю себе усомниться в Вашей компетенции.

Цитата
Представьте себе код не в одну строку, а более длинный и долгий, может на минуту-другую
Во-первых, не надо плодить дополнительных сущностей. Человек ни словом не обмолвился про длину кода и прочие сопутствующие.
И, во-вторых, люди задающие такие (достаточно простые) вопросы - не пишут портянок. Так что не надо подвешивать к простой задаче: «А, вот еже ли...»

Цитата
Вы так убедительно посоветовали
Опять плодите то, чего нет ?)
Где Вы убедительность узрели? Форум существует не для того, чтобы Гуру разных мастей навязывали свой «единственно правильный» образ мысли, а как раз для сбора информации из разных источников, что и позволяет человеку, задавшему вопрос выбрать инструмент по своей руке.

Цитата
к Вашему "профессиональному" совету
Завидую вашей плодовитости, чесслово !)
Не вешайте мне чужих регалий.)  Я всего лишь один из пользователей этой замечательной программы. И, к слову, напомню, «Профессионал» совсем не означает «Специалист»...  Хотя, по Вашим приближённым оценкам - «типа», возможно, это одно и то же ,)

Цитата
Ну и каким словом Вас после этого вспомнят
Если человек обижается на заборного художника, а не на себя, сломавшего 5 лопат в поисках за забором того, чего там написано - это уже к доктору. Хотя, чего греха таить, все мы любим переложить вину на других. Но, право слово, не надо за меня переживать, я как-нибудь это сдюжу.)

А вот за «Application.OnTime Now + TimeSerial(0, 0, 10)» Благодарствую.
Правда, с 94-го года подобная функция ещё ни разу не пригодилась, но, на всякий случай в копилочку брошу.

Цитата
в разных версиях эксель действия на сочетания клавиш могут отличаться.
А, давайте попробуем подумать ещё хотя бы на пол шажочка вперёд.
Если человек привёл в качестве примера именно это сочетание клавиш, как Вы думаете, оно его устраивает?
Вы отвечаете на конкретный вопрос или раздаёте советы всем огульно?
Осмелюсь Вас разочаровать: таблеток для всеобщего счастья не бывает !)
Изменено: Ликсеич - 11.11.2023 01:15:21
 
Ликсеич
Цитата
А, давайте попробуем подумать ещё хотя бы на пол шажочка вперёд.
Если человек привёл в качестве примера именно это сочетание клавиш, как Вы думаете, оно его устраивает?

А давайте попробуем подумать хотя бы на пол шажочка назад. Автор темы просто не знал как объяснить, что ему надо. Единственное он знал, что сочетание Ctrl+A выделяет текущую область (видимо у него была свежая версия эксель) но при попытке записать макрорекордером ничего не записывается. (Иногда при написании кода, когда не знаешь как называется оператор это помогает). Но он не знал (как и вы), что сочетание клавиш для выделения текущей области Ctrl+Shift+* (работает во всех версиях). Если бы знал, то не было бы и данной темы. Просто макрорекордером записал свой действия на листе и в коде нашел CurrentRegion. Поэтому исправьте в сообщении №11 сочетания клавиш, вдруг кому-то пригодиться.

 
Ликсеич, как Вас понесло...Не хотите понимать то, о чем я написал - не понимайте, это Ваше дело. Продолжайте думать дальше, что Ваш совет единственно верный из всех прозвучавших здесь, а все остальные ответы пляски с бубном:
Цитата
Ликсеич написал:
Ну, а потом почему-то начались пляски с бубном вокруг, да около..
Предложенные функции... да, очень похожи, но всё же не ответ на ЗАДАННЫЙ вопрос, а неточные ответы... это как перепрыгнуть пропасть на 99%. (МЛМ)
Прям отсюда уже вижу, как всплывает вопрос, на который Вы ответите "точно в цель", а все остальные будут танцами с бубном : )
Цитата
Помогите, у меня в ячейках числа записаны как текст. Мне их надо преобразовать в реальные числа. Я это делаю так: выделяю каждую ячейку -жму F2 затем Enter. Данные в ячейках меняют тик. Как сделать это макросом?
больше говорить не о чем при подобном подходе. Вы больше на тролля похожи, чем на человека, который помочь хотел.
Изменено: Дмитрий(The_Prist) Щербаков - 13.11.2023 10:16:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх