2013-05-17 3 views
0

Я относительно новым для УВЫ, поэтому, пожалуйста, быть нежным :)VBA Excel - сохранить ячейку назначения форматирования

Я рассмотрел различные сценарии, которые якобы сохраняют форматирование ячеек таблицы при CtrlʙC,/Ctrl v или копии & паста используется. К сожалению, я не могу представить какие-либо из вариантов, чтобы работать для моих намерений. Полагаю, это может быть связано с тем фактом, что много копируемых данных & копируется из других программ и вставляется в рабочий лист (поэтому копирование и сохранение форматирования программы, из которой он пришел). Все макросы, с которыми я пытался работать со всеми, похоже, пытаются сохранить форматирование при копировании между ячейками/рабочими листами или книгами и не обращаются к формату данных при копировании из другой программы.

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

Вот пример кода, но он не работает для меня. Я получаю:

не может запустить макрос «C: '! MyPaste. ... Test.xlsm Макрос не может быть доступен в этой книге или все макросы могут быть отключены

Макросы, безусловно, включены и код вставлен в [ThisWorkbook (код)]

Option Explicit 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim UndoList As String 

    Application.ScreenUpdating = False 
    Application.EnableEvents = False 

    On Error GoTo Whoa 

    '~~> Get the undo List to capture the last action performed by user 
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1) 

    '~~> Check if the last action was not a paste nor an autofill 
    If Left(UndoList, 5) <> "Paste" And UndoList <> "Auto Fill" Then GoTo LetsContinue 

    '~~> Undo the paste that the user did but we are not clearing the clipboard 
    '~~> so the copied data is still in memory 
    Application.Undo 

    If UndoList = "Auto Fill" Then Selection.Copy 

    '~~> Do a pastespecial to preserve formats 
    On Error Resume Next 
    '~~> Handle text data copied from a website 
    Target.Select 
    ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False 

    Target.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    On Error GoTo 0 

    '~~> Retain selection of the pasted data 
    Union(Target, Selection).Select 

LetsContinue: 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 
+2

Что/где макрос 'MyPaste', упомянутый в сообщении об ошибке? –

+1

ActiveSheet.PasteSpecial xlPasteValues ​​ –

+0

Я все еще не могу заставить это работать :( – user2292941

ответ

1

Причиной сообщения об ошибке в том, что ваш код обработчика событие с

см:

и

в основном Worksheet.Change Event (Excel) обжигают когда пользователь меняет ячейку на листе. Excel проходит в объекте Worksheet Object как sh и Range Object (Excel) как Цель. Затем ваш код использует эти objects (Ozgrid Excel VBA Crash Course Занятие 4 - Общие объекты).

, как David Zemens предложил, вам нужно использовать PasteSpecial метод лист объекта. для получения дополнительной информации см. MSDN libray: PasteSpecial Method [Excel 2003 VBA Language Reference].

и когда вы закончите все, что чтение, вы будете готовы скопировать вставить свой код ниже:

Option Explicit 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim UndoList As String 

    Application.ScreenUpdating = False 
    Application.EnableEvents = False 

    On Error GoTo Whoa 

    '~~> Get the undo List to capture the last action performed by user 
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1) 

    '~~> Check if the last action was not a paste nor an autofill 
    If Left(UndoList, 5) <> "Paste" And UndoList <> "Auto Fill" Then GoTo LetsContinue 

    '~~> Undo the paste that the user did but we are not clearing the clipboard 
    '~~> so the copied data is still in memory 
    Application.Undo 

    If UndoList = "Auto Fill" Then Selection.Copy 

    '~~> Do a pastespecial to preserve formats 
    On Error Resume Next 
    '~~> Handle text data copied from a website 
    Target.PasteSpecial Paste:=xlPasteValues 
    On Error GoTo 0 

    '~~> Retain selection of the pasted data 
    Target.Select 

LetsContinue: 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

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

+0

Я ценю информацию, а также скорректированный код. Основываясь на ваших объяснениях и приведенных вами ссылках, я вижу, где мое недоразумение вызвало проблему. Еще раз спасибо :) – user2292941

Смежные вопросы