2009-07-10 219 views
4

我在將各種數據源的數據粘貼到Excel中時遇到了一些嚴重的問題。 Excel往往會試圖變得聰明,並會進行各種愚蠢的格式化。我們需要數據作爲文本。Excel VBA宏:檢查粘貼前的內容(剪貼板?)

問題是我們有很多用戶,他們中的很多人對計算機不是很有經驗,所以要求他們每次都使用右鍵單擊和「選擇性粘貼」不是一種選擇。

我在錄製使用'Paste Special'和'text'宏並重寫ctrl-v以使用此函數的宏中找到了解決方案。它似乎完美地工作,直到我標記了一個單元格,複製它並試圖粘貼它。宏墜毀。

所以我需要的是一個可以檢查是否我想粘貼一些複製的文本,然後使用該行的函數:

ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:= _ 
     False 

雖然如果我粘貼標記的單元,我想運行這條線(粘貼只值):

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

我不是很書面的VBA宏爲Excel(我希望我永遠也不會),因此,如果任何人有幾個三分球經歷,我會非常感謝。

回答

3

對於剪貼板訪問/操作,您需要在Project-> References中添加對Microsoft Forms 2.0庫的引用。然後,您可以使用MSForms.DataObject類(其中包含)GetFormat方法來檢查剪貼板是否具有特定類型的數據。

This是使用DataObject進行剪貼板處理的不錯介紹。

+0

我Excel2013 Win7上(64)(64位)沒有列出Microsoft窗體2.0庫。我必須選擇工具/參考/瀏覽...並選擇c:/windows/system32/FM20.DLL文件。然後才能夠使用數據對象類型。 – Whome 2014-09-10 09:39:52

0

您是否考慮過讓目標工作表中的單元格等於文本?當他們是General時,Excel是最好的 - 猜測你期望看到什麼。

上,如果你真的想要實現選擇性粘貼另一方面...

沒有「粘貼」事件中,你能趕上 - 你必須趕上到可能發生糊的每一個地方。

例如,您可以捕獲CTRL-V按鍵,如果你在工作簿啓動(Workbook_Open)發出以下代碼:

Application.OnKey "^v", "DoMyPaste" 

這將調用你的函數,而不是Excel的粘貼功能。把這樣的東西放在一個模塊中:

Public Sub DoMyPaste() 
    If Selection.[is marked cell] Then 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Else 
     ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon _ 
     := False 
    End If 
End Sub 

我還沒有測試過這個,這是一個粗略的草圖。請注意,選擇可能不止一個單元格,因此您的「檢查標記單元格」需要以某種方式檢查整個範圍。

雖然這只是冰山一角。如果你想一個完整的解決方案,你應該看看這篇文章,這是捕獲所有粘貼通話的OCD版本:

http://www.jkp-ads.com/Articles/CatchPaste.asp 
0

這是不是最好的解決方案,但它在技術上的作品。 只需嘗試一下。

On Error Resume Next 
ActiveSheet.PasteSpecial Format:=Text, Link:=False, DisplayAsIcon:=False 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
1
Sub PasteAsText() ' Assign Keyboard Shortcut: Ctrl+v 
    Application.ScreenUpdating = False 
    Select Case Application.CutCopyMode 
     Case Is = False 
       On Error Resume Next 
       ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False 
     Case Is = xlCopy 
      If Not Range(GetClipboardRange).HasFormula Then 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
      Else 
       ActiveSheet.Paste 
      End If 
     Case Is = xlCut 
      ActiveSheet.Paste 
    End Select 
    Application.CutCopyMode = False 
    Application.ScreenUpdating = True 
End Sub 

Function GetClipboardRange() As String 
    ' Edited from http://www.ozgrid.com/forum/showthread.php?t=66773 
    Dim formats 'Check to make sure clipboard contains table data 
    formats = Application.ClipboardFormats 
    For Each fmt In formats 
     If fmt = xlClipboardFormatCSV Then 
      Application.ActiveSheet.Paste Link:=True 'Paste link 

      Dim addr1, addr2 As String 'Parse formulas from selection 

      addr1 = Application.Substitute(Selection.Cells(1, 1).Formula, "=", "") 
      addr2 = Application.Substitute(Selection.Cells(Selection.Rows.Count, Selection.Columns.Count).Formula, "=", "") 

      GetClipboardRange = addr1 & IIf(addr1 <> addr2, ":" & addr2, "") 
      Exit For 
     End If 
    Next 
End Function