Как скопировать величину суммы выделенных мышью ячеек в буфер обмена

Автор alexexcel, 05.05.2012, 00:38

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

alexexcel

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

Макрос должен инициироваться сам: как только происходит выделение более чем одной ячейки, их сумма должна копироваться в буфер обмена.

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

Poltava

ЦитироватьМакрос должен инициироваться сам: как только происходит выделение более чем одной ячейки
А где вы хотите проверять ??? Я конечно не претендую на истину в последней инстанции, но я бы повесил на каждом листе в котором нужно проверку события по SelectionChange ссылку на вызов нужной процедуры из стандартного модуля
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

alexexcel

Честно говоря я не совсем понял Ваш вопрос и предложение. Но этот макрос должен действовать на одном листе (других там не будет) одного определенного файла. Так что даже пожалуй отпадает необходимость включать и выключать макрос. Пока этот файл открыт, он в нем должен действовать. Такой ответ что-то проясняет?

Poltava

Кое что но не все
Что делать с пустыми ячейками ???
что делать если выделены не только цифры ???
Ну а пока сделал как понимал. На эксперта или хотя бы мало мальски понимающего в программировании не претендую так что если вам предложат что то лучше попрошу не гневиться.
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

alexexcel

Великолепно получилось! Спасибо. Но только я перенес Option Explicit в свой файл в раздел VBAproject (название файла) в раздел This workbook или в раздел Sheet 1, и он не работает. Куда его надо перенести, чтобы он работал?

(Пустые ячейки - равны нулю. Если текст или еще какие-то проблемы, просто очистить буфер обмена. Но это уже не так важно.)

Poltava

Ну смотря что и как не работает :) Давайте больше конкретики в вопросах и ответы будут точнее!!! Пока попробую по порядку разобрать ваш вопрос

Цитироватья перенес Option Explicit в свой файл
Option Explicit - это директива говорящая компилятору что все переменные ОБЯЗАТЕЛЬНО ДОЛЖНЫ БЫТЬ ОБЪЯВЛЕНЫ как зачем и почему это нужно смотри здесь Variable not defined или что такое Option Explicit и зачем оно нужно? Так что если у вас ошибка Variable not defined то либо уберите эту строчку либо объявите переменную.

Цитироватьв раздел This workbook или в раздел Sheet 1,
Процедура
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
..............
End Sub
и есть процедура которая отслеживает событие "Изменение выделения на листе" в модуле которого эта процедура расположена. Вывод она обязательно должна находиться в модуле того листа где вам нужно отлавливать выделение а не как не в workbook подробнее здесь Что такое модуль? Какие бывают модули?
ЦитироватьКуда его надо перенести
Две процедуры
Public Sub PutOnClipboard(Obj As Variant)
Public Sub ClearClipboard()
Это процедуры отвечающие за копирование объекта в буфер обмена и очистку буфера соответственно (я не автор этих процедур посему ссылка на оригинал ТЫЦ). Их по сути можно располагать где угодно удобнее всего в стандартном модуле чтоб можно было обратиться отовсюду. но если у вас один лист и процедуры будут использоваться только там то смело их там и располагайте. что я в принципе и сделал. Ну а процедура Worksheet_SelectionChange как говорил выше должна находиться именно на том листе где вы хотите отследить изменения.
При этом если процедуры копирования и очистки используются только один раз раз как в вашем случае то от них как от отдельных процедур можно уйти вообще вписав их код в то место откуда они вызваны.

Цитироватьчтобы он работал?
Если же у вас ошибка User-defined type not defined то это означает что необходимо подключить библиотеку Microsoft Forms 2.0 Object Library. Как да очень просто!!! если еще ни одной формы(UserForm) в проекте не создано - то просто создать новую форму и если в дальнейшем не нужна - удалить. При создании первой формы в проекте данная библиотека подключается автоматически.

PS: писал быстро потому что нужно было убегать посему нмже дам кое какие коментарии
If Target.Cells.Count < 2 Then Exit Sub

Проверяем выделено ли больше одной ячейки
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Отключаем реакцию на отслеживание изменений
Application.EnableEvents = False
Примечание Если код завершен с ошибкой то реакция на события так и останется отключенной, потому больше никакие события в том числе и выделение не будут отслеживаться. Для устранения данной проблемы я запускал процедуру специально записанную в модуль.
Sub вкл_реакцию()
    Application.EnableEvents = True
End Sub
включаем бработку ошибок (на случай если в диапазон попали не только числа)
On Error GoTo Error:
Перебираем все НЕ ПУСТЫЕ ячейки в диапазоне
    For Each tCell In Selection.SpecialCells(xlConstants, 23)
        Temp = Temp + tCell.Value
    Next tCell
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.