Как: разрешить пользователям вставлять ячейки из другого экземпляра Excel (Ctrl + V, ...), но вставлять только значения - PullRequest
0 голосов
/ 08 октября 2019

РЕДАКТИРОВАНИЕ С ПРОГРЕССОМ

Уважаемое сообщество Stackoverflow,

Я работаю над большим файлом Excel, который выполняет некоторые вычисления для меня и моих коллег. Поскольку данные расчета много и вводятся в диапазонах (например, «A1: H8»), а не в отдельных ячейках (например, «A1», «C1», ...), я хочу, чтобы пользователи могли копировать данные изтот же или другой экземпляр Excel для моего файла.

Проблема (отредактированная):

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

Код:

Это код, который я использую в "ThisWorkbook":

Sub PasteValuesOnly()
'if cells are pasted in named worksheets, only values are pasted
'is linked to Ctrl+V in options of macro menu

On Error GoTo err_handler

    Dim Target As Range

    Set Target = Selection

    If Target.Parent.Name <> "Table1" Then

        Selection.PasteSpecial

    Else

        Selection.PasteSpecial Paste:=xlPasteValues

    End If

err_handler:
    Exit Sub
End Sub

Система:

  • Windows 7
  • Excel 2010

Что я пробовалкроме моего кода (новый прогресс):

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

Что бы помочь (отредактировано):

Было бы очень полезно, если бы вы могли сказать мне, какоптимизировать мой код, чтобы он работал и для двух экземпляров. Если вы знаете, что делать, когда у меня возникает ошибка с UndoList = Application.CommandBars(“Standard”).Controls(“&Undo”).List(1) в решении Сиддхарта Раута с Excel 2010, это также будет полезно. В противном случае мне бы хотелось, чтобы каждое решение вставлялось так, чтобы мои пользователи вставляли, как они это делают, но не позволяло им форматировать ячейки при вставке.

Заранее спасибо

RaspiManu

1 Ответ

0 голосов
/ 18 октября 2019

После долгих часов поиска в Интернете я нашел решение Донны Лэнди (Bella_Donna) на форуме Microsoft. Ее код прост и работает для CTRL + C / CTRL + V, Копировать и Вставить в Меню правого клика, Drag'n'Drop и даже с двумя экземплярами Excel.

Поскольку он запускается при каждом изменении ячейки ивозвращается к ячейке или диапазону, который был изменен, я немного оптимизировал его для своих нужд. Теперь пользователям, которые вводят список вручную, не нужно будет нажимать «Ввод» два раза каждый раз, они хотят перейти к следующей строке ниже.

Предполагается, что обычный пользователь обычно копирует и вставляет, еслиесть диапазон данных, он или она не хочет перепечатывать, я изменил код, поэтому модуль sub активируется, только если было изменено более одной ячейки (см. ниже).

Решение:

На каждом рабочем листе, который должен быть защищен от форматирования (изменено):

Private Sub Worksheet_Change(ByVal Target As Range)
'activates format protection when changing a range

    If Target.Cells.Count > 1 Then                      'If more than one cell has been changed...
        Call Worksheet_Change_Protected(Target)         '...activating protection
    End If

End Sub

В модуле (без изменений):

Sub Worksheet_Change_Protected(ByVal Target As Range)

    'Prevents user blithely obliterating in-cell formatting by undoing their paste and pasting the value

    'Donna Landy 26.11.2018

    'May be freely copied - hat tip appreciated :)

    Dim SavedVal As Variant

    On Error GoTo ErrHan

    'Save the pasted value for later

    SavedVal = Target.Value

    'Switch off events to prevent infinite loop

    Application.EnableEvents = False

    'Undo the user's paste

    Application.Undo

    'Set target value

    Target.Value = SavedVal

ErrExit:

    'Remember to re-enable events

    Application.EnableEvents = True

    Exit Sub

ErrHan:

    Resume ErrExit

End Sub

Большое спасибо, Донна Лэнди!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...