Страницы: 1
RSS
VBA как узнать сколько ячеек скопировано без вставки их на лист?
 
Приветствую всех!
Предыстория вопроса. Писал обработку двойного клика, чтобы вставить в целевую ячейку только значение скопированной ячейки. И, как всегда, я подумал о нежелательной ситуации.
Допустим дрогнула рука и я скопировал не одну ячейку, а несколько и не заметил этого. Тогда по событию:
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Application.CutCopyMode = xlCopy Then Target.PasteSpecial xlPasteValues: Cancel = True
End Sub
будет заполнена значениями скопированного не одна ячейка, а диапазон размером аналогичный скопированному диапазону и отменить это действо нельзя будет.

Отсюда вопрос, как узнать сколько ячеек скопировано без вставки их на лист?

Конечно можно перестраховаться таким подходом:
Код
Option Explicit

Function ClipboardText() ' чтение из буфера обмена
' source: http://excelvba.ru/code/clipboard
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
End Function

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Application.CutCopyMode = xlCopy Then Target.Value = ClipboardText: Cancel = True
End Sub
но желательно получить ответ на свой вопрос.
Всем спасибо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Копировалось выделенное?
Код
Dim r As Range, i As Long
    Set r = Selection
    i = r.Cells.Count

Или без r...
 
При копировании нескольких ячеек в буфер обмена функция из #1 вернет их значения, разделенные знаком табуляции (vbTab).
Владимир
 
vikttur, простите, если я неясно донёс свою мысль. Копирую ячейку я вручную с одного документа (обязательное условие - копирование вручную), переключаюсь в другой документ и чтобы не делать вставку только значения через контекстное меню или меню, то на двойной клик вешаю вставку только значения.
+++
sokol92, спасибо. Вашу мысль понял.
+++
sokol92, увы, если выделить несколько ячеек внутри одного столбца, то символа vbTab в буфере обмена не будет. Но идеи с vbTab для моего случая достаточно. Спасибо. _/\_
Изменено: JayBhagavan - 27.11.2018 14:42:48

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Вылез нюанс. Если скопировать ячейки, допустим, A1:B1 (A1 не пустая, а B1 пустая), то в буфере обмена vbTab не будет, но будет vbLf. В общем, есть над чем подумать...

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
если выделить несколько ячеек внутри одного столбца, то символа vbTab в буфере обмена не будет.
В конце строки диапазона формируется vbCrLf: Chr(13)+Chr(10).  Между двумя ячейками одной строки (в том числе, возможно, пустыми) vbTab должен быть. Так можно посмотреть коды символов:
Код
Function ClipboardText() ' чтение из буфера обмена
    Dim i As Long
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
    For i = 1 To Len(ClipboardText)
        Debug.Print i, Asc(Mid(ClipboardText, i, 1))
    Next i
End Function
Изменено: sokol92 - 27.11.2018 16:46:25
Владимир
 
Без копирования, полагаю, узнать будет сложно. Но вот можно сделать нечто вроде такого:
Код
Sub Main()
    MsgBox IsCopyOneCell
End Sub
Function IsCopyOneCell()
    Dim ss As String
    
    Application.EnableEvents = False
    ss = Selection.Address
    Err.Clear
    On Error Resume Next
    Cells(Rows.Count, Columns.Count).PasteSpecial xlPasteAll
    IsCopyOneCell = Not (Err.Number = 1004)
    Cells(Rows.Count, Columns.Count).Value = Empty
    With ActiveSheet.UsedRange: End With
    Range(ss).Select
    Application.EnableEvents = True
End Function
при этом лист для тестовой вставки может быть любой(даже лучше, если это будет некий скрытый лист)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
sokol92, полагаю, что всегда у нас будет шанс попасть на ситуацию, когда в самой ячейке текст содержит символы переноса(мало ли откуда в ячейку инф-цию копировали). Скорее всего это редкость, но....
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо за предложенный вариант. Логика его мне понятна.

Возможно у кого-нибудь появится идея, как получить объект Range, если скопированы ячейки? (эксель же в курсе, если можно вставить связь с скопированными ячейками через спец. вставку)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Excel  в курсе, потому что это его личный буфер. Насколько я знаю доступ к нему несколько ограничен извне и получить всю инф-цию проблематично даже через API.
Изменено: Дмитрий(The_Prist) Щербаков - 27.11.2018 18:03:51
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
В общем, зацепила меня эта тема. Похожие вопросы были на аглицких форумах. Хотя у мня по аглицкому 3 с минусом и с API я знаком только по чужим кодам, то из нарытого слепил данное чудовище:
функция

В общих чертах, если скопированы ячейки в текущем сеансе экселя, то ищем данные в буфере обмена в формате XML, например когда скопировали диапазон 2 на 2 пустые ячейки, то в XML это выглядит так:
Скрытый текст
если нашли, то их помещаем в строковую переменную, а из строковой переменной получаем числа через Split() из строки, например:
Код
 <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="2"
Перемножаем столбцы на строки и получаем кол-во ячеек в скопированном диапазоне.
В принципе всё.

Если у гуру будут идеи, какие ещё можно получить данные о скопированных в буфер обмена ячейках, буду рад их услышать. Всем спасибо.
Изменено: JayBhagavan - 28.11.2018 17:18:05

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх