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 :

Atteindre la cellule en dessous de la cellule "fonction find"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    banque
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : banque

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Par défaut Atteindre la cellule en dessous de la cellule "fonction find"
    Explication 2.xlsx

    Petit fichier excel explicatif


    Bonjour,

    Je crée une macro qui me permet de mettre à jour des données dans des tableaux excels à partir d'un autre fichier excel, pour ce faire VBA supprime les données d'origine dans le tableau sans toucher au titre et copie les nouvelles valeurs de ma base de donnée excel pour venir copier à nouveau dans mes tableaux.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim Rg As Range
     
    'Avec la feuille "ORGANIGRAMME"
    With Worksheets("REPARTITION PART 1")
        'Je set Rg à l'endroit ou se trouve la valeur "T1" dans la colonne 1
        Set Rg = .Columns(1).Find("T1", LookIn:=xlValues, LookAt:=xlWhole)
    End With
     
        Dim NextRow As Long 'Variable qui me permet de trouver le titre du tableau'
    NextRow = ThisWorkbook.Worksheets("REPARTITION PART 1").Range("A" & Rg).End(xlUp).Row + 1
    MsgBox NextRow
    Dim NextRowFinal As Range 'Variable qui me permet de trouver la cellule juste en dessous de mon tableau pour coller les informations'
    Set NextRowFinal = ThisWorkbook.Worksheets("REPARTITION PART 1").Range("A" & NextRow)
    MsgBox NextRowFinal
    Malheureusement il y a une erreur dans mon code mais je ne sais pas laquelle...

    Pourriez-vous m'aider svp

    Cordialement
    Médérick

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Salut mederick,

    Voila pour toi :
    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
    43
    44
    45
    Sub insert_tab()
    'Déclaration des variables
    Dim Rg As Range
    Dim Rg_suiv As Range
     
    'Avec la feuille "REPARTITION PART 1"
    With Worksheets("REPARTITION PART 1")
        'On boucle de i = 1 à i = 3
        For i = 1 To 3
            'On set Rg à l'endroit ou se trouve la valeur "T" & i dans la colonne 1 à savoir T1, T2 et T3 à chaque itération
            Set Rg = .Columns(1).Find("T" & i, LookIn:=xlValues, LookAt:=xlWhole)
            'On set Rg_suiv à l'endroit ou se trouve la valeur "T" & i+1 dans la colonne 1 à savoir T2, T3 et T4 à chaque itération
            Set Rg_suiv = .Columns(1).Find("T" & i + 1, LookIn:=xlValues, LookAt:=xlWhole)
     
            'Si on trouve un Rg_suiv (c'est pour le cas où on a i = 3, on ne trouvera pas de "T4" pour Rg_suiv)
            If Not Rg_suiv Is Nothing Then
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row + 2 < Rg_suiv.Row Then
                    'Alors on supprime toutes les lignes
                    .Rows(Rg.Row + 1 & ":" & Rg_suiv.Row - 2).Delete Shift:=xlUp
                End If
            '... si on ne trouve pas de T4
            Else
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row < .Columns(1).Find("*", , , , , xlPrevious).Row Then
                    'Alors on supprime ce qu'on a en dessous de T3
                    .Rows(Rg.Row + 1 & ":" & .Columns(1).Find("*", , , , , xlPrevious).Row).Delete Shift:=xlUp
                End If
            End If
     
            'Ensuite on insert ce que l'on veut sous le titre T + la valeur de i avec :
            For j = 1 To 2
                'insertion de la ligne
                .Rows(Rg.Row + 1).Insert Shift:=xlDown
     
                'Je te laisse faire en sorte de remplir la suite.
                Rg.Offset(1, 0) = "colonne A" 'Ce que tu veux mettre dans la colonne A
                Rg.Offset(1, 1) = "colonne B" 'Ce que tu veux mettre dans la colonne B
                Rg.Offset(1, 2) = "colonne C" 'Ce que tu veux mettre dans la colonne C
            Next j
     
        Next i
    End With
     
    End Sub
    Je te propose dans un premier temps de tester ce code sur ton fichier exemple.

    J'espère que tu comprendras comment faire pour la suite.

    Cordialement,
    Kimy

  3. #3
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,

    Si tu envoies un fichier, donnes lui, au moins les mêmes noms de feuille. Ton fichier joint (Deuil1, Feuil2, Feuil3), ta macro "Worksheets("REPARTITION PART 1")", ensuite, je regarderai, en attendant, testes ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub titres()
    Dim NextRowFinal As Range, NextRow As Range, Plage As Range
    'Avec la feuille "ORGANIGRAMME"
    With Worksheets("REPARTITION PART 1")
        'Je set Rg à l'endroit ou se trouve la valeur "T1" dans la colonne 1
        Set NextRow = .Columns(1).Find("T1", LookIn:=xlValues, LookAt:=xlWhole)(2, 1)
        Set NextRowFinal = NextRow.End(xlDown)
        Set plage = .Range(NextRow, NextRowFinal)
        MsgBox plage.Address
    End With
    End Sub
    PS : excuses-moi Michael, pas vu ta réponse
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour mederick

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NextRow = ThisWorkbook.Worksheets("REPARTITION PART 1").Range("A" & Rg).End(xlUp).Row + 1
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NextRow = ThisWorkbook.Worksheets("REPARTITION PART 1").Range("A" & Rg.Row).End(xlUp).Row + 1

    Raison : Tu cherches à partir de Range("A" & Rg)

    Comme la valeur de Rg est "T1"

    Range("A" & Rg) est équivalent de Range("AT1")

    Donc mieux vaut Range("A" & Rg.Row) que Range("A" & Rg)

  5. #5
    Membre averti
    Femme Profil pro
    banque
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : banque

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Par défaut
    organigramme.xlsxPORTEFEUILLE PRGE.xlsx

    Bonjour Kimy,

    Merci beaucoup pour ton code, tu as du te donner beaucoup de mal, il est très utile!!

    Ca me montre à quel point j'ai des lacunes en VBA, parce que maintenant le code que tu as crées contient des variables Rg et Rg_suiv, ce qui allège ma macro et évite que tout le code que je faisais jusqu'a présent cependant les données que je vais chercher pour alimenter chacun de mes tableaux dépend des filtres que j'applique à ma grande base de donnée. Avec ta solution il faut que je dise maintenant à VBA en implémentant des variables de copier le nom de la personne attribuée et d'appliquer le filtre à ma base de donnée puis de faire la mise en forme que je faisais dès le départ et de copier ensuite à l'emplacement. (j'avais enregistré ces actions avec l'enregistreur de macro). J'ai envie d'utiliser ta méthode mais je ne sais pas comment faire pour dire à excel de prendre pour chaque j=1 to 2 les valeurs de la personne attribuée, appliquer le filtre et faire les modifs et ensuite coller à l'emplacement.

    je te met en annexe mes docs excels et mes lignes de code. Désolé de t'embêter à nouveau, merci encore

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    'Macro pour benjamin flinch
        Windows("organigramme test.xlsm").Activate 
        Sheets("ORGANIGRAMME").Select
     
        Dim variable3 As String
    With Worksheets("ORGANIGRAMME") 'le nom des personnes pour appliquer le filtre sont contenus dans les cellules "B13 à B15"
        variable3 = .Range("B15") 'c'est le 3ème nom donc qui définie les données à copier dans le 3ème tableau de la feuille "Répartition PART 1"
     
    End With
     
        Windows("PORTEFEUILLE PRGE_Liste des PM_032014.xlsm").Activate
        ActiveSheet.Unprotect
        ActiveWindow.WindowState = xlNormal
        ActiveWindow.WindowState = xlNormal
        Sheets("PORTEF PRGE").Select 'sur cette feuille dans le classeur Portefeuille PRGE se trouve la base de données'
     
        Range("A4").Select 'je sélectionne l'ensemble des cellules du tableau de la base de données
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
     
        Selection.AutoFilter Field:=3, Criteria1:=variable3, Operator:=xlAnd 'j'applique le filtre avec la variable définie
     
        Range("A4").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Application.CutCopyMode = False
        Selection.Copy 'je copie après avoir filtré les données dans une nouvelle feuille du classeur 
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Paste
        Rows("1:1").Select 'je fais la mise en forme des données
        Application.CutCopyMode = False
        Selection.Delete Shift:=xlUp
        Columns("H:J").Select
        Selection.Delete Shift:=xlToLeft
        Columns("C:D").Select
        Selection.Delete Shift:=xlToLeft
     
     
    Dim rng3 As Range 'comme tu m'as donné ce code me permet de remplacer les valeurs de la colonne E par la colonne C s'il n'y a rien dans la colonne E
     
    With Worksheets(5)
        Set rng3 = .Range("C1")
        For i = 0 To .Columns(3).Find("*", , , , , xlPrevious).Row
            If rng3.Offset(i, 2) = "" Then
                rng3.Offset(i, 2) = rng3.Offset(i, 0)
            End If
        Next i
    End With
     
        Columns("E").Select 'je finis la mise en forme'
        Selection.Cut
        Columns("B").Select
        ActiveSheet.Paste
     
        Columns("C").Select
        Selection.Delete Shift:=xlToLeft
     
     
        Range("A1").Select  'ici j'enlève les doublons'
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
        ActiveSheet.Range("$A$1:$C$3000").RemoveDuplicates Columns:=Array(2, 3), Header _
            :=xlNo
     
        Columns("C:C").Select 'encore de la mise en forme
        With Selection
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        Columns("A:A").EntireColumn.AutoFit
        Columns("B:B").EntireColumn.AutoFit
        Columns("C:C").EntireColumn.AutoFit
     
    'les données seront donc supprimées par ton bout de macro ensuite je dois coller les données que j'ai travaillées sur ma base de donnée'
     
        Windows("organigramme test.xlsm").Activate
        Sheets("REPARTITION PART 1").Select
        ActiveSheet.Unprotect
     
     
        Windows("PORTEFEUILLE PRGE_Liste des PM_032014.xlsm").Activate
        Sheets(5).Select '5ème feuille car j'ai à la base 2 feuille dans mon classeur PORTEFEUILLE PRGE_Liste des PM_032014.xlsm puis pour chaque tableau se crée une feuille et ici c'est le 3 ème tableau...
        Range("A1").Select 'je sélectionne mes données modifiées et je les colle dans la première cellule de mon Tableau 3.
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Windows("organigramme test.xlsm").Activate
        Sheets("REPARTITION PART 1").Select
        Range("A21").Select
        Selection.Insert Shift:=xlDown
    Cordialement
    J'étudie chaque code que tu m'envoie pour mieux comprendre

    Bonjour tout le monde, votre méthode casefayere et Docmarti fonctionne très bien mais Kimy m'a donné envie de bien faire et je me creuse la tête pour essayer de trouver comment poursuivre le travail qu'il a commencé. C'est largement au dessus de ma macro bancale crée pour obtenir ce que je souhaite.

    Très cordialement un grand merci à vous tous pour votre aide honnètement! Sans vous je serai jamais la où j'en suis dans ma macro.

    Médérick

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    mederick,

    Alors, de part ma compréhension du problème, voici ce que je te propose.
    Je suis reparti de ma macro.

    L'insertion se passe de cette manière :
    1) Je regarde le nom dans le tableau sur la cellule Rg + 2 colonnes.
    2) Je fais la comparaison pour savoir son "nouveau" nom dans la table de l'onglet "ORGANIGRAMME".
    3) Je vais chercher ce nouveau nom dans le classeur "PORTEFEUILLE PRGE" sur l'onglet "PORTEF PRGE" en colonne C.
    4) J'insère ensuite dans le tableau initial la valeur que je trouve.

    Tu aurais dû me dire ça dès le début !

    Par contre, je ne comprends pas ce que tu veux mettre dans les colonnes B et C de tes tableaux T1, T2, etc...

    Dernier point, tes tableaux T4 à T6 devrons se trouver sur les mêmes colonnes, à savoir A, B et C si tu veux que la macro fonctionne.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub insert_tab()
    'Déclaration des variables
    Dim Rg As Range
    Dim Rg_suiv As Range
    Dim Rg_final As Range
    Dim nom As String
     
    'Avec la feuille "REPARTITION PART 1"
    With Worksheets("REPARTITION PART 1")
        'On boucle de i = 1 à i = 3
        For i = 1 To 6
            'On set Rg à l'endroit ou se trouve la valeur "T" & i dans la colonne 1 à savoir T1, T2 et T3 à chaque itération
            Set Rg = .Columns(1).Find("T" & i, LookIn:=xlValues, LookAt:=xlWhole)
            'On set Rg_suiv à l'endroit ou se trouve la valeur "T" & i+1 dans la colonne 1 à savoir T2, T3 et T4 à chaque itération
            Set Rg_suiv = .Columns(1).Find("T" & i + 1, LookIn:=xlValues, LookAt:=xlWhole)
     
            'Si on trouve un Rg_suiv (c'est pour le cas où on a i = 4, on ne trouvera pas de "T4")
            If Not Rg_suiv Is Nothing Then
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row + 2 < Rg_suiv.Row Then
                    'Alors on supprime toutes les lignes
                    .Rows(Rg.Row + 1 & ":" & Rg_suiv.Row - 2).Delete Shift:=xlUp
                End If
            '... si on ne trouve pas de T4
            Else
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row < .Columns(1).Find("*", , , , , xlPrevious).Row Then
                    'Alors on supprime ce qu'on a en dessous de T3
                    .Rows(Rg.Row + 1 & ":" & .Columns(1).Find("*", , , , , xlPrevious).Row).Delete Shift:=xlUp
                End If
            End If
     
            'On set "nom" à la valeur située de colonne à droite de TX (X = 1 à 6)
            nom = Rg.Offset(0, 2)
     
            'Si on trouve une correspondace dans l'onglet "ORGANIGRAMME"...
            If Not Worksheets("ORGANIGRAMME").Range("A13:D26").Find(nom, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
                '... alors on remplace "nom" par l'organigramme correspondant
                nom = Worksheets("ORGANIGRAMME").Range("A13:D26").Find(nom, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
            Else
                '... sinon, on affiche une MsgBox
                MsgBox "Le nom " & nom & " ne possède pas d'organigramme."
            End If
     
            'Dans le classeur "PORTEFEUILLE PRGE", sur la feuille "PORTEF PRGE"
            With Workbooks("PORTEFEUILLE PRGE").Worksheets("PORTEF PRGE")
                'On se place sur la cellule C4
                Set Rg_final = .Range("C4")
     
                'De j = 1 à la dernière ligne...
                For j = 1 To .Columns(3).Find("*", , , , , xlPrevious).Row - 3
                    '... si nom est égale à une valeur de la colonne C
                    If Rg_final.Offset(j, 0) = nom Then
                        '... alors dans l'onglet "REPARTITION PART 1" du classeur "Explication 2"
                        With Workbooks("Explication 2").Worksheets("REPARTITION PART 1")
                            '... on insère une ligne
                            .Rows(Rg.Row + 1).Insert Shift:=xlDown
     
                            '... et on met ce qu'on veut dans la ligne insérée
                            Rg.Offset(1, 0) = Rg_final.Offset(j, -2)
                            'Rg.Offset(1, 1) = "colonne B" 'Ce que tu veux mettre dans la colonne B
                            'Rg.Offset(1, 2) = "colonne C" 'Ce que tu veux mettre dans la colonne C
                        End With
                    End If
                Next j
            End With
     
        Next i
    End With
     
    End Sub
    A savoir, je suis parti de ton classeur Explication 2. A toi de changer les bons classeurs et les bons onglets.
    A savoir également, je n'ouvre pas ton classeur "PORTEFEUILLE PRGE" => je considère qu'il est déjà ouvert au moment où tu lances ta macro.

    J'attends ton retour.

    Cordialement,
    Kimy

  7. #7
    Membre averti
    Femme Profil pro
    banque
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : banque

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Par défaut
    Salut Kimy,

    La macro est super, je comprends quasi tout bien que je ne sois pas capable de l'écrire. J'ai modifié les valeurs nécessaires (nom,colonne B et C) en fait la colonne B est égal à la colonne G de Portefeuille PRGE si la valeur est existante (c'est à dire différente de 0) et sinon je disais à excel de copier la copier la valeur existante dans la colonne E (N° BPM) dans la colonne G dans une nouvelle feuille afin de ne pas modifier la base de donnée Portefeuille PRGE (formule que tu m'avais donnée ci dessous).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim Rng As Range
     'Je fixais une variable, je créais une nouvelle feuille, je copiais toutes les infos du tableau relatives au nom recherché'
    With Worksheets(3) 'je copiais la valeur de la colonne E dans la colonne G si G=aucune valeur'
        Set Rng = .Range("C1") 'ensuite cétais à partir de ce fichier que je copiais et collais les infos sur organigramme'
        For i = 0 To .Columns(3).Find("*", , , , , xlPrevious).Row
            If Rng.Offset(i, 2) = "" Then
                Rng.Offset(i, 2) = Rng.Offset(i, 0)
            End If
        Next i
    End With
    Avant cela j'appliquais une suppression des doublons en fonction des colonnes F(Groupe) et G(N°Groupe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Range("A1").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select 'colonnes 2 et 3 car j'avais supprimé des colonnes'
        ActiveSheet.Range("$A$1:$C$3000").RemoveDuplicates Columns:=Array(2, 3), Header _
            :=xlNo
    Je peux remettre ce code dans le dernier code que tu m'as donné mais comment faire pour que ca ne modifie pas ma base de donnée stp?

    Par ailleurs je dois garder la forme de la feuille organigramme (3 tableaux de 3 colonnes), donc peut être que je peut créer la même macro mais en réduisant les For i= 1 à 3 et changeant le nom des variables, ca devrait fonctionner, qu'en penses-tu?

    J'avoue que si j'avais su je t'aurais dit tout ca dès le début mais je t'avoue que je voulais aussi travailler dessus et ne pas te laisser tout faire. Mais grace à ca j'ai compris beaucoup de choses en me perdant dans les explications et cherchant partout. Ca fait 2 semaines que je suis dessus et toi tu trouves direct les solutions!!

    Ci-dessous mon code actualisé avec les noms et colonne B et C définie (je fais excel prendre la colonne G dans portefeuille prge(base de donnée) en me disant qu'on aura copié la colonne E si G=0) mais pas sur qu'il faille faire ainsi.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub insert_tab()
    'Déclaration des variables
    Dim Rg As Range
    Dim Rg_suiv As Range
    Dim Rg_final As Range
    Dim nom As String
     
    'Avec la feuille "REPARTITION PART 1"
    With Workbooks("organigramme test.xlsm").Worksheets("REPARTITION PART 1")
        'On boucle de i = 1 à i = 3
        For i = 1 To 6
            'On set Rg à l'endroit ou se trouve la valeur "T" & i dans la colonne 1 à savoir T1, T2 et T3 à chaque itération
            Set Rg = .Columns(1).Find("T" & i, LookIn:=xlValues, LookAt:=xlWhole)
            'On set Rg_suiv à l'endroit ou se trouve la valeur "T" & i+1 dans la colonne 1 à savoir T2, T3 et T4 à chaque itération
            Set Rg_suiv = .Columns(1).Find("T" & i + 1, LookIn:=xlValues, LookAt:=xlWhole)
     
            'Si on trouve un Rg_suiv (c'est pour le cas où on a i = 4, on ne trouvera pas de "T4")
            If Not Rg_suiv Is Nothing Then
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row + 2 < Rg_suiv.Row Then
                    'Alors on supprime toutes les lignes
                    .Rows(Rg.Row + 1 & ":" & Rg_suiv.Row - 2).Delete Shift:=xlUp
                End If
            '... si on ne trouve pas de T4
            Else
                'Petite condition sur les lignes pour être sur d'avoir quelque chose dans le tableau
                If Rg.Row < .Columns(1).Find("*", , , , , xlPrevious).Row Then
                    'Alors on supprime ce qu'on a en dessous de T3
                    .Rows(Rg.Row + 1 & ":" & .Columns(1).Find("*", , , , , xlPrevious).Row).Delete Shift:=xlUp
                End If
            End If
     
            'On set "nom" à la valeur située de colonne à droite de TX (X = 1 à 6)
            nom = Rg.Offset(0, 2)
     
            'Si on trouve une correspondace dans l'onglet "ORGANIGRAMME"...
            If Not Worksheets("ORGANIGRAMME").Range("A13:D26").Find(nom, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
                '... alors on remplace "nom" par l'organigramme correspondant
                nom = Worksheets("ORGANIGRAMME").Range("A13:D26").Find(nom, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
            Else
                '... sinon, on affiche une MsgBox
                MsgBox "Le nom " & nom & " ne possède pas d'organigramme."
            End If
     
            'Dans le classeur "PORTEFEUILLE PRGE", sur la feuille "PORTEF PRGE"
            With Workbooks("PORTEFEUILLE PRGE_Liste des PM_032014.xlsm").Worksheets("PORTEF PRGE")
                'On se place sur la cellule C4
                Set Rg_final = .Range("C4")
     
                'De j = 1 à la dernière ligne...
                For j = 1 To .Columns(3).Find("*", , , , , xlPrevious).Row - 3
                    '... si nom est égale à une valeur de la colonne C
                    If Rg_final.Offset(j, 0) = nom Then
                        '... alors dans l'onglet "REPARTITION PART 1" du classeur "Explication 2"
                        With Workbooks("organigramme test.xlsm").Worksheets("REPARTITION PART 1")
                            '... on insère une ligne 'ici j'ai un souci ca m'insère une ligne (beige) dans tous le document alors que je voudrais une ligne blanche totalement encadrée (bordure) dans le tableau uniquement...j'essaye de trouver le code pour spécifier cela'
                            .Rows(Rg.Row + 1).Insert Shift:=xlDown
     
                            '... et on met ce qu'on veut dans la ligne insérée
                            Rg.Offset(1, 0) = Rg_final.Offset(j, -2) 'Colonne A tableau organigramme'
                            Rg.Offset(1, 1) = Rg_final.Offset(j, 4) 'Colonne B tableau organigramme'
                            Rg.Offset(1, 2) = Rg_final.Offset(j, 3) 'Colonne C tableau organigramme'
                        End With
                    End If
                Next j
            End With
     
        Next i
    End With
     
    End Sub
    Très ordialement

    Merci Kimy, honestly
    Médérick

  8. #8
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    mederick,
    Citation Envoyé par mederick Voir le message
    Par ailleurs je dois garder la forme de la feuille organigramme (3 tableaux de 3 colonnes), donc peut être que je peut créer la même macro mais en réduisant les For i= 1 à 3 et changeant le nom des variables, ca devrait fonctionner, qu'en penses-tu?
    Je ne touche en aucun cas à ta feuille ORGANIGRAMME. Je souhaiterais que ta feuille REPARTITION PART 1 possède tous ses tableaux sur la même colonne (A, B et C).
    Si tu veux vraiment conserver des tableaux séparés, alors il va falloir faire repasser ta macro sur les colonnes d'après (je te laisse faire si tu as compris) et changeant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    .Range(Rg.Offset(1, 0), Rg_suiv.Offset(-2, 2)).Delete Shift:=xlUp
                    '.Rows(Rg.Row + 1 & ":" & Rg_suiv.Row - 2).Delete Shift:=xlUp
    '...
                    .Range(Rg.Offset(1, 0), .Columns(1).Find("*", , , , , xlPrevious).Offset(0, 2)).Delete Shift:=xlUp
                    '.Rows(Rg.Row + 1 & ":" & .Columns(1).Find("*", , , , , xlPrevious).Row).Delete Shift:=xlUp
    '...
                            .Range(Rg.Offset(1, 0), Rg.Offset(1, 2)).Insert Shift:=xlDown
                            '.Rows(Rg.Row + 1).Insert Shift:=xlDown
    Grâce à cela, tu n'insères ou ne supprimes plus de lignes mais seulement des cellules, ce qui est recommandé si tu as plusieurs tableaux les uns à côté des autres.

    Dis-moi si c'est bon pour toi.

    Cordialement,
    Kimy

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2014, 12h05
  2. Insérer une ligne juste en dessous d'une cellule
    Par MInfo25 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2013, 22h03
  3. Cellule du dessous
    Par ne2sbeal dans le forum jQuery
    Réponses: 3
    Dernier message: 12/06/2012, 09h54
  4. aller à la cellule en dessous quand elle est pleine
    Par nicdodo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/03/2012, 16h03
  5. Supprimer toutes les lignes en dessous d'une cellule
    Par liop49 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/08/2007, 13h50

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