2013-10-01 100 views
2

我有一個程序可以複製一系列單元格,並且需要將內容粘貼到代碼中創建的新工作簿中。我可以複製數據,但不知何故,只要我將工作簿更改爲創建的新工作簿,剪貼板就會丟失其數據。我認爲複製單元格到一個數組,然後只是將數組複製到新的工作簿,但我不知道在編碼時數組的大小,幾乎每次宏運行時都會變化。 我如何在剪貼板上保存數據,同時更改活動工作簿?如何在vba中更改工作簿後保留剪貼板數據?

cell = "k7: l" & row 
Worksheets(1).Range(cell).Select 


Selection.Copy 
relpath = ThisWorkbook.Path & "\" & "DispersionList.xls" 

If Dir(relpath) <> "" Then 
    Application.Workbooks.Open (relpath) 
    Workbooks("DispersionList.xls").Activate 
Else 
    Call createWorkbook 
End If 

Worksheets(1).Cells(7, 14).Select 
Selection.PasteSpecial 


End Sub 

,如果我通過行的代碼行運行,並檢查它失去了它的內容剪貼板在workbooks.open線

+1

剪貼板是由Windows維護的,所以你不應該放鬆數據,除非你告訴它。如果可能,請發佈您的代碼。此外,如果您需要動態調整大小,則可以redim array(x,y)。 –

+0

@PortlandRunner這就是我編寫代碼時的推理,但不知何故數據神祕消失,我甚至試圖手動將它粘貼到其他地方,但剪貼板是空的。 – MiniMite

+1

爲什麼不打開1)在打開目標工作簿(應該繞過你遇到的這種奇怪的情況)之後複製所需的範圍**,或者2)使用範圍數組複製或者寫入範圍 - 直接使用範圍值,而不是依賴複製/粘貼方法。同樣,不言而喻,你應該儘可能地去除「選擇」和「主動」方法,通常99%的時間可以被移除。 –

回答

1

有在Excel/VBA的幾個動作是,將失去選擇/剪貼板,例如改變任何窗口/顯示設置。因此,我懷疑在更改工作表/工作簿時會調用某個事件。

您可以對其進行調試,並在逐步完成代碼計算時,在選擇無效時避免此陳述(如果可能)。

或者,在事件代碼中使用以下代碼中的subStoreClipboardsubRestoreClipboard。要使用該代碼,請將其插入到工作表中的新模塊中 - 還要在VBA中插入一個名爲「ws_Temp」的新(隱藏)工作表。

Private mIntCutCopyMode As XlCutCopyMode 
Private mRngClipboard As Range 

Public Sub subStoreClipboard() 
    On Error GoTo ErrorHandler 
    Dim wsActiveSource As Worksheet, wsActiveTarget As Worksheet 
    Dim strClipboardRange As String 

    mIntCutCopyMode = Application.CutCopyMode 

    If Not fctBlnIsExcelClipboard Then Exit Sub 


    Application.EnableEvents = False 

    'Paste data as link 
    Set wsActiveTarget = ActiveSheet 
    Set wsActiveSource = ThisWorkbook.ActiveSheet 

    With ws_Temp 
     .Visible = xlSheetVisible 
     .Activate 
     .Cells(3, 1).Select 
     On Error Resume Next 
     .Paste Link:=True 
     If Err.Number Then 
      Err.Clear 
      GoTo Finalize 
     End If 
     On Error GoTo ErrorHandler 
    End With 

    'Extract link from pasted formula and clear range 
    With Selection 
     strClipboardRange = Mid(.Cells(1, 1).Formula, 2) 
     If .Rows.Count > 1 Or .Columns.Count > 1 Then 
      strClipboardRange = strClipboardRange & ":" & _ 
       Mid(.Cells(.Rows.Count, .Columns.Count).Formula, 2) 
     End If 
     Set mRngClipboard = Range(strClipboardRange) 
     .Clear 
    End With 

Finalize: 
    wsActiveSource.Activate 
    wsActiveTarget.Parent.Activate 
    wsActiveTarget.Activate 

    ws_Temp.Visible = xlSheetVeryHidden 
    Application.EnableEvents = True 

    Exit Sub 
ErrorHandler: 
    Err.Clear 
    Resume Finalize 
End Sub 


Public Sub subRestoreClipboard() 
    Select Case mIntCutCopyMode 
     Case 0: 
     Case xlCopy: mRngClipboard.Copy 
     Case xlCut: mRngClipboard.Cut 
    End Select 

End Sub 

Private Function fctBlnIsExcelClipboard() As Boolean 
    Dim var As Variant 
    fctBlnIsExcelClipboard = False 
    'check if clipboard is in use 
    If mIntCutCopyMode = 0 Then Exit Function 
    'check if Excel data is in clipboard 
    For Each var In Application.ClipboardFormats 
     If var = xlClipboardFormatCSV Then 
      fctBlnIsExcelClipboard = True 
      Exit For 
     End If 
    Next var 
End Function 
+0

問題是我無法在我從中複製的文檔中添加新的工作表,它被鎖定。 – MiniMite

+0

您應該在放置代碼的文件中添加工作表! :-) –

+0

,如果由於某種奇怪的原因導致無法執行此操作,則還可以在代碼中插入臨時工作表,然後將其刪除。這也可以在任何其他工作簿中完成... –