Copier certains cellules dans des lignes

Romai97

Nouveau membre
#1
Bonjour, le forum,
Je débute sur VBA, j'ai besoin d'aide sur mon tableur. Je souhaite copier certaines cellules de la ligne précédente dans des lignes que j’insère. Je veux copier les cellules A, B, D, J, K, L, M, N, U et AD. Et si possible étirer la colonne AG jusqu'au nombres de ligne insérées . J'ai fait un code qui ajoute les lignes mais il copie toutes les cellules précédentes.

Pourriez vous m'aider pour résoudre ce problème .
Merci à vous, Cordialement.

voir le code:

Code:
Sub test()
'Updateby Extendoffice 20160616
    Dim xCount As Integer
LableNumber:
    xCount = Application.InputBox("Number of Rows", "Kutools for Excel", , , , , , 1)
    If xCount < 1 Then
        MsgBox "the entered number of rows is error, please enter again", vbInformation, "Kutools for Excel"
        GoTo LableNumber
    End If
    ActiveCell.EntireRow.Copy
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(xCount, 0)).EntireRow.Insert Shift:=xlDown
    Application.CutCopyMode = False
End Sub

Merci aux personnes qui répondront.
 

svoglimacci

Grand Maître
#2
Salut :)
Je ne vois pas dans ton code de références aux cellules spécifiques A, B, D, J, K, L, M, N, U et AD. L'"erreur" vient peut être de là ?
Peut-être que ton "LableNumber:" est justement là pour cela, pour préparer une boucle ? Si c'est le cas, n'oublie pas, le "goto" c'est le mal (même Micro$oft l'admet maintenant :D ). Il y a des instructions de boucles qui permettent de faire cela proprement. Sinon c'est le plat de spaghettis, sans beurre, à déméler lors d'un debug.
Par ailleurs, pense à paramétrer tes "lettres" (A, B, D ...) surtout si tu penses qu'elles peuvent évoluer un jour. On t'aidera pour cela si tu veux.
Tu nous tiens au courant ? Bon courage.
 

Romai97

Nouveau membre
#3
Salut
Merci pour ta réponse,
Le code que j'ai posté avant me copie toutes les cellules de la ligne précédente et moi je veux qu'il me copie que certains cellules.
les lettres ( A, B, ..) ce sont des colonnes .
 

drul

Obscur pro du hardware
Staff
#4
Salut comme l'a dit svog, ton code ne traite pas l'information de la colonne à traiter, mais copie toute la ligne sans discernement ....
 

svoglimacci

Grand Maître
#5
PS : pardon @drul, je n'avais pas vu que tu avais posté :)
Oui j'ai bien compris :)
Je ne donne ni ta solution ni les instructions (VBA et moi...) mais peut-être le moyen obtenir ce que tu veux.
Il faut absolument que tu écrives un algorithme clair, afin de ne pas te perdre. Et en plus, cela est pratique lorsque tu as besoin d'aide. Un peu d'aide toutefois :
Attention : il est possible qu'il y ait moyen d'optimiser cela en fonction des instructions disponibles en VBA (VBA et moi again...)
1) Les instructions VBA que tu ne connais pas : Tu démarres l'enregistrement d'une macro, tu fais une action simple, tu stoppe l'enregistrement et tu regarde la ou les instructions utilisées. --> Tu as la maîtrise des instructions nécessaires (insérer des lignes, copier des cellules...)
2) Structure vague (ce que j'ai compris de tes besoins) :
Code:
demander le nombre de lignes à insérer --> nbreDeLignes
demander la ligne de départ (ou alors c'est la ligne courante ?) --> numLigneDepart
dimensionner un compteur de lignes --> cptLigneEnCours = 1
se positionner sur la ligne de départ
tant que cptLigneEnCours <= nbreDeLignes
    inserer une ligne supplémentaire
    pour chaque lettre de cellule dans (liste des lettres cellules)
        copie cellule d'origine vers nouvelle cellule
    fin pour
incrémenter cptLigneEnCoure
fin de tant
Voilà, j'espère ne pas m'être trompé.
Conseil : Déclare ta liste de cellules en début de programme, cela sera plus simple pour la faire évoluer si nécessaire.
Demande pour ce que tu n'as pas compris :)
 

Romai97

Nouveau membre
#6
Merci pour vos réponses.
Je penses que je n’étais pas claire sur ce que je veux, je vous réexplique.
Dans mon tableau, j'ai une ligne qui représente par exemple les coordonnées d'une mère. On insère le nombre de ligne ( qui correspond aux nombres d'enfants) dans ces lignes là ,je veux qui me copie par exemple l'adresse, le numéro de tel tout sauf le nom et le prénom. Ce qui reprend les lettres . donc je veux que à chaque fois que j’insère un ou plusieurs ligne qui fait tout.
ça fait plusieurs jours que je suis sur ça.

j’espère que vous aller comprendre.
 

drul

Obscur pro du hardware
Staff
#7
On a bien compris :D

Ce qu'il faut faire malheureusement c'est copier une à une les info qui t'intéresse (via une boucle par exemple)

Un exemple,
Code:
Sub test()
'Updateby Extendoffice 20160616
    Dim xCount As Integer
LableNumber:
    xCount = Application.InputBox("Number of Rows", "Kutools for Excel", , , , , , 1)
    If xCount < 1 Then
        MsgBox "the entered number of rows is error, please enter again", vbInformation, "Kutools for Excel"
        GoTo LableNumber
    End If
    For i = 1 To xCount
        ActiveCell.EntireRow.Cells(1, "A").Copy ActiveCell.Offset(i, 0).EntireRow.Cells(1, "A")
        ActiveCell.EntireRow.Cells(1, "C").Copy ActiveCell.Offset(i, 0).EntireRow.Cells(1, "C")
        '...
    Next
End Sub
N.B. ce code n'insère pas de ligne ! si c'est nécessaire, alors il faut insérer des lignes vide avant de copier.
 

svoglimacci

Grand Maître
#8
@drul, pour ne pas nommer les "lettres" de partout, ne peut-on pas faire
Code:
Dim colonnesATraiter() As String = {"a", "b", "d", "j", "k", ...}
For Each maColonne As String In colonnesATraiter
        // et donner ici les instructions pour la "colonne" maColonne
Next
?
Ainsi la liste des "lettres" nommant les colonnes n'apparaît qu'une fois, de manière groupée et surtout peut être déclarée au début.
@Romai97 tu vois ce qu'on veut dire ?
(merci à Microsoft pour la doc et pour l'exemple)
P.S. Remanié pour coller à l'exemple
 

Romai97

Nouveau membre
#9
J'ai essayer avec le code que @drul a posté mais ça fonctionne pas très bien vu que quand je mets le code pour insérer les lignes , il me mets une ligne vide et copie sur la lignes suivante pas sur la bonne ligne.

Code:
Sub test()
'Updateby Extendoffice 20160616
    Dim xCount As Integer
LableNumber:
    xCount = Application.InputBox("Number of Rows", "Kutools for Excel", , , , , , 1)
    If xCount < 1 Then
        MsgBox "the entered number of rows is error, please enter again", vbInformation, "Kutools for Excel"
        GoTo LableNumber
    End If
    For i = 1 To xCount
        ActiveCell.EntireRow.Cells(1, "A").Copy ActiveCell.Offset(i, 0).EntireRow.Cells(1, "A")
        ActiveCell.EntireRow.Cells(1, "C").Copy ActiveCell.Offset(i, 0).EntireRow.Cells(1, "C")
        '...
    Next
    'ActiveCell.EntireRow.Copy
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(xCount, 0)).EntireRow.Insert Shift:=xlDown
    'Application.CutCopyMode = False
End Sub
 

Romai97

Nouveau membre
#10
Vous pouvez me donner une structure de code plus complet s'il vous plait car comme ça en bref je suis bloqué , je débute en VBA.

Merci
 

Romai97

Nouveau membre
#11
J'ai oublié de préciser que dans une colonne, je veux faire un incrémentation.

C'est à dire que par exemple dans une première ligne j'ai 1 et les autres lignes insérer 2,3,4 jusqu'au nombre de lignes insérer.
comment pourrais - je faire.

merci pour votre aide.
 

drul

Obscur pro du hardware
Staff
#12
Décompose, essaye par étape, fait du pas à pas pour comprendre ce code ...

Pour le problème que tu viens de poster c'est extrement simple avec la boucle, "i" contenant la la valeur que tu désires ...

N.B. nous ne ferons pas ton code, le but ici est de t'aider à progresser, nous ne sommes pas des sous-traitant ...
 

Romai97

Nouveau membre
#13
oui j'ai compris,
dans mon for j'ai mis ce petit code ActiveCell.EntireRow.Cells(1, "AG").Selection.AutoFill
mais sa fonctionne pas.
 

drul

Obscur pro du hardware
Staff
#14
Pourquoi: ".selection." rien à faire ici ...
un truc genre:
ActiveCell.EntireRow.Cells(1, "AG"). Offset(i,0).Value = ActiveCell.EntireRow.Cells(1, "AG"). value+i

serait plus à propos ...
 

Romai97

Nouveau membre
#15
Merci beaucoup ça fonctionne très bien.
 

svoglimacci

Grand Maître
#16
@Romai97, si tu débutes en programmation en général et dans un langage en particulier, il faut réellement que tu traduises ton besoin (pour toi) en mots, en français.
1) Tu t'expliques ce que tu dois faire au niveau global (je choisis ma ligne, je lis le nombre d'enfants, j'insère autant de lignes que d'enfants, je copie les cellules machin dans ...). Dans le détail, c'est mieux.

Ensuite, pour l'apprentissage des "instructions",
2) Tu testes au fur et à mesure (c'est ma méthode) pour valider l'utilisation d'une et une seule fonction. Par exemple, pour lire le contenu d'une cellule, "je lis la cellule A1, je l'affiche, ça marche" puis "je lis une cellule moins simple (G12 ?), je l'affiche, ça marche" puis "je mets une valeur délirante dans la cellule que je dois lire (genre 3141592654) pour être certain que je ne trompe pas de cellule, je l'affiche, ça marche". Ca y est, tu es certain de savoir lire une cellule, et surtout lire la bonne.
Et surtout tu ne fais pas cela dans un programme complet, mort assurée. Tu te crées une petite macro pour tester la lecture d'une cellule, point.
Bien entendu, il en va de même pour l'écriture dans une cellule.
Bien entendu il en va de même pour l'insertion de lignes.
Bien entendu, il en va de même pour les boucles, etc.

Pour la programmation,
3) Pour ton programme (c'est ma méthode) construis le "de l'extérieur vers l'intérieur". Je lis la valeur du nombre d'enfants, je l'affiche, c'est bon. Je change la valeur, je l'affiche, c'est bon. Ok, on passe à la suite. J'insère 3 lignes, je vérifie, c'est bon. Je recommence en insérant le nombre de lignes réel (cellule du nombre d'enfants) je vérifie, c'est bon. Je boucle sur le nombre de lignes, je teste en affichant dans la boucle la valeur de l'incrément, puis en affichant le numéro de la ligne que cela donne. Puis je copie le contenu d'une des cellules, Je teste. Etc.

Ce genre de méthode "pas à pas" diminue beaucoup le risque d'un débug éprouvant.

J'espère que cette méthodologie t'aidera. Relis tranquillement, c'est long mais je pense clair.
Et désolé pour la tartine, je suis bavard :D
 
Appréciations: drul
Vous devez vous inscrire ou vous connecter pour répondre ici.
Staff en ligne
  • job31
    Admin tout frippé
  • PriceTF141
    Modo hardware RGB
  • MagicVitalic
    Modérateur
Membres en ligne
  • job31
  • longaripa
  • papynaze
  • dedzix
  • PriceTF141
  • MagicVitalic
  • Shuro_PC
  • vaelis
  • Stormb
  • Franck@
Derniers messages publiés
Statistiques globales
Discussions
864 994
Messages
8 053 942
Membres
1 575 481
Dernier membre
lescal63
Partager cette page
Haut