2013-05-17 58 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