IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Insertion colonnes puis lignes suivant conditions.


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Insertion colonnes puis lignes suivant conditions.
    Bonjour à tous, j'espère pouvoir trouver de l'aide..

    j'ai un tableau excel (voir pièces jointes) et j'aimerais par une macro y ajouter des colonnes à des endroits précis. Ensuite pour chaque ligne, regarder la donnée présente dans la colonne "type de câble" et fonction de la valeur, ajouter en dessous un certain nombre de ligne et y recopier le contenu de la ligne existante.

    le fichier joint sera beaucoup plus parlant je pense.

    Merci d'avance pour votre aide.
    David
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Démarrez le projet Excel VBA en décrivant la feuille par des constantes
    saphir78, dans le VBE (Alt+F11) d'Excel, insérer un nouveau module Module1.

    Définir les constantes de colonne colTenant, colRoomTenant, etc. jusqu'à colTypeCable en prenant en compte que les nouvelles colonnes colBornier1 et colBorne1 ainsi que colBornier2 et colBorne2 ont déjà été insérées.

    Définir les constantes de libellés des colonnes à insérer. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
    Public Const colSignal = 1  ' Première colonne
    Public Const colTenant = colSignal + 1
    ' ...
    Public Const nameColBornier = "Bornier" ' Colonne à insérer après colTenant et ...
    Définir les constantes de la rangée du 1er actionneur ainsi que celle du dernier.
    Définir la ou les constantes des types de câble particuliers dont la ou les valeurs commenceraient à partir de 1050.

    C'est le nom de la constante dans un processus de structuration et de description de votre feuille de calcul qui est intéressant et non la valeur de la constante. Bien évidemment ce que l'on attend est de lire le commentaire associé à la constante.

    Mieux préciser "recopier la ligne existante" en terme de source de données et de cible.

    • Source : quelle ligne faut-il copier ?
    • Cible : où faut-il la recopier ? Sur la 1ere ou la seconde ou les deux lignes insérées sous l'actionneur de type câble 1050.


    Si on recopie l'actionneur de type de câble 1050, on va se retrouver avec deux nouvelles lignes éventuellement (à préciser) avec le type de câble 1050. Faut-il sauter ces lignes nouvelles créées bien qu'elles ont ou n'ont pas le type de câble 1050 ? Résoudre l'ambiguïté dans le balayage des actionneurs existants par rapport aux lignes insérées qui peuvent être également la copie d'actionneur de même type.

    Autrement dit donner un exemple minimal de résultat attendu sans forcément fournir un nouveau .xls.

    Partir du code de l'enregistreur de macro lors de l'insertion des colonnes colBornier1 et colBorne1, remplacer les Range sélectionnés par les constantes nouvellement définies ou au moins commenter le code généré. Cela donnera le point d'entrée -- le nom -- de la macro qui réalisera l'insertion des nouvelles colonnes et plus tard la gestion des actionneurs par type.
    ___________

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour MattChess et merci pour ta réponse rapide.

    Pour répondre:
    Source : est la ligne où on va trouver notre donnée 1050
    Cible : les 2 lignes insérées sous l'actionneur de type câble 1050.

    J'ai un peu avancé et j'ai une macro qui me rajoute mes lignes correctement mais maintenant c'est le copié coller que je n'arrive pas a insérer dans ma macro.

    voilà ma macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Private Sub CommandButton1_Click()
    i = 2
    j = 0
    'ajout du nombre de ligne en fonction des brins du cable'
    While Range("A" & i).Value <> ""
        If Range("R" & i).Value = 1050 Then
            j = 1
            Rows(i + 1).Resize(j).Insert Shift:=xlDown
        Else
            If Range("R" & i).Value = 1051 Then
            j = 2
            Rows(i + 1).Resize(j).Insert Shift:=xlDown
            Else
                If Range("R" & i).Value = 1052 Then
                j = 3
                Rows(i + 1).Resize(j).Insert Shift:=xlDown
                Else
                End If
            End If
        End If    
    i = i + j + 1
    Wend
    End Sub
    Merci d'avance

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Une proposition (j'ai pris la colonne K est celle du type câble)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub MaMacro()
    Dim LastLig As Long, i As Long
    Dim N As Integer
     
    Application.ScreenUpdating = False
    With ThisWorkbook.Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        For i = LastLig To 2 Step -1
            N = Val(.Range("K" & i).Value) - 1048
            If N > 0 Then
                .Rows(i).Copy
                .Rows(i + 1 & ":" & i + N).Insert
                Application.CutCopyMode = False
            End If
        Next i
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut
    saphir78, la solution ci-dessus est méga courte :

    • avec une règle entre le nombre de brins à dupliquer et le type de câble,
    • une navigation optimale en partant du dernier actionneur et en remontant.


    Ce qui était proposé dans ma première réponse était de décrire la feuille par des constantes afin que l'on puisse comprendre le code dans 6 mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
    Public Const rowActFirst = 3 ' Premier actionneur après l'en-tête
     
    Public Const colSignal = 1  ' Première colonne le signal est ...
    Public Const colTenant = colSignal + 1 ' N° d'actionneur
    ' ... à compléter
    Public Const colTypeCable = 11 ' colonne "J" contient le type de cable tel que 1050
     
    Public Const typeCable1050 = 1050 ' Trouver un nom plus explicite
    Public Const typeCable1051 = 1051 ' cable ...
    Public Const typeCable1052 = 1052 ' cable ...
     
    Sub BtnBrin_Click()
    Dim indRow As Integer, nbrBrin As Integer, typeCable As Integer, indBrin As Integer
     
        indRow = rowActFirst
        While Cells(indRow, colSignal) <> ""
            typeCable = CInt(Cells(indRow, colTypeCable))
            Select Case typeCable
            Case typeCable1050
                nbrBrin = 1
     
            Case typeCable1051
                nbrBrin = 2
     
            Case typeCable1052
                nbrBrin = 3
     
            Case Else
                nbrBrin = 0
            End Select
            If nbrBrin > 0 Then ' Gestion des brins
                Rows(indRow + 1).Resize(nbrBrin).Insert Shift:=xlDown ' Insertion sous l'actionneur
                For indBrin = 1 To nbrBrin  ' Dupliquer l'actionneur courant
                    Rows(indRow).Copy Rows(indRow + indBrin) ' dans chaque brin.
                Next
                indRow = indRow + nbrBrin ' Sauter les brins ajoutés
            End If
            indRow = indRow + 1
        Wend
    End Sub
    Notez que les noms des variables sont plus explicites. Il faut :

    • Typer les variables, c-a-d déclarer les variables juste après la déclaration de la procédure.
    • Eviter l'usage de variables dont le nom tient sur une seule lettre.
    • Eviter l'usage de noms de colonnes en dur dans le code tels que Range("A" & i) et Range("R" & i) en les remplaçant par Cells(indRow, colSignal) et Cells(indRow, colTypeCable). C'est plus rapide à l'exécution, paramétrable, lisible, maintenable, etc...


    On n'a pas souhaité déduire une règle d'optimisation entre le type de câble et le nombre de brin. Bien au contraire on a voulu différencier chaque type de câble en les nommant explicitement dans le cas où on aurait à faire un traitement particulier par type de câble.

    On a voulu que le code soit le plus proche possible du domaine (actionneur, câble, brin), c-a-d compréhensible par la personne qui aura à relire le code dans un futur lointain, et paramétrable grâce aux constantes.

    Gestion de brins de câble

    Adaptez les valeurs des constantes en tête du module à la dernière version de votre feuille.

    Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    @mercatog : merci pour ton aide ça marche très bien .

    @MattChess : ta solution est parfaite pour mon utilisation je l'ai adapté est tout marche très bien.

    Encore pour votre aide et vos réponses ultra rapide

Discussions similaires

  1. [XL-2007] Insertion de lignes automatiques avec copie suivant condition
    Par Toresupra dans le forum Excel
    Réponses: 4
    Dernier message: 20/03/2015, 15h23
  2. [XL-2003] Copier une colonne en ligne selon condition
    Par ballix22 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/03/2013, 14h30
  3. Transposition de cellules de colonnes en ligne sous condition
    Par Cyclemmanuel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/03/2012, 11h20
  4. [XL-2007] Somme de lignes suivant condition
    Par VIPNO dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 09/02/2012, 15h57
  5. [XL-2007] Copie Ligne suivant conditions (suite)
    Par alpilon dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 27/11/2009, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo