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.
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.
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.
Étant donné que le classeur wb
appartient à l'instance d'application une autre
wb.Application.CutCopyMode = False
au lieu
Application.CutCopyMode = False
où wb.Application
renvoie l'instance des applications à laquelle le classeur wb
appartient.
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
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.