web-dev-qa-db-de.com

Excel VBA - Wie lösche ich die Zwischenablage in einer anderen Arbeitsmappe in einer anderen Anwendung?

Hintergrund:

Ich habe ein Skript, das Rohdaten formatiert und an das Ende einer von mir geöffneten Analyse-Arbeitsmappe anfügt. Das Skript wird von der Analyse-Arbeitsmappe aus ausgeführt, wenn die RAW-Daten jedes Mal aufgefüllt werden. 

Problem:

Das Skript funktioniert mit einer Ausnahme einwandfrei. Ich kann die Zwischenablage in der anderen Arbeitsmappe nicht löschen. Ich vermute, dass dies daran liegt, dass es in einer anderen Instanz (Anwendung) von Excel geöffnet wird.

Mein Code bisher:

Sub Data_Ready_For_Transfer()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rnglog As Range
    Dim lastrow As Range
    Dim logrange As Range
    Dim vlastrow As Range
    Dim vlastcol As Range
    Dim copydata As Range
    Dim pastecell As Range
    Dim callno As Range

    Set wb = GetObject("Book1")
    Set ws = wb.Worksheets("Sheet1")

    Application.ScreenUpdating = False

    'if we get workbook instance then
    If Not wb Is Nothing Then
        With wb.Worksheets("Sheet1")
            DisplayAlerts = False
            ScreenUpdating = False
            .Cells.RowHeight = 15
            Set rnglog = wb.Worksheets("Sheet1").Range("1:1").Find(What:="Log Date", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
            Set lastrow = rnglog.EntireColumn.Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
            Set logrange = wb.Worksheets("Sheet1").Range(rnglog, lastrow)
            rnglog.EntireColumn.Offset(0, 1).Insert
            rnglog.EntireColumn.Offset(0, 1).Insert
            rnglog.EntireColumn.Offset(0, 1).Insert
            rnglog.EntireColumn.TextToColumns Destination:=rnglog, DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
                :=Array(Array(1, 1), Array(2, 1), Array(3, 9)), TrailingMinusNumbers:=True
            rnglog.Value = "Log Date"
            rnglog.Offset(0, 1).Value = "Time"
            logrange.Offset(0, 2).FormulaR1C1 = "=WEEKNUM(RC[-2])"
            logrange.Offset(0, 2).EntireColumn.NumberFormat = "General"
            rnglog.Offset(0, 2).Value = "Week Number"
            logrange.Offset(0, 3).FormulaR1C1 = "=TEXT(RC[-3],""mmmm"")"
            logrange.Offset(0, 3).EntireColumn.NumberFormat = "General"
            rnglog.Offset(0, 3).Value = "Month"
            Set vlastrow = wb.Worksheets("Sheet1").Range("A:A").Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
            Set vlastcol = vlastrow.EntireRow.Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
            Set copydata = .Range("A2", vlastcol)
            copydata.Copy
        End With
        With ActiveWorkbook.Worksheets("RAW Data")
            Set pastecell = .Range("A:A").Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
            Set callno = .Range("1:1").Find(What:="Call No", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
            pastecell.Offset(1, 0).PasteSpecial xlPasteValues
            .Cells.RemoveDuplicates Columns:=5, Header:=xlYes
            Application.CutCopyMode = False
        End With
        wb.Close False
        Application.ScreenUpdating = True
        MsgBox "Done"
    End If
End Sub

Ich dachte, ich würde das Problem umgehen, indem ich die RAW Data-Arbeitsmappe schließe (ich möchte das trotzdem tun), aber ich bekomme eine Aufforderung, da die Daten in der Zwischenablage ziemlich groß sind und dies auch nicht funktioniert. 

5
Petay87

Da die Arbeitsmappe wb zu einer anderen Anwendungsinstanz gehört, sollten Sie verwenden

wb.Application.CutCopyMode = False

stattdessen

Application.CutCopyMode = False

dabei gibt wb.Application die Anwendungsinstanz zurück, zu der die Arbeitsmappe wb gehört.

10
Dmitry Pavliv

Was ich mache, ist einfach eine leere Zelle in meinem ActiveWorkbook zu kopieren, nachdem ich die zuvor kopierten Werte eingefügt habe und ich sie nicht mehr brauche - und dies ersetzt die großen Daten in der Zwischenablage durch eine leere Zeichenfolge (vergleichsweise nichts) und erlaubt mir, die Arbeitsmappe zu schließen, wenn ich muss.

Ich verstehe, dass dies eher eine Problemumgehung ist, aber es funktioniert immer.

Eine andere Lösung

Sie sollten versuchen, den MSForms DataObject zu erhalten und ihn in die Zwischenablage zu setzen

Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject

und löschen Sie es wie folgt:

clipboard.Clear

Wenn dies nicht funktioniert, können Sie den Text der Zwischenablage immer auf leer setzen

clipboard.SetText ""
clipboard.PutInClipboard
4
AKS

Der Application.CutCopyMode = False hat für mich nicht funktioniert, um den Puffer zu löschen oder einen Fehler beim Versuch von ActiveSheet zu erhalten. Fügen Sie errorActiveSheet ein. Fehler beim Einfügen 

Um einen großen Puffer zu löschen, der eine ActiveSheet erzeugt. Einfügefehler ist beispielsweise das Kopieren einer leeren Zelle, beispielsweise Range("A1").Copy, wobei Zelle A1 leer oder sehr klein wäre. Dadurch wird der Puffer wirklich klein! Einfach zu beheben! Vielleicht nicht genau richtig, aber funktionell richtig.

2
user12295