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 :

Insérer et transposer des lignes selon le nombre des données dans une cellule, avec VBA [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Insérer et transposer des lignes selon le nombre des données dans une cellule, avec VBA
    Salut tout le monde
    Je suis nouveau dans le forum vba Script, et évidement j'aimerais avoir un peu d'aide pour résoudre un petit problème (j’espère ).
    Pour commencer je précise que je ne suis pas BON en vba; car j'ai débuté il y a quelques jours => je développe une petite plateforme web, mais j'ai besoin de traiter quelques données sur excel avant de les insérer dans ma base des données.

    Actuellement je travaille avec office 2007

    Quel type de travail dois je réaliser?


    J'ai avec moi un tableau (feuille excel) dans lequel j'ai deux champs (pour simplifier car potentiellement je pourrais avoir plusieurs champs) "Adresse_IP" et le deuxième "Numéro_de_Serie". Ces deux colonnes contiennent respectivement des @ IP et des numéro des séries des switch.

    Cependant il existe certaines CELLULES dans la colonne Numero_de_Serie qui pressentent plusieurs numéros des séries séparés par des "/" (conséquence de la présence d'une pile de switch => plusieurs switch seront gérés grâce à une seule adresse ip). C'est ici le problème, car j'aimerais tout d'abord séparer ces numéros de série grâce à "/" puis les introduire les un à la suite des autres sur la même colonne en redondant l'adresse ip en parallèle sur la colonne @_IP.

    Je poste ici deux images pour mieux comprendre mon délire

    Première image: La feuille de calcule dans son état initial, en couleur jaune les lignes a modifier pour les séparer et puis les transposer.
    Deuxième image: "Le résultat" => j'aimerais avoir dans une autre feuille ce résultat comme dans l'image; en couleur jaune les données transposées et les @ IP repliquées.
    Nom : Captures.PNG
Affichages : 585
Taille : 54,2 Ko
    Évidemment je peux avoir le résultat par des procédés basique sur excel avec quelques manipulations. Mais quand le nombre des données à traiter dépasse les 1 000 lignes ça devient rapidement fastidieux Puis surtout que cette tache devra se faire automatiquement chaque semaine sur des fichiers ayant la même nomenclature et quantité des données, alors le faire à la mano ou avec des formules n'est pas une option...

    Alors si quelqu'un a une idée de comment réaliser un petite macro pour gérer ce problème, je suis partant. je lirai bien vos suggestions et je vais essayer d'apprendre un peu plus de ce langage (tout neuf pour moi )

    Je mets à disposition un petit fichier avec quelques données comme exemple, merci d'avance pour votre aide . je reste à votre disposition si vous trouvez que je n'ai pas été très claire dans mes explication...

    Bonne soirée
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution possible avec ce code :

    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
    42
    Sub TransposerALaLigneAvecSplit()
     
    Dim AireSource As Range
    Dim CelluleSource As Range
    Dim LigneDeTitreSource As Long
    Dim DerniereLigneSource As Long
     
    Dim LigneEnCoursCible As Long
     
    Dim CtrJ As Long
     
    Dim NumerosSeries As Variant
     
        Sheets("Cible").Cells.ClearContents
     
        With Sheets("Source") ' A adapter
             LigneDeTitreSource = 1
             DerniereLigneSource = .Cells(.Rows.Count, 1).End(xlUp).Row
             Set AireSource = .Range(.Cells(LigneDeTitreSource + 1, 1), .Cells(DerniereLigneSource, 1))
        End With
     
        With Sheets("Cible")  ' A adapter
             .Range(.Cells(1, 1), .Cells(1, 2)) = Array("@ IP", "Serial_Number")
             .Cells.HorizontalAlignment = xlCenter
             LigneEnCoursCible = 2
             For Each CelluleSource In AireSource
                 NumerosSeries = Split(CelluleSource.Offset(0, 1), "/")
                 For CtrJ = LBound(NumerosSeries, 1) To UBound(NumerosSeries, 1)
                     .Cells(LigneEnCoursCible, 1) = CelluleSource
                     .Cells(LigneEnCoursCible, 2) = NumerosSeries(CtrJ)
                     If UBound(NumerosSeries) > 1 Then
                        .Range(.Cells(LigneEnCoursCible, 1), .Cells(LigneEnCoursCible, 2)).Interior.Color = RGB(255, 255, 0)
                     End If
                     LigneEnCoursCible = LigneEnCoursCible + 1
                 Next CtrJ
            Next CelluleSource
            .Activate
        End With
     
        Set AireSource = Nothing
     
    End Sub
    Cordialement.

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    autres possibilités un peu plus au niveau d'un débutant :

    • copie ligne par ligne :
    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
    Sub Demo1()
                Dim SP$()
                Application.ScreenUpdating = False
                Feuil2.UsedRange.Clear
                                        D& = 2
        With Feuil1.UsedRange.Rows
                .Item(1).Copy Feuil2.Cells(1)
            For R& = 2 To .Count
                SP = Split(.Cells(R, 2).Value, "/")
                L& = 1 + UBound(SP)
                Feuil2.Cells(D, 1).Resize(L).Value = .Cells(R, 1).Value
                Feuil2.Cells(D, 2).Resize(L).Value = Application.Transpose(SP)
                 D = D + L
            Next
        End With
                Feuil2.Activate
                Application.ScreenUpdating = True
    End Sub

    • Copie globale puis insertion :
    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
    Sub Demo2()
                Dim SP$()
                Application.ScreenUpdating = False
        With Feuil2
                .UsedRange.Clear
                Feuil1.UsedRange.Copy .Cells(1)
            For R& = .UsedRange.Rows.Count To 2 Step -1
                          SP = Split(.Cells(R, 2).Value, "/")
                If UBound(SP) > 0 Then
                    .Rows(R + 1).Resize(UBound(SP)).Insert
                    .Cells(R, 1).Copy .Cells(R + 1, 1).Resize(UBound(SP))
                    .Cells(R, 2).Resize(1 + UBound(SP)).Value = Application.Transpose(SP)
                End If
            Next
                .Activate
        End With
                Application.ScreenUpdating = True
    End Sub
    Rappel de l'usage de ce forum :
    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    ______________________________________________________________________________________________________
    Je suis Paris, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Décembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Bonjour Eric et Marc

    J'ai lu le code de Eric, j'ai compris la démarche et j'ai pu l'adapter à mes besoins et cela marche!! , je cherchais exactement ça. Très bon code et assez simple.
    Merci beaucoup Eric!!

    Marc j'ai lu ton code aussi (mais pas encore testé! je vais le faire aussi, comme ça j'aurai le choix ) il a l'aire souple et comme tu dis pour les débutants => exactement ce que je cherchais aussi.
    Merci beaucoup Marc!!

    Je considère mon problème comme résolu dans ce cas...

    Encore un grand merci tous les deux et un bon réveillon

    Cordialement

    Juan Pablo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/03/2015, 16h32
  2. Copier coller des lignes en fonction de la valeurs d'une cellule
    Par Tyu38 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/09/2014, 09h38
  3. Réponses: 5
    Dernier message: 21/12/2011, 08h31
  4. [MySQL] Insérer des données dans une table avec Foreach
    Par Gogad dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/04/2010, 08h53

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