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)

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é...

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)

C'est exactement ça !
Banzai64 a écrit :

Range("A1").Value = "XXXX"

indique le classeur ouvert en dernier c'est à dire oWB2

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.

Range("A1").Value = "XXXX" équivaut donc à ActiveWorkbook.Activesheet.Range("A1").Value = "XXXX"

Rechercher des sujets similaires à "probleme copier coller 2013"