Se connecter avec
S'enregistrer | Connectez-vous

copie de groupe de cellule

Dernière réponse : dans Programmation

bonjour,

j'ai un petit problème lors de ma copie de cellule... en fait, cela ne copie pas... je ne comprend pas pourquoi.

voici mon code :
  1. Sub tableau_selva()
  2. Sheets("TRG").Range("C4:D8").Clear
  3. Sheets("TRG").Range("C4:C8") = Sheets("selva").Range("A2:A6")
  4. Sheets("TRG").Range("D4") = Sheets("selva").Range("G2:G6")
  5. End Sub


je m'explique : je nettoye d'abord les cellules dasn lesquel je vais copier (ligne 2)
les lignes 3 et 4 veulent faire la même chose, mais c'est pour vous montrez 2 méthodes que j'ai utilisé (et qui ne marche pas) : je veux copier le groupe de cellule A2:A6 de la page "selva" dans le groupe de cellule C4:C8 de la page TRG.

La seul opération qui marche est la première !!

Autres pages sur : copie groupe cellule

Lassé par la pub ? Créez un compte

bon, j'ai essayé une autre méthode, mais cela ne marche toujour pas, j'ai le message d'erreur "variable non definie", j'ai essayé en rajoutant Dim n as Value mais cela ne marche pas non plus et je ne trouve pas le type et comment l'ecrire...
J'ai essayé avec DefInt... mais pas concluant..
I need help !!

  1. Sub tableau_630()
  2. n = 15 ' péridode
  3.  
  4. Dim acc As Worksheet
  5. Dim mach As Worksheet
  6.  
  7. Set acc = Worksheets("TRG") ' feuille acceuil
  8. Set mach = Worksheets("630t") ' feuille machine
  9.  
  10. Do While n <> 0
  11. acc.Range("C" & n + 3) = mach.Range("A" & n + 1).Value ' copier la date
  12. acc.Cells("D" & n + 3) = mach.Range("G" & n + 1).Value ' copie le TRG
  13. acc.Cells("F" & n + 3) = mach.Range("H" & n + 1).Value ' copie le % de l'objectif
  14. n = n - 1
  15. Loop
  16. End Sub

Expert Programmation

Utilise la méthode Copy de l'objet Range :
  1. Sub tableau_selva()
  2. Sheets("TRG" ).Range("C4:D8" ).Clear
  3. Sheets("selva" ).Range("A2:A6" ).Copy Destination:=Sheets("TRG" ).Range("C4" )
  4. End Sub

Peut on mettre à la place d'un ".Copie destination", un ".Paste spécial" ? Comme j'essaye de copier les valeurs de cellules (ces valeurs sont données par des formules), j'ai essayé de rajouter un .Value comme on l'avait déjà fait dans un autres programme. Mais ici, cela ne marche pas.

C'est aussi pour cela que j'avais proposé une autre possibilité (qui ne fonctionne pas non plus).
Expert Programmation

Il n'y a en général pas qu'un seul chemin pour un même but : Oui, tu peux mettre un PasteSpecial. Mais si tu cherches à copier les valeurs, le .Copy Destination est la meilleure solution. RFTM pour t'en convaincre.
Expert Programmation

:sarcastic:  Faut que j'aille me coucher, moi. Et au réveil, je relis ce p****n de manuel. Peut-être qu'après, j'arrêtrais d'écrire des conneries.

Désolé Eric. Evidemment, la méthode .Copy copie les formules. Pour m'en convaincre, RTFM.

Alors, pour copier juste les valeurs, tu peux passer par le presse-papier (COPY PASTESPECIAL CUTCOPYMODE :vomi:  )
Soit effectivement tu utilises .Value.

Exemples, pour une cellule :
Worksheets("Feuil1").Range("A1").Value = Worksheets("Feuil2").Range("B3).Value
Worksheets("Feuil1").Cells(1, 1).Value = Worksheets("Feuil2").Cells(3, 2).Value


Donc pour toute une plage, utilise deux boucles imbriquées :
  1. Dim row As Integer, lig As Integer
  2. For col = 0 To 3
  3. For lig = 0 To 7
  4. MaFeuil_1.Range("C4" ).Offset(col, lig).Value = MaFeuil_2.Range("D6" ).Offset(col, lig).Value
  5. Next
  6. Next

La même :
  1. Dim row As Integer, lig As Integer
  2. For col = 0 To 3
  3. For lig = 0 To 7
  4. MaFeuil_1.Cells(col + 4, lig + 3).Value = MaFeuil_2.Cells(col + 6, lig + 4).Value
  5. Next
  6. Next
Expert Programmation

Je réponds si je veux :o  ... donc tu ne m'embêtes pas ;) 

N'hésite pas ni à poser des questions, ni à lire des FAQ. L'aide de VBA/Excel est aussi une bonne source d'info.

bon, la suite.... :) 

j'essaye de copier un groupe de cellule, mais pas n'importe lequel, les 15 dernières !!

je suis allé sur le site : http://www.info-3000.com/vbvba/ecrituredeplacementcellu...
et j'ai pas tout compris !!

plus concretement :
voici une partie d'un code pris sur le site ci dessus, dans la partie "exercie bodure noir"
sur le site, le but est d'encadrer en noir un tableau (donc de colorier en noir les case autours)
  1. Dim LaBase As String
  2. Dim LaPlace As Object
  3. Dim NbLigne As Integer ' Nombre de lignes du tableau
  4. Dim NbColonne As Integer ' Nombre de colonnes du tableau
  5.  
  6. ' Initialisation des variables :
  7. Set LaPlace = ActiveCell.CurrentRegion
  8. NbColonne = LaPlace.Columns.Count
  9. NbLigne = LaPlace.Rows.Count
  10.  
  11. ' Bordure du HAUT :
  12. LaBase = LaPlace.Cells(1, 1).Offset(-1, -1).Address
  13. For Ctr = 0 To NbColonne + 1
  14. Range(LaBase).Offset(0, Ctr).Interior.Color = RGB(0, 0, 0)
  15. Next

Après recherche dans l'aide VBA, j'ai tj pas tout saisi...
alors maintenant, j'essaye de le traduire : et c'est la que j'aurais besoin de vos corrections !

1. Labase renvoie un nom de cellule (ex : B7)
2. Laplace renvoie un objet Range, donc renvoie a une cellule ....
3. renvoie des nombre entier
4. idem
5. :) 
6. :) 
7. active et selectionne une cellule = et alors??
8. renvoie le nombre de colonne
9. renvoie le nbr de ligne
10 :) 
11 :) 
12. laBase renvoie la cellule euh... ben cells(1,1) c'est A1, offset(-1,-1) on remonte et on recule d'1 ? la je saisi pas... a moins que la ligne 7 active la partie occuper du tableau et donc ici, on prend le coin supérieur gauche puis on se décale d'un .... c'est pi etre ça le truc!
13. pour ctr allant de 0 a Nbcolone+1
14. colorier en noir les cellules au dessus du tableau
15. et voila !

Bon, je demande juste quelques eclaisisements et je pense que je devrais m'en sortir... sur ce point la ;) 
Comme vous le voyez, je debute !
Expert Programmation

Je n'ai pas trop vocation à commenter le code d'un autre site.... :o 

Enfin bon.

2. LaPlace doit contenir une plage de cellules donc devrait être de type Range [:spamafote] Où est la définition de LaBase ? Il faut mettre l'option Explicit. (Ultimatum: Sinon je ne réponds plus aux questions :fou:  )

7. Non. ActiveCell n'active pas une cellule mais référence la cellule active. On aurait dit "ActivateCell" sinon. :o  En fait en VBA/Excel, on utilise la méthode .Select pour activer une cellule. .CurrentRegion désigne les cellules contiguës et non-vides. Donc LaPlace contient la zone de cellules remplies autour de la cellule active.

8. ... de la zone de cellules remplies autour de la cellule active.

9. ... de la zone de cellules remplies autour de la cellule active.

10. Ben non. Cells(1, 1), sans rien préciser, c'est la première cellule de la feuille, donc A1, mais si on précise une zone, c'est la première cellule de la zone. RTFM à la page Cells.

Il me semble qu'il y a un exemple en image sur le site pré-cité. :o 

J'ai essayé de reprendre pour moi le code.
Comme mon but est re copier les 15 dernières cellules d'une liste (ou colonne)
voici ce que j'ai essayé :

  1. Sub prg_copie()
  2. Dim lig As Integer
  3. Dim bas As String
  4. Dim Laplace As Object
  5. Dim Nbligne As Integer
  6.  
  7. Set Laplace = ActiveCell.CurrentRegion
  8. Nbligne = Laplace.Rows.Count
  9.  
  10. bas = Laplace.Cells(Nbligne, 1).Offset(0,0).Address
  11. For lig = 0 To 15
  12. ' copie les 15 dernière date de la colonne B de la feuille mandelli
  13. Sheets("TRG").Range("C4").Offset(lig, 0).Value = Sheets("mandelli").Range(bas).Offset(-lig, 2).Value
  14. Next
  15. End Sub

Comme vous vous en doutez, cela ne marche pas ! Mais, moi, ce n'est pas evident pour moi... Je sais au moins que l'erreur est dans les lignes 7,8,10.

pourriez vous m'orienter ?
Expert Programmation

Ligne 10, tu veux bien me dire pourquoi tu utilises Offset ? :pfff: 
Essaye de comprendre ce que tu fais !
Moyens :
  • Réflexion,
  • Aide de VBA/Excel,
  • PrésencePC.
    Dans l'ordre !!!!!!!

    Citation :
    mon but est re copier les 15 dernières cellules d'une liste (ou colonne)
    Bon, faisons les choses simplement. On veut allez de A vers B : Décrire A et B. (Coordonnées, quantités min/max)

    escuse si je ne suis pas clair.

    donc, j'ai un tableau ou je repertorie des informations numeriques journalières.
    je voudrais prendre les informations des 15 derniers jours et les envoyer dans un autre tableau (autres onglets) de synthèse.
    pour envoyer l'information de la date : je la prends dans le tableau "mandelli" dans la colonne B pour l'envoyer dans l'onglet "TRG" colonne C, ligne 4 et suivantes.

    je recommencerais alors l'operation pour les autres informations à transporter.
    Expert Programmation

    Citation :
    j'ai un tableau ou je repertorie des informations numeriques journalières.
    je voudrais prendre les informations des 15 derniers jours et les envoyer dans un autre tableau (autres onglets) de synthèse.
    pour envoyer l'information de la date : je la prends dans le tableau "mandelli" dans la colonne B pour l'envoyer dans l'onglet "TRG" colonne C, ligne 4 et suivantes.


    Ben voilà ! On a presque tout.
    Maintenant quelques précisions :
  • Tu parles des n dernières infos. Connaîtons la place de la dernière (ou la première) ?
  • Et pour gérer les effets de bord, si le tableau "mandelli" fait moins de 15 lignes, que fait-on ? (J'ai une petite idée de la réponse mais la question doit être posée)

    Citation :
    Tu parles des n dernières infos. Connaîtons la place de la dernière (ou la première) ?

    Je parlais des n dernière infos.
    SI on connait ? euh... dans un sens oui, c'est a dire que si on connait la date du jour, je peut dire ou est l'information...j'avais pas pensé à cela... (on met dans une cellule =AUJOURDHUI()) quoique la mise à jour des info est souvent décalé de une journée. Comme j'ai mon relevé depuis le 3sept... A2 = septembre; le seul inconvénient, c'est que les semaines sont de 5 jours avec de temps en temps le samedi en plus...
    Je prefere quand même prendre les n dernières informations
    Citation :
    Et pour gérer les effets de bord, si le tableau "mandelli" fait moins de 15 lignes, que fait-on ?

    en theorie, j'ai toujours plus de 15 lignes ! Pour le mandelli, pas de probleme... pour les autres onglets.. disons pas de probleme... au pire, dans 10 jours sur, j'ai plus de 15 lignes partout ! Donc pour 10 jours, je ferais "à la main" !! (je veux dire sans programme)
    Sinon, je pense qu'avec une if then endif, on devrais pouvoir cerner le probleme ?
    Expert Programmation

    Bon. Puisque tu n'as pas compris les questions, c'est qu'elles étaient mal posées....

    Les données à copier sont dans la colonne X. On prend les quinze dernières. Il n'y a donc pas de fioritures, pas de titre, de résumé, pas de trous (cellules vides) dans cette colonnes ? Ok.

    je ferais "à la main"
    :fou:  NON. Tu es en train de générer des bugs exprès. Tu as fais des maths niveau terminale ? La première chose à faire lors d'une étude de fonction, c'est déterminer le domaine de la fonction. Pourquoi t'avoir farci la tête de conneries dans le genre ? Pour que tu les applique dans d'autres domaines. Je réponds à ta place : Si j'en ai au moins 15, je prends les quinze derniers, sinon, j'en prends autant qu'il y en a. Ou encore, s'il n'y en à pas quinze, j'annule la procédure.
    Expert Programmation

    1°) Déterminer la première cellule de destination.
    2°) Déterminer la dernière cellule source.
    3°) Vérifier que cette cellule est au moins sur la quinzième ligne.
    4°) Remonter de quinze lignes. Là est la première cellule à copier.
    5°) Copier cette cellule source dans la destination.
    6°) Descendre d'une ligne la destination.
    7°) Descendre d'une ligne la source.
    8°) Recommencer 15 fois les étapes 5°, 6° et 7°

    1. Dim dest As Range 'Destination
    2. Dim srce As Range 'Source
    3. Dim nbre As Integer 'Nombre d'itérations
    4. Dim i As Integer
    5.  
    6. ' // TRG!C4
    7. Set dest = Worksheets("TRG").Range("C4")
    8.  
    9. ' // mandelli!B1 et on descend jusqu'à la dernière.
    10. Set srce = Worksheets("mandelli").Range("B1").End(xlDown)
    11.  
    12. If srce.Row > 15 Then
    13. nbre = 15
    14. Else
    15. MsgBox "Attention malheureux, il y a moins de 15 lignes là !!!!"
    16. nbre = srce.Row
    17. End If
    18.  
    19. ' // On remonde de 14 lignes
    20. Set srce = srce.Offset(-(nbre - 1), 0)
    21.  
    22. ' // Variante 1
    23. For i = 1 To nbre
    24. dest.Value = srce.Value
    25. Set dest = dest.Offset(1, 0)
    26. Set srce = srce.Offset(1, 0)
    27. Next
    28.  
    29. ' // Variante 2
    30. For i = 0 To nbre - 1
    31. dest.Offset(i, 0).Value = srce.Offset(i, 0).Value
    32. Next


    Et voilà !


    Evidemment, si tu as plus de colonnes à trairer en même temps, utilise la variante 2 et multiplie les décalages (offsets) par rapport à dest et srce.
    Expert Programmation

    Je ne fais pas d'erreur, je dissémine des coquilles pourvoir si les gens comprennent ce que je propose. La preuve, le texte juste au dessus. :sol: 


    Et d'ailleur, quelle erreur ? Je ne vois pas d'erreur, c'est bien -1 :whistle: 
    Lassé par la pub ? Créez un compte