Copie de ligne suivant variable

Gaffy84

XLDnaute Nouveau
Hello World,

Voici maintenant quelques jours que je passe de Forum en Forum à la recherche d'information. Et maintenant je vais avoir besoin de vous car je bloque vraiment. Je suis pas un grand développeur, je bidouille comme je peux et j'essaye très souvent de reprendre des exemples pour arriver à mes fins. :eek:

Voici mon besoin :

J'ai 2 onglets. "Onglet1" comprenant certaines informations et "Onglet2 reprenant certaines informations de "Onglet1".

Dans "Onglet1" j'ai une cellule "B3" qui change assez souvent. Elle représente le nombre de ligne nécessaire à une liste de commandes plus bas (Entre 1 et 32). Il peut donc y avoir des lignes de commande entre A5 et A37. Après ces lignes de commandes il y a d'autres lignes non nécessaire.

Je voudrais que ma Macro sachent combien de ligne ont été prises pour les commandes, et ensuite copier ces lignes dans l'onglet 2, à partir de la ligne "A5".

Autre subtilité :eek:. Je ne veux copier que certaines informations de la ligne de commande et pas simplement faire une copie complète de ligne. Chaque information que je souhaite récupérer est dans une colonne avec un nom bien particulier (Ex : ID Commande).

Voici un exemple concret :

Cellule B3 = 12
Je récupère les informations que je souhaite dans certaines colonnes. Pour la colonne ID commande je récupère les 12 ID commandes qu'elle contient.

Ensuite je les colle dans la colonne ID commande présente en "Onglet2".

Si vous pouviez me faire un macro juste pour la copie de ID commande en fonction du nombre de commande je serai l'adapter à les autres colonnes.

Merci bien !:cool:
 
G

Guest

Guest
Re : Copie de ligne suivant variable

Bonjour Gaffy84 et bienvenue pour ce premier message,

Si vous pouviez me faire un macro juste pour la copie de ID commande en fonction du nombre de commande je serai l'adapter à les autres colonnes.

Tu comprendras que nous sommes ici sur un forum d'échange et non sur un marché à la macro. Aussi nous demandons un minimum de travail au demandeur. Hors dans ta demande tu ne fournit aucun fichier, aucune macro que tu aurrais commencé et sur laquelle nous pourrions travailler avec toi.

Un petit tour du côté de la chartre du forum serait bienvenu

A+
 

Maurel2305

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Bonjour,

J'ai appris le VBA "sur le tas", donc si mon écriture n'est pas conventionnelle, vous m'excuserez. Autre chose, il est possible que je n'ai pas compris la/les subtilités de la demande...

Si toutes les commandes comportent un ID, tu n'as même pas besoin de macro pour connaître le nb de lignes : il suffit de la formule (dans l'onglet "Onglet 1") =Nbval(A5:A37) dans la cellule B3.

Ensuite, pour la macro de collage de la colonne ID vers l'autre onglet, en l'absence de précision sur le début de la cellule de destination, j'ai supposé qu'on collerait dans l'onglet 2, à partir de la cellule A5. Par ailleurs, pour ne pas bousiller la mise en page de l'onglet 2, je fait copier uniquement les valeurs sans la mise en forme de l'onglet 1
Voici l'extrait du code :

If Range("B3").Value > 0 Then
Sheets("Onglet 1").Select
Range("A5:A" & Range("B3").Value + 4).Copy

Sheets("Onglet 2").Select
Range("A5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
MsgBox "Collage OK"
Else: Exit Sub
End If

Bonne continuation !
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Bonjour Gaffy84 et bienvenue pour ce premier message,



Tu comprendras que nous sommes ici sur un forum d'échange et non sur un marché à la macro. Aussi nous demandons un minimum de travail au demandeur. Hors dans ta demande tu ne fournit aucun fichier, aucune macro que tu aurrais commencé et sur laquelle nous pourrions travailler avec toi.

Un petit tour du côté de la chartre du forum serait bienvenu

A+

Et je m'en excuse. Le problème étant que mon fichier ne comprend pas que cette Macro, j'ai environ 13 onglets et le crole de ma macro commence à devenir assez petit. De plus je travail sur un projet commercial sur lequel je ne peux pas trop divulguer d'informations. Reste que si nécessaire je peux toujours essayer d'alléger un maximum le fichier, le limiter à 2 Feuil et ensuite supprimer l'intégralité des macro tout en changeant le contenu des Feuil.

Je me suis dis que vu mon niveau la réponse pouvait être assez simpliste.
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Bonjour,

J'ai appris le VBA "sur le tas", donc si mon écriture n'est pas conventionnelle, vous m'excuserez. Autre chose, il est possible que je n'ai pas compris la/les subtilités de la demande...

Si toutes les commandes comportent un ID, tu n'as même pas besoin de macro pour connaître le nb de lignes : il suffit de la formule (dans l'onglet "Onglet 1") =Nbval(A5:A37) dans la cellule B3.

Ensuite, pour la macro de collage de la colonne ID vers l'autre onglet, en l'absence de précision sur le début de la cellule de destination, j'ai supposé qu'on collerait dans l'onglet 2, à partir de la cellule A5. Par ailleurs, pour ne pas bousiller la mise en page de l'onglet 2, je fait copier uniquement les valeurs sans la mise en forme de l'onglet 1
Voici l'extrait du code :

If Range("B3").Value > 0 Then
Sheets("Onglet 1").Select
Range("A5:A" & Range("B3").Value + 4).Copy

Sheets("Onglet 2").Select
Range("A5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
MsgBox "Collage OK"
Else: Exit Sub
End If

Bonne continuation !

Merci pour ton aide. Je test desuite et je reviens vers toi :)
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Alors cela ne fonctionne pas encore. Cela me ramène aucunes données sur l'autre Feuil.

Mais bon j'ai fais un effort aussi et j'ai adapté mon projet pour pouvoir le diffuser.

J'ai supprimé l'essentiel. Donc je refais l'explication en fonction de la pièce jointe :

- L'action se fait sur le bouton "ExportCRCMD" sur l'onglet "Tableau de Pilotage"

- La macro trouve le "nb ligne FO". Cette cellule peut varier entre 1 et 32.

- Si il y a 3, il y aura donc 3 lignes "Data FO" à partir de A5. Si il y en a 31, il y aura 31 lignes "Data FO" à partir de A5.

- Avec la valeur de la cellule "nb ligne FO" (B3) elle va copier certaines informations des lignes "Data FO" dans l'onglet CRCMD à partir de A5.

- J'ai mis ces informations en orange pour mieux comprendre. Je rappel le sens. Copie de données de la Feuil CMD à la Feuil CRCMD

Par rapport à ton exemple Maurel2305, je ne comprends pas pourquoi tu rajoutes 4 à la valeur de B3 ?

Merci Messieurs,

PS : Je suis disponible pour faire tous les efforts du monde et finir cette macro :D
 

Pièces jointes

  • Macro_Gaffy84.zip
    23.8 KB · Affichages: 32
Dernière édition:

Maurel2305

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Gaffy84,

la macro ne fonctionnait pas à cause d'une erreur de référence à la feuille voulu. Par ailleurs, avec ton doc, j'ai adapté les cellules de destination.

If Worksheets("CRCMD").Range("B3").Value > 0 Then
Worksheets("CMD").Select
Worksheets("CMD").Range("B5:B" & Range("B3").Value + 4).Copy

Worksheets("CRCMD").Select
Worksheets("CRCMD").Range("B5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
MsgBox "Collage OK"
Else: Exit Sub
End If


bonne journée, je retourne bosser ;)
 
G

Guest

Guest
Re : Copie de ligne suivant variable

Re,

Une autre proposition:
Ne copie que les valeurs des colonnes idoines

Code:
Private Sub btn_Export_CRCMD_Click()
    Dim NbrLignes As Long
    Dim shSource As Worksheet, shDest As Worksheet
    Dim PlageDest As Range
    Set shSource = Sheets("CMD")
    Set shDest = Sheets("CRCMD")
    NbrLignes = shSource.Range("B3")
    With shDest
        Set PlageDest = shDest.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(NbrLignes, 3)
        PlageDest.Value = shSource.Range("A5").Resize(NbrLignes, 3).Value
        PlageDest.Offset(, 5).Resize(NbrLignes, 1) = shSource.Cells(5, 4).Resize(NbrLignes, 1).Value
        PlageDest.Offset(, 6).Resize(NbrLignes, 3) = shSource.Cells(5, 11).Resize(NbrLignes, 3).Value
        PlageDest.Offset(, 12).Resize(NbrLignes, 3).Value = shSource.Cells(5, 5).Resize(NbrLignes, 3).Value
    End With
End Sub

A+
 
Dernière modification par un modérateur:

Maurel2305

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Par rapport à ton exemple Maurel2305, je ne comprends pas pourquoi tu rajoutes 4 à la valeur de B3 ?

Tout simplement parce que tu ne commences pas le début du tableau à la ligne 1. Cette façon de sélectionner les cellules marche même s'il y a des cellules vides dans les données à copier (sinon, il existe d'autres méthodes de sélection plus simples). Par exemple, on a 3 lignes de commandes, donc tu souhaites copier les données des cellules B3 à B7 (7=3+4).
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Re bonjour,

Veuillez m'excuser pour la lenteur de ma réponse. J'ai essayé 2 choses :

- Bien comprendre le code de Hasco que j'ai réutilisé et qui a marché du 1er coup !
- Intégrer dans ce code les résultat d'un parseur que j'ai fais avec la fonction STXT

Problème. J'arrive pas bien à comprendre le bout de la macro. J'ai essayé de comprendre avec un espion, en pas à pas mais je crois en faite qu'il me manque des bases indispensable. Etant donné que j'aime me prendre la tête :)...

Hasco est ce que tu veux bien vite fait me commenter ton code que j'arrive bien à l'intégrer et qu'ensuite j'arrive à y intégrer ma fonction :) ?

Merci bien,
 
G

Guest

Guest
Re : Copie de ligne suivant variable

Bonjour,

Voici la macro commentée.
Pour les décalage de la plage source et destination, j'ai commenté les premières. Essaie de suivre et comprendre le raisonnement, en t'aidant éventuellement de l'aide en ligne excel sur les méthodes .Offset et Resize.

Fait tes propres tests et si tu n'y arrive pas, reviens poser une question.

Code:
Option Explicit
Private Sub btn_Export_CRCMD_Click()
    Dim NbrLignes As Long 'Nombre de lignes à copier
    'Feuille source et feuille destination
    Dim shSource As Worksheet, shDest As Worksheet
    'Plage calculée de destination de la copie
    Dim PlageDest As Range
    'initialisation des références au feuilles
    Set shSource = Sheets("CMD")
    Set shDest = Sheets("CRCMD")
     'Récupération du nombre de ligne
    NbrLignes = shSource.Range("B3")
    'Travailler sur la feuille destination
    With shDest
        'Calculer la plage de destination:
        'Dernière Cellule occupée de la colonne A: Range("A" & Rows.Count).End(xlUp)
        'Decaler cette cellule d'une ligne pour avoir la prochaine cellule libre: .Offset(1)
        'Retailler au nombre de lignes et colonnes necessaires: .Resize(NbrLignes, 3)
        Set PlageDest = shDest.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(NbrLignes, 3)
 
        'y placer les valeurs de la plage source concernée:
        'Plage Source = A5 retailler aux nombres de lignes voulues et de 3 colonnes
 
        PlageDest.Value = shSource.Range("A5").Resize(NbrLignes, 3).Value
        'Après c'est simplement du décalage et retaillage de plage à partir de la plageDest définie plus haut.
        PlageDest.Offset(, 5).Resize(NbrLignes, 1) = shSource.Cells(5, 4).Resize(NbrLignes, 1).Value
        PlageDest.Offset(, 6).Resize(NbrLignes, 3) = shSource.Cells(5, 11).Resize(NbrLignes, 3).Value
        PlageDest.Offset(, 12).Resize(NbrLignes, 3).Value = shSource.Cells(5, 5).Resize(NbrLignes, 3).Value
    End With
End Sub

A+
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Ok merci je commence à intégrer. Donc la j'essaie d'intégrer la cellule que j'ai parsé. J'ai créé une autre feuille et y posant les données parsé cellule par cellule.

Et j'intègre cette cellule source avec l'autre cellule source "CMD" (shSource).

Mais je n'arrive pas bien à comprendre le Cells(5, 11). J'ai compris que c'est une sorte de condition mais je sais pas à propos de quoi. Je n'arrive pas à trouver à quoi elle se réfère.

Je vous posterai mon morceau une fois terminé. Désolé mais je débute.

Merci pour ta réponse,

J'essaie
 

Gaffy84

XLDnaute Nouveau
Re : Copie de ligne suivant variable

Par contre. Quand je compte à partir de la colonne A à D, par exemple, ca me 4 car de la colonne A je commence à 1. Mais si je dois commencer à 0 cela change tout.

Par exemple pour la colonne Etape NO cela correspondrat bien à shSource.Cells(5, 5) si je commence à compter à partir de 1. Et PlageDest.Offset(, 12) si je commence à compter à partir de 0.

Je comprends pas !!!!!!!!!!!!!!!! :'(
 
G

Guest

Guest
Re : Copie de ligne suivant variable

bonjour,

La première plageDest commence à A (colonne 1) si tu la décale (Offset) de 11 colonnes tu obtiens 12 (L)

C'est pas toi qui compte c'est excel. Il faut bien distingué d'où tu pars et où tu vas.

A+
 

Discussions similaires

Réponses
22
Affichages
914
Réponses
8
Affichages
345
Réponses
8
Affichages
441