Problème de copier/coller avec 2013
Bonsoir
Une petite énigme
Impératif il faut avoir au minimum 2013 (si aussi 2010 c'est un plus)
Suite à un post https://forum.excel-pratique.com/excel/probleme-de-copier-coller-t46983-10.html
Je suis confronté à un problème
Le fichier joint vous aidera à comprendre ce que je dis
Dans ce fichier 3 pages
Dans la page Infos un bouton qui lance une macro, cette macro CopieBis, copie des données de la page "poules-équipes" dans la page "liste matchs"
Ces copies se font en valeurs (car il y a des formules dans l'original de la page ""poules-équipes")
Si on clique sur le bouton de la page "Infos" le résultat c'est du n'importe quoi (voir les images dans le lien)
Si à partir de l'éditeur on exécute directement la macro on obtient le résultat correct (voir image dans le lien)
Et cela ne le fait qu'avec XL 2013
J'ai testé sur XL 2010 et quelque soit le lancement de la macro, j'obtiens un résultat correct
Peut-être à force de chercher je passe à côté de quelque chose, mais je ne vois pas
Si quelqu'un a une solution ou une explication ?
Ne pas s'inquiéter si ça flashe beaucoup
Bonjour
La nuit porte conseil
Je n'ai pas d'explication mais une solution
Dans l'autre post rudolf, propose une solution qui ne convient pas, mais qui m'a donné une idée
Celle de spécifier la page de toutes les plages de cellules, tant celles à copier, que celles de destination
Et cela fonctionne même quand on copie en valeurs
C’était le but recherché
Je laisse le post ouvert si quelqu'un à une explication
Voir le fichier
Bonsoir Banzai,
J'ai atterri sur ce post suite à celui-là : https://forum.excel-pratique.com/excel/recopie-incomplete-t55407.html
Après avoir un peu investigué, je sais d'où vient l'erreur mais je ne m'explique pas le comportement de la méthode PasteSpecial.
Je poste le code pour faciliter mon explication :
Sub CopieBis()
Dim I2 As Integer, Colonne2 As Integer '
Dim DerLigne2 As Long, derligne As Long, derligne3 As Long
Sheets("poules-équipes").Select
With Sheets("liste matchs")
.Range("a10:E" & Rows.Count).Clear
.Range("H10:K" & Rows.Count).Clear
For I2 = 1 To Sheets("infos").Range("D2") 'compteur jusqu'a valeur nb poule
Colonne2 = 1 + ((I2 - 1) * 3)
DerLigne2 = Cells(30, Colonne2).End(xlUp).Row ' derniere ligne equipes/arbitrage
derligne = Cells(65, Colonne2).End(xlUp).Row ' derniere ligne journée/poule
derligne3 = Cells(85, Colonne2 + 1).End(xlUp).Row ' derniere ligne terrain
Range(Cells(15, Colonne2), Cells(DerLigne2, Colonne2)).Copy ' copy domicile
.Range("e" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Range(Cells(15, Colonne2 + 1), Cells(DerLigne2, Colonne2 + 1)).Copy ' copy exterieur
.Range("h" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Range(Cells(15, Colonne2 + 2), Cells(DerLigne2, Colonne2 + 2)).Copy ' copy les arbitrage
.Range("i" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Range(Cells(50, Colonne2), Cells(derligne, Colonne2 + 2)).Copy ' copy journée + poules + catégorie
.Range("b" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Range(Cells(70, Colonne2 + 1), Cells(derligne3, Colonne2 + 1)).Copy ' copy terrain
.Range("j" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Next I2
Application.CutCopyMode = False
.Cells.Replace What:="010", Replacement:="10", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
.Range("f10:g170").Borders.LineStyle = xlNone
End With
End Sub
Lorsque l'on exécute la macro CopieBis à partir de l'éditeur, l'onglet "poules-équipes" reste bien sélectionné après le passage sur la ligne suivante
Sheets("poules-équipes").Select
et le reste du code effectue le copier/coller au bon endroit.
En exécutant la macro à partir du bouton, pour une raison qui m'échappe, lors du 2è PasteSpecial
.Range("h" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
l'onglet "liste matchs" est automatiquement sélectionné !
Ce qui fait que les copies suivantes se font à partir de l'onglet "liste matchs" et non plus depuis "poules-équipes"! D'où les copier/collage spécial aléatoires...
Pour s'en convaincre, essaie de mettre un point d'arrêt après la ligne
.Range("h" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
et appuie sur le bouton de copie.
Chez moi c'est l'onglet "liste matchs" qui est sélectionné.
Bonsoir
Bonsoir vba-new
Tu as trouvé le pourquoi la copie merde se passe très mal, mais l'explication de ce défaut reste à trouver
En plus tu m'as permis de trouver pourquoi une version du code ne fonctionnait pas
Dans ce post https://forum.excel-pratique.com/excel/recopie-incomplete-t55407.html
J'avais fais une version qui utilisait ActiveSheet à la place de Sheets(NomFeuille) et la macro ne fonctionnait pas bien
Cela venait bien de ton explication "Excel perd ses repères"
On n'a pas fini avec ce bug (2013 est de plus en plus présent)
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Pour avoir eu quelques soucis aléatoires et non expliqués avec l'utilisation de "Range", je préconise de toujours préfixer avec la feuille.
J'ai également rencontré des soucis en utilisant la propriété "Sheets", alors que la propriété "Worksheets" ne posait pas de problème. Si quelqu'un connaît la différence, j'aurai appris quelque chose ce soir.
Tout ça est certes un peu plus contraignant, mais on sait au moins sur quel objet on est.
Bouben
Private Sub Exemple()
Dim oWB1 As Workbook 'déclaration du fichier 1
Dim oSh1 As Worksheet 'déclaration de la feuille 1 du fichier 1
Dim oWB2 As Workbook 'déclaration du fichier 2
Dim oSh2 As Worksheet 'déclaration de la feuille 1 du fichier 2
Set oWB1 = ThisWorkbook 'fichier 1
Set oSh1 = oWB1.Worksheets("aaaa") 'feuille "aaaa" du fichier 1
Set oWB2 = Workbooks.Open("C:\TEMP\Test.xlsx") 'fichier 2
Set oSh2 = oWB2.Worksheets("bbbb") 'feuille "bbbb" du fichier 2
oSh1.Range("A1").Value = "XXXX"
'Equivalent à
Range("A1").Value = "XXXX"
oSh2.Range("A1").Value = oSh1.Range("A1").Value
Set oSh1 = Nothing
Set oSh2 = Nothing
oWB2.Close
Set oWB2 = Nothing
Set oWB1 = Nothing
End Sub
Bonjour
bouben a écrit :Si quelqu'un connaît la différence
Pas sur à 100% mais je crois que WorkSheet indique une feuille de calcul alors que Sheets représente une feuille (soit de calcul soit graphique)
Sans doute quelqu'un aura une meilleure explication
Et tant que l'on y est
oSh1.Range("A1").Value = "XXXX"
'Equivalent à
Range("A1").Value = "XXXX"
je ne crois pas que cela soit juste
oSh1.Range("A1").Value = "XXXX"
indique le classeur oWB1 tandis que
Range("A1").Value = "XXXX"
indique le classeur ouvert en dernier c'est à dire oWB2
Mais bon des fois je déco..e
Re,
J'ai essayé de faire 2-3 recherches pour le PasteSpecial mais rien trouvé...
C'est exactement ça !Banzai64 a écrit :Pas sur à 100% mais je crois que WorkSheet indique une feuille de calcul alors que Sheets représente une feuille (soit de calcul soit graphique)
Plus précisément, lorsque l'on ne précise pas l'objet duquel provient le Range, il se basera sur la feuille active du classeur actif.Banzai64 a écrit :Range("A1").Value = "XXXX"
indique le classeur ouvert en dernier c'est à dire oWB2
Range("A1").Value = "XXXX" équivaut donc à ActiveWorkbook.Activesheet.Range("A1").Value = "XXXX"