Предотвратить очистку скопированных данных для вставки в Excel после определённых операций без использования буфера обмена Office.

Вопрос или проблема

Каждый раз, когда вы копируете ячейку или диапазон ячеек в Excel (у меня версия 2010 на Windows 7), а затем делаете что-то еще, например, вставляете новую строку в лист или просто редактируете другую ячейку, Excel очищает буфер обмена. Для меня это кажется совершенно глупым и очень раздражающим (возможно, за этим стоит какая-то логика, например, сохранение ссылок или что-то в этом роде, но я не думаю, что это была бы сложная задача сделать это так, как это реализовано в любой другой программе с функцией Копировать-Вставить).

Единственный способ обойти это — использовать буфер обмена Office, но я не хочу этого (это занимает место на экране и это гораздо менее удобно, чем CTRL+V), и я не думаю, что должен быть вынужден это использовать.

Вот ссылки на несколько сообщений, которые также жалуются на эту проблему:

Как сделать так, чтобы Excel сохранял содержимое своего буфера обмена

Excel 2010 очищает данные из буфера обмена, как я могу остановить это?

Есть ли способ заставить Excel оставить мои данные в буфере обмена до тех пор, пока я не решу, что они мне больше не нужны, вместо того чтобы это происходило без использования раздражающего (для меня) буфера обмена Office? Может быть, с использованием буфера обмена Windows.

Или хотя бы вы могли бы объяснить мне, почему это происходит (я знаю, что это нормальное поведение, но почему?)

Ответ, к сожалению, нет, вы не можете остановить это.

Как объяснил Джоэл Спольский, разработчик и менеджер по программам Excel:

Официальная причина в том, что в Excel на самом деле нет функции вырезания и вставки, есть перемещение и копирование. Это необходимо, потому что Excel автоматически исправляет ссылки. Например, если ячейка A2 определена как =A1, и вы переместите ячейку A1 в A3, ячейка A2 будет обновлена на =A3.

Если бы Excel действительно вырезал вещи в буфер обмена, вам как-то нужно было бы иметь ссылку, указывающую >внутрь< буфера обмена, что является странным и для чего нет разумного синтаксиса. Другими словами, Excel не хочет оставлять вас с висячими ссылками во время операции перемещения и не уверен, что сможет правильно исправить их, когда вы завершите перемещение, выбрав “Вставить”.

Джоэл Спольский 3/9/2004

источник

Что это означает, так это то, что из-за сложности, присущей тому, как Excel поддерживает ссылки, в момент разработки не было хорошего способа сохранить эти ссылки за пределами Excel и сделать их динамическими для повторного вставления. Как только вы меняете фокус, способность Excel сохранить ваши оригинальные ссылки теряется.

К сожалению, Microsoft не считает это ошибкой.

Вы можете попробовать некоторые приложения для управления буфером обмена, такие как Ditto, вот ссылка Ditto

Вы не можете остановить это, но есть обходной путь

В Windows 10 (и я предполагаю, в Windows 11 тоже) вы можете нажать Win + V вместо Ctrl + V. Это вызывает всплывающее окно с 25 последними элементами в буфере обмена. Вы можете перемещаться с помощью прокрутки или стрелок вверх и вниз, и вы можете выбрать элемент для вставки с помощью Enter или клика мыши.

Использовать что-то другое в Excel может быть неудобно, но это может быть проще, чем устанавливать приложение для управления буфером обмена.

Вы можете использовать макрос copyAsPlain, упомянутый ниже, и также вы можете назначить ему сочетание клавиш, например, Ctrl + Shift + C.

(У него есть другой результат, который некоторые могут считать полезным: Он всегда вставляет как простой текст без необходимости использовать ‘Специальная вставка’ или ‘Вставить значения’ и также правильно вставляется во все другие приложения, такие как Telegram.)

Sub copyAsPlain()
Dim sel As Range, out As String, rng2 As Range
Set sel = Selection

If sel.Cells.Count > 1 Then
    If sel.Columns.Count = 1 Then
        For Each rng2 In sel.Rows
            out = out & rng2.Value & vbNewLine
        Next
    Else
        For Each rng2 In sel.Rows
            out = out & WorksheetFunction.TextJoin(vbTab, False, rng2) & vbNewLine
        Next
    End If
Else
    out = Selection.Value
End If

' Лучше не добавлять с новой строки, аналогично тому, когда мы копируем значение ячейки
If Right(out, 2) = vbCrLf Then
    out = Left(out, Len(out) - 2)
End If
If Right(out, 1) = vbCr Or Right(out, 1) = vbLf Then
    out = Left(out, Len(out) - 1)
End If

If out = "" Then
    MsgBox "Нечего копировать.", vbExclamation
Else
    Clipboard out
End If
End Sub

Function Clipboard(Optional StoreText As String) As String
'ЦЕЛЬ: Чтение/запись в буфер обмена
'Источник: ExcelHero.com (Дэниел Ферри)

Dim x As Variant

'Сохранить как вариант для поддержки 64-битного VBA
x = StoreText

'Создать объект HTMLFile
  With CreateObject("htmlfile")
    With .parentWindow.clipboardData
      Select Case True
        Case Len(StoreText)
          'Записать в буфер обмена
            .setData "text", x
        Case Else
          'Прочитать из буфера обмена (без передачи переменной)
            Clipboard = .GetData("text")
      End Select
    End With
  End With
End Function

Ответ или решение

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

Проблема и её причины

Когда вы копируете ячейку или диапазон ячеек в Excel (версия 2010 под Windows 7), и затем выполняете какие-либо действия, такие как добавление новой строки или редактирование другой ячейки, данные буфера обмена очищаются. Это связано с тем, что Excel не предоставляет полноценную функцию "резать" и "вставлять", а использует механизм "перемещения" и "копирования". Когда вы перемещаете ячейку, гаджет автоматически обновляет ссылки, чтобы избежать неоднозначностей.

По мнению разработчиков, данное поведение минимизирует риск появления "висячих ссылок", и это объясняет, почему Excel не может сохранить данные в буфере обмена после выполнения дополнительных операций. Из-за этого, Excel не позволяет сохранить данные так, как это делают многие другие программы.

Возможные решения

Хотя полного решения этой проблемы не существует, вам могут помочь следующие подходы.

1. Использование макроса для копирования

Вы можете использовать макрос, который будет осуществлять копирование текстовых данных в стандартный буфер обмена Windows. Этот подход позволяет обойти неудобства, возникающие при использовании буфера обмена Office. Приведенный ниже код делает именно это:

Sub copyAsPlain()
    Dim sel As Range, out As String, rng2 As Range
    Set sel = Selection

    If sel.Cells.Count > 1 Then
        If sel.Columns.Count = 1 Then
            For Each rng2 In sel.Rows
                out = out & rng2.Value & vbNewLine
            Next
        Else
            For Each rng2 In sel.Rows
                out = out & WorksheetFunction.TextJoin(vbTab, False, rng2) & vbNewLine
            Next
        End If
    Else
        out = Selection.Value
    End If

    If Right(out, 2) = vbCrLf Then
        out = Left(out, Len(out) - 2)
    End If
    If Right(out, 1) = vbCr Or Right(out, 1) = vbLf Then
        out = Left(out, Len(out) - 1)
    End If

    If out = "" Then
        MsgBox "Nothing to copy.", vbExclamation
    Else
        Clipboard out
    End If
End Sub

Function Clipboard(Optional StoreText As String) As String
    Dim x As Variant
    x = StoreText

    With CreateObject("htmlfile")
        With .parentWindow.clipboardData
            Select Case True
                Case Len(StoreText)
                    .setData "text", x
                Case Else
                    Clipboard = .GetData("text")
            End Select
        End With
    End With
End Function

Вы можете назначить этому макросу комбинацию клавиш, например Ctrl + Shift + C, что упростит процесс копирования.

2. Применение сторонних менеджеров буфера обмена

Хотя ваше желание избежать использования Office Clipboard и его ограничения вполне оправдано, вам стоит рассмотреть возможность использования сторонних менеджеров буфера обмена. Такие программы, как Ditto, позволят вам сохранять копируемые данные и быстро вставлять их по мере необходимости.

Заключение

Ваша фрустрация по поводу работы Excel понятна, и, к сожалению, не существует простого решения данной проблемы из-за особенностей программирования этого приложения. Использование макросов и сторонних инструментов может значительно упростить вашу работу с данными. Надеюсь, приведенные рекомендации будут вам полезны для повышения эффективности работы в Excel. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...