2013-05-17 60 views
0

我是比较新的VBA,所以请温柔:)VBA擅长 - 保存目的地单元格格

我已审查据称保存在电子表格时CTRL C/CTRL V或复制单元格的格式各种脚本正在使用粘贴&。不幸的是,我似乎无法得到任何变化来为我的意图工作。我想这可能是由于粘贴的&拷贝的许多数据正在从其他程序复制并粘贴到工作表中(因此复制并保留它所来自的程序的格式)。我尝试使用的所有宏似乎都试图在单元格/工作表或工作簿之间进行复制时保留格式,并且在从另一个程序复制时不解决数据格式问题。

我正在寻找替代方法。从逻辑的角度来看,我认为在ctrl v或粘贴事件上应该有一种方法,将复制的数据存储为变量,并将其格式化并仅粘贴原始值。我尝试过使用pastespecial,但我不确定如何强制使用pastespecial(或用pastespecial替换paste)。

这是一些代码示例,但它似乎并不适合我。我不断收到:

无法运行宏“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对象shRange Object (Excel)作为目标。然后您的代码使用这些objectsOzgrid Excel VBA速成课程第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