web-dev-qa-db-fra.com

Excel VBA - Comment effacer le Presse-papiers d'un autre classeur dans une autre application?

Contexte:

J'ai un script qui formate les données brutes et l'ajoute à la fin d'un classeur d'analyse que j'ai ouvert. Le script s'exécute à partir du classeur d'analyse au fur et à mesure que les données RAW sont renseignées. 

Problème:

Le script fonctionne correctement, à une exception près. Je ne parviens pas à vider le presse-papiers de l'autre classeur et je suppose que cela est dû au fait qu'il est ouvert dans une autre instance (Application) d'Excel.

Mon code jusqu'à présent:

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

Je pensais résoudre le problème en fermant le classeur RAW Data (je veux quand même le faire), mais je reçois une invite car les données du Presse-papiers sont plutôt volumineuses et ne fonctionnent donc pas. 

5
Petay87

Étant donné que le classeur wb appartient à l'instance d'application une autre

wb.Application.CutCopyMode = False

au lieu

Application.CutCopyMode = False

wb.Application renvoie l'instance des applications à laquelle le classeur wb appartient.

10
Dmitry Pavliv

Ce que je fais, c’est simplement copier toutes les cellules vides de mon ActiveWorkbook une fois que j’ai collé les valeurs que j’avais copiées précédemment et que je n’en ai plus besoin. me permet de fermer le classeur lorsque j'en ai besoin.

Je comprends que ceci est plutôt une solution de contournement, mais cela fonctionne tout le temps.

Une autre solution

Ce que vous devriez essayer est d’obtenir le MSForms DataObject et d’essayer de le mettre dans le presse-papier

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

puis effacez-le comme suit:

clipboard.Clear

Et si cela ne fonctionne pas, vous pouvez toujours définir le texte du presse-papiers sur vide

clipboard.SetText ""
clipboard.PutInClipboard
4
AKS

Le Application.CutCopyMode = False ne m'a pas permis d'effacer le tampon ou de ne plus avoir d'erreur en essayant ActiveSheet. Coller errorActiveSheet. Erreur de collage 

Pour effacer un tampon volumineux générant une ActiveSheet. Une erreur de collage, par exemple, consiste simplement à copier une cellule vide, par exemple Range("A1").Copy, où la cellule A1 serait vide ou très petite. Cela rendra alors le tampon vraiment petit! Solution facile! Peut-être pas exactement correct, mais c'est fonctionnellement correct.

2
user12295