Se connecter avec
S'enregistrer | Connectez-vous

probleme de copie Excel

Dernière réponse : dans Programmation

bonjour,

Je pense que c'est débile
mais ma ligne de code ne passe pas
  1. feuille.Range("C" & x & ":C" & y & ",F" & x & ":F" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).copy


alors que

  1. Range("C" & x & ":C" & y & ",F" & x & ":F" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).copy


fonctionne avec un code contenant des actives

si quelqu'un peut m'expliquer merci d'avance

Autres pages sur : probleme copie excel

Lassé par la pub ? Créez un compte
Expert Programmation

>> un code conte des actives
Gné ? :heink: 

>> ma ligne de code ne passe pas
Message d'erreur s'il te plaît.

Dans le premier exemple, vérifie ce que contient feuille en ajoutant un espion sur feuille par exemple.


EDIT: J'espère que tu ne vas pas nous faire des Copy/Paste/CutCopyMode :o 

Il me met la méthode range de l'objet worksheet a échoué
voile le code qui fonctionne pas

  1. Dim wbfile As Workbook
  2. Dim feuille As Worksheet
  3. NomFichierAlertes = Application.GetOpenFilename("Fichier xls, *.xls", , "ouvrir le fichier d'alertes (macro v35)")
  4. Set wbfile = Application.Workbooks.Open(NomFichierAlertes)
  5. Set feuille = wbfile.Sheets("feuil2")
  6.  
  7. Range("A1").Select
  8. i = 2
  9. Do While ActiveCell.Value <> "0"
  10. i = i + 1
  11. x = i
  12. Range("A1").Select
  13. Range("A1").Offset(i, 0).Select
  14. Loop
  15.  
  16. wbfile.feuille.Rows((i + 1) & ":20000").Delete Shift:=xlUp
  17.  
  18. Range("A2", Range("Y2").End(xlDown)).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
  19. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  20. DataOption1:=xlSortNormal
  21.  
  22. Count = 0
  23. x = i + 1
  24. y = i
  25.  
  26. Do While ActiveCell.Value Like Banq
  27. y = y + 1
  28. Count = Count + 1
  29. Range("A1").Offset(y, 0).Select
  30. Loop
  31.  
  32. feuille.Range("C" & x & ":C" & y & ",F" & x & ":F" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).copy


et ca plante a la derniere ligne

voila le truc qui fonctionne

  1. Application.GetOpenFilename("Fichier xls, *.xls", , "ouvrir le fichier d'alertes (macro v35)")
  2. Workbooks.OpenText Filename:=NomFichierAlertes, local:=True
  3.  
  4.  
  5. Range("A1").Select
  6. i = 2
  7. Do While ActiveCell.Value <> "0"
  8. i = i + 1
  9. x = i
  10. Range("A1").Select
  11. Range("A1").Offset(i, 0).Select
  12. Loop
  13.  
  14. Range("A2", Range("Y2").End(xlDown)).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
  15. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  16. DataOption1:=xlSortNormal
  17.  
  18. Count = 0
  19. x = i + 1
  20. y = i
  21.  
  22. Do While ActiveCell.Value Like Banq
  23. y = y + 1
  24. Count = Count + 1
  25. Range("A1").Offset(y, 0).Select
  26. Loop
  27.  
  28. Range("C" & x & ":C" & y & ",F" & x & ":F" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).copy


voila
Expert Programmation

Code 1

Ligne 4. Vire Application.
Ligne 7 à 14. Voir Code 2, ligne 5 à 12

Ligne 5 tu précises la feuille, lignes 7, 12, 13, 18, 29 tu ne le fais plus :(  Tu le fais bien ligne 32.
  1. feuille.Range("A1" ).Select


Ligne 5, feuille est une des feuilles de wbfile. Pas besoin de le redire ligne 16 :
  1. feuille.Rows((i + 1) & ":20000" ).Delete Shift:=xlUp


Code 2

C'est quoi ce OpenText ?

Ligne 5 à 12 et 22 à 26 :/ 
  1. Dim c As Range
  2.  
  3. Set c = Range("A1")
  4. i = 2
  5. Do While c.Value <> "0"
  6. i = i + 1
  7. x = i
  8. Set c = Range("A1" ).Offset(i, 0)
  9. Loop
  10.  
  11. ..
  12.  
  13. Do While c.Value Like Banq
  14. y = y + 1
  15. Count = Count + 1
  16. Set c = Range("A1" ).Offset(y, 0)
  17. Loop


Quand je me relis, je me demande comment tu acceptes encore de publier sur PPC. J'espère quand même que toutes mes critiques t'aident ;) 


  1. Range("C" & x & ":C" & y & ",F" & x & ":F" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).copy


On ne peut pas faire de copie sur une sélection multiple :
Range("A1,A3").Copy
--> Plantage.

Pour t'en convaincre, essaie ça dans Excel :

Sélectionne A1. Appuye sur la touche CTRL et sélectionne A3.
Tente un Copier/Coller (CTRL+C/CTRL+V ou Menu Copier/Coler) : --> Plantage.
Expert Programmation

:/  Collé. :( 

Fais-le en plusieurs morceaux :

  1. Dim wbfile As Workbook
  2. Dim feuille As Worksheet
  3. Dim c As Range
  4.  
  5. NomFichierAlertes = Application.GetOpenFilename("Fichier xls, *.xls", , "ouvrir le fichier d'alertes (macro v35)" )
  6. Set wbfile = Workbooks.Open(NomFichierAlertes)
  7. Set feuille = wbfile.Sheets("feuil2")
  8.  
  9. Set c = feuille.Range("C1" )
  10. Do While c.Value <> 0
  11. Set c = c.Offset(1, 0)
  12. Loop
  13. x = c.Row
  14.  
  15. feuille.Rows((x + 1) & ":20000" ).Delete
  16. feuille.Range("A2", Range("Y2" ).End(xlDown)).Sort(Range("A2" ))
  17.  
  18. ' // Ici, il doit manquer un Set c = feuille.Range("C1" ) pour revenir en haut du tableau. Non ?
  19. Do While c.Value Like Banq
  20. Set c = c.Offset(1, 0)
  21. Loop
  22. y = c.Row
  23.  
  24. feuille.Range("C" & x & ":C" & y).Copy Destination:=XXXXXXXXXXXXXX
  25. feuille.Range("F" & x & ":F" & y).Copy Destination:=XXXXXXXXXXXXXX
  26. feuille.Range("H" & x & ":H" & y).Copy Destination:=XXXXXXXXXXXXXX
  27. feuille.Range("I" & x & ":I" & y).Copy Destination:=XXXXXXXXXXXXXX
  28. feuille.Range("J" & x & ":J" & y).Copy Destination:=XXXXXXXXXXXXXX
  29. feuille.Range("M" & x & ":M" & y).Copy Destination:=XXXXXXXXXXXXXX
  30. feuille.Range("O" & x & ":O" & y).Copy Destination:=XXXXXXXXXXXXXX
  31. feuille.Range("Q" & x & ":Q" & y).Copy Destination:=XXXXXXXXXXXXXX


Ligne 24 à 32 : c'est trop moche ?

  1. Dim colonnes(8) As String
  2. Dim colonne As String
  3. colonnes(0)="C"
  4. colonnes(1)="F"
  5. colonnes(2)="H"
  6. colonnes(3)="I"
  7. colonnes(4)="J"
  8. colonnes(5)="M"
  9. colonnes(6)="O"
  10. colonnes(7)="Q"
  11.  
  12. For Each colonne In colonnes
  13. feuille.Range(colonne & x & ":" & colonne & y).Copy Destination:=XXXXXXXXXXXXXX
  14. Next

Cela te plaît-il ?
Expert Programmation

>>je devait mettre un s a colonne des lignes 3 à 10
Désolé :(  c'est corrigé ;) 

ça me semble pas mal.
Je n'aime pas les & " " & " " &. Regarde ça :
  1. Range(feuille.Cells(colonne, x), feuille.Cells(colonne, y)).Copy(feuille.Cells(colonne, 1))
Expert Programmation

Ligne 6. Mets le quand même en String, va.

Et ça plante dans la boucle ?
Pour quelle valeur de colonne justement ?

>> Pour être sûr, au moment du plantage, ajoute ces 5 variables dans la fenêtre espion de l'éditeur VBA. <<
Expert Programmation

Chuuuuuut !!!! Je ne peux pas te le dire, c'est secret. Pour un espion normal.
Spoiler
1°) Ouvre la fenêtre espion.
2°) Sélectionne une variable dans ton code, x par exemple, et fais-la glisser dans la fenêtre espion.
2'°) Bouton droit dans la fenêtre espion, ajouter un espion, mettre x par exemple dans l'expression à espionner.
3°) Attendre que le programme plante.
3'°) Mettre un point d'arrêt.
3"°) Mettre le mot-clef Stop là où l'on veut s'arrêter.
4°) Espionner la valeur pour les types simples, toutes les propriétés pour les objets.

Attention, ce message s'autodétruira dans 5 secondes

ca marche kom ca

  1. Set wbfile = Application.Workbooks.Open(NomFichierAlertes)
  2.  
  3. Range("A1").Select
  4. i = 2
  5. Do While ActiveCell.Value <> "0"
  6. i = i + 1
  7. x = i
  8. Range("A1").Select
  9. Range("A1").Offset(i, 0).Select
  10. Loop
  11.  
  12.  
  13. 'a ce moment on a donc la premiere ligne vide qui est la ligne x
  14.  
  15. ActiveWorkbook.ActiveSheet.Rows((i + 1) & ":20000").Delete Shift:=xlUp
  16.  
  17. Range("A2", Range("Y2").End(xlDown)).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
  18. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  19. DataOption1:=xlSortNormal
  20.  
  21. i = 1
  22. Range("A1").Offset(i, 0).Select
  23. Do While ActiveCell.Value
  24.  
  25. wbfile.Activate
  26.  
  27.  
  28. Range("A1").Select
  29. Range("A1").Offset(i, 0).Select
  30.  
  31.  
  32. Banq = ActiveCell.Value
  33.  
  34. Count = 0
  35. x = i + 1
  36. y = i
  37.  
  38. Do While ActiveCell.Value Like Banq
  39. y = y + 1
  40. Count = Count + 1
  41. Range("A1").Offset(y, 0).Select
  42. Loop
  43.  
  44. Range("C" & x & ":C" & y & ",G" & x & ":G" & y & ",Q" & x & ":Q" & y & ",J" & x & ":J" & y & ",I" & x & ":I" & y & ",H" & x & ":H" & y & ",O" & x & ":O" & y & ",M" & x & ":M" & y).Select
  45. Selection.Copy
  46.  
  47. 'On ouvre le fichier à envoyer
  48. Workbooks.Open ("D:\Test2.xls")
  49.  
  50. Range("A1").Offset(2, 0).Select
  51. ActiveSheet.Paste
  52.  
  53. wbfile.Activate


tu va me tuer mais ca marche (pour l'instant)
je prie pour ke ca marche tout le temps c'est une vrai usine a gaz mon code
ca pourais etre plus clean
Expert Programmation

Mais non, je ne vais pas te tuer. Mais ce code est tellement moche qu'il aurait pu être écrit par ton boss. Beurk :vomi: 

En plus, j'ai l'impression que tout ce que j'ai pu te dire a été inutile. Ce n'est pas gratifiant pour moi. :/  Comment trouver l'envie de continuer à aider dans ces conditions ? :( 

Pourquoi Range("A1" ).Offset(2, 0) ?
Range("A3") ne suffit pas ?

Regarde (et étudie-le pour tout comprendre) :
  1. Dim wbfile As Workbook
  2. Dim wbdest As Workbook
  3. Dim feuille As Worksheet
  4. Dim c As Range
  5. Dim colonnes(8) As String
  6. Dim i As Integer
  7.  
  8. colonnes(0)="C"
  9. colonnes(1)="F"
  10. colonnes(2)="H"
  11. colonnes(3)="I"
  12. colonnes(4)="J"
  13. colonnes(5)="M"
  14. colonnes(6)="O"
  15. colonnes(7)="Q"
  16.  
  17. NomFichierAlertes = Application.GetOpenFilename("Fichier xls, *.xls", , "ouvrir le fichier d'alertes (macro v35)" )
  18. Set wbfile = Workbooks.Open(NomFichierAlertes)
  19. Set wbdest = Workbooks.Open ("D:\Test2.xls")
  20.  
  21. Set feuille = wbfile.Sheets("feuil2" )
  22.  
  23. Set c = feuille.Range("C1" )
  24. Do While c.Value <> 0
  25. Set c = c.Offset(1, 0)
  26. Loop
  27. x = c.Row
  28.  
  29. feuille.Rows((x + 1) & ":20000" ).Delete
  30. feuille.Range("A2", Range("Y2" ).End(xlDown)).Sort(Range("A2" ))
  31.  
  32. ' // Ici, il doit manquer un Set c = feuille.Range("C1" ) pour revenir en haut du tableau. Non ?
  33. Do While c.Value Like Banq
  34. Set c = c.Offset(1, 0)
  35. Loop
  36. y = c.Row
  37.  
  38. For i = 0 To 7
  39. feuille.Range(colonnes(i) & x & ":" & colonnes(i) & y).Copy wbdest.Worksheets(1).Cells(i, 3)
  40. Next

Pour les offset demande a mon chef moi je fais que adapter mon programme et surtout il doit fonctionner c'est pour ca ke j'ai fais ce ke j'ai fais avant c'et très crade mais toi ki disait qu'on peut pas faire une copie sur une sélection multiple la ca fonctionne.
Vive les mystère de l'informatique!! lol
Expert Programmation

Re-re-re-testé....

Range("A1:A2;C1:C2").Copy fonctionne :/ 
Range("A1:A2;C1:C1").Copy plante :pfff: 

C'est pas une raison pour me laisser des Select/Selection, Copy/Paste (Mes envies de meurtre me reprennent.)
Expert Programmation

Je teste sur Excel 2002 (v10)

Il y a une différence entre Range("A1:A2;C1:C1" ).Copy et Range("A1:A2;C1:C1" ).Select !

Le Select fonctionne, pas la copie. Et le problème est déporté sur la copie :
  1. Range("A1:A2;C1:C1" ).Copy ' // marche pas
  2. Range("A1:A2;C1:C1" ).Select ' // marche, mais c'est moche
  3. Selection.Copy ' // marche pas, en plus c'est moche


Effectivement, ton exemple contient des zones X2:X8 de même taille, donc il n'y aurait pas de problème pour la copie. Dans mon test, A1:A2;C1:C2 fonctionne, pas A1:A2;C1:C1.

Bref, c'est tellement tordu, que je te propose de règler ton problème avec un gros
  1. feui1.Range("C2:C8,G2:G8,Q2:Q8,J2:J8,I2:I8,H2:H8,O2:O8,M2:M8" ).Copy feui2.Range("A1")
(pas de select ni de paste), mais laisse-moi en public ne pas le conseiller. :o 
Expert Programmation

Non, ça ne marche pas justement. Ca marche dans la plupart des cas.

Imagine que deux macros fonctionnent en même temps. Quelle fenêtre sera active, quelle plage sera sélectionnée ? C'est improbable. Ah bon.

Et le presse-papier ? Si ta macro Excel l'utilise pour copier des valeurs d'une feuille à l'autre (Copy/Paste au lieu de Copy Destination:=XXXX qui n'utilise pas le presse-papier) et que par ailleurs une autre macro, un autre programme, voire toi-même dans une autre application tu l'utilises. Que se passe-t'il ?

Si je vous embête tous(*) avec ça, c'est pour vous faire profiter de beaucoup d'expériences accumulées, ceci dit sans fausse modestie.

(*) Oui, j'embête tout le monde avec ça : http://www.google.com/search?q=select+selection+copy+pa...
Expert Programmation

Oui ????

Le cutcopymode, c'est un truc qu'il ne faut pas oublier de mettre à Faux quand on a commencer à couper ou coller sous Excel. Ce sont les petits pointillés autour de la zone coupée ou collée. Donc après un Cut/Paste ou un Copy/Paste, penser à faire un CutCopyMode = False.

Mais comme un programmeur propre n'utilise pas le presse-papier pour affecter des valeurs, la question ne se pose pas :o 
Expert Programmation

Code 1. Copy est une procédure, pas une fonction. Donc il faut virer les parenthèses. Si wbtemp est un Workbook, alors sache qu'un classeur n'a pas de lignes. En revanche, il a des feuilles de calcul qui elles possèdes des lignes. SI tu jongle avec les classeurs et les feuilles, il manque leur référence avant le Rows("1:183")

Code 2. Même problème.
Lassé par la pub ? Créez un compte