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 :

Copier des informations dans un tableau selon une référence [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut Copier des informations dans un tableau selon une référence
    Bonjour,
    J'ai besoin d'aide pour un petit problème de macro.
    Donc j'ai une feuille excel avec deux onglets:
    - 1er onglet : j'ai un tableau de plusieurs colonnes fixes et des lignes qui s'incrémentent en fonction d'un autre tableau (qui sera pas concerné par mon soucis ici). J'ai une référence en colonne A du style RC-XX-XX (la seule donnée qui est fixe)
    - 2eme onglet : j'ai un document avec des trous à des endroits spécifiques

    En gros, j'aimerais remplir mon 2eme onglet avec les données du tableau selon ma référence (ça j'ai trouvé avec la macro ci-dessous)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro2()
        With Sheets("Quick")
        .Range("B2").Value = WorksheetFunction.VLookup(.Range("B1").Value, Sheets("TEST").Range("A2:F100"), 2, False)
        End With
    End Sub

    Je l'ai appliqué seulement sur le mini tableau 1/ du 2eme onglet
    Et j'aimerais (et c'est là que je bloque) que si je modifie une donnée sur l'onglet 2, la donnée se modifie automatiquement dans la tableau (onglet 1) en recherchant la référence RC-XX-XX.
    Je ne sais pas si c'est possible et j'avoue je ne sais pas par quoi commencer, s'il faut faire un copier/coller, un remplacement, une recherche

    Sur l'onglet 2, en jaune c'est ce qui va se remplir automatiquement en tapant la référence dans la cellule en rouge et qui j'aimerais se recopie dans la tableau (sans ajouté une nouvelle ligne) quand il y a un changement

    J'espère avoir été clair.
    Merci de votre réponse et de votre aide

    Cordialement

    PS : pour garder en mémoire ce qui est dans l'onglet 2 et le copier dans l'onglet 1 j'ai trouvé ça :

    Code vb : 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
    Sub validation()
     
    'Atteindre le formulaire et mémoriser les données
        Sheets("Quick_Kaizen modification").Select
        Range("I9:I15").Select
        Selection.Copy
    'Test pour déterminer la ligne ou coller les infos dans le tableau
        Sheets("TEST").Select
        valeurB4 = Range("B4").Value
        If valeurB4 = "" Then
        Range("B4").Select
        Else
        Range("B3").Select
        Selection.End(xlDown).Select
        ligne_active_base = ActiveCell.Row
        Range("B" & ligne_active_base + 1).Select
        End If
    'Mémoriser le n° de la ligne ou coller les données
        ligne_active_base = ActiveCell.Row
    'Collage avec transposition
        Range("B" & ligne_active_base).Select
        Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    'Rendre vierge le formulaire
        Sheets("Quick_Kaizen modification").Select
        Range("I9:I15").Select
        Selection.ClearContents
        Range("I9").Select
     
    End Sub

    J'ai essayé de l'adapter à mon document avec la fonction Find mais ça ne fait pas ce que je veux

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Test pour déterminer la ligne ou coller les infos dans le tableau
        Sheets("TEST").Select
        RC = Sheets("TEST").Columns("A").Find(What:=Sheets("Quick_Kaizen modification").Range("B4"), LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
       Sheets("TEST").Select
        If RC = True Then
        Cells(RC, 2).Select
        ligne_active_base = ActiveCell.Row
        Else
        Range("B3").Select
        Selection.End(xlDown).Select
        ligne_active_base = ActiveCell.Row
        Range("B" & ligne_active_base + 1).Select
        End If

    Pourquoi ça copie sur une nouvelle ligne et ça ne remplace par sur la ligne contenant ma référence?
    RC 2015 test.xlsm
    Cordialement

  2. #2
    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
    Bonjour

    Peut être il suffit d'utiliser des RechercheV dans ta feuille, les données seront mis à jour en temps réel.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour mercatog et merci de ta réponse rapide.

    Le problème c'est que l'onglet 1, le tableau se rempli automatiquement via une autre feuille que je n'ai pas mise ici (pour éviter de trop surchargé). Elle se rempli via une macro et donc des lignes sont créées de façon continue à intervalle irrégulier, c'est pour ça que je suis malheureusement obligé de passer par une macro pour réussir à tout faire concorder ensemble.

    J'espère avoir été clair si ce n'est pas le cas je mettrais le document complet avec toutes les feuilles et toutes les macros pour mieux visualiser

    Cordialement

  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
    Dans ton onglet 1, est ce que tu auras toujours une seule ligne par référence?
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Oui mercatog,

    Il n'y aura jamais deux références identiques, les références seront toujours écris sur le même modèle RC-XX-XX (les X sont des chiffres aléatoires) mis il n'y aura jamais de doublon à cette endroit

  6. #6
    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
    Des RechercheV suffisent dans ce cas

    Pour ton Onglet 1, Transforme tes données en Tableau ou bien renomme dynamiquement ta plage de données. C'est tout ce que tu as à faire pour que tes formules prennent en compte les nouvelles lignes
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    J'avoue que je comprend pas tout. Comment je peux transformer mes données en tableau? c'est déjà un tableau non?
    et tu me dis de mettre des rechercheV mais si je tape =rechercheV(; dans les cellules de l'onglet 1 ça va bien prendre la valeur sur la référence mais les valeurs qui sont incrémentés dans le tableau vienne d'une autre feuille (onglet 3 que j'ai pas mis ici) via une macro. Donc le tableau va se remplir grâce à la macro et donc les fonctions =rechercheV(; vont se supprimer, non?

    Ou j'ai rien compris à ce que tu me dis

  8. #8
    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
    Pour transformer une plage de données en tableau (à partir d'Excel 2007), Insertion > Tableau

    http://excel.developpez.com/faq/?pag...au#Tableau2007
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    J'ai transformé l'onglet 1 en tableau.
    J'ai également lu : http://silkyroad.developpez.com/excel/tableau/
    mais je comprend toujours pas l'utilité de tout ça? Sur ce coup j'ai besoin de tes lumières :
    1/ je comprend pas en quoi transformer le tableau va m'aider
    2/ je peux mettre des formules sauf que les formules ne se mettront pas vraiment à jour car le tableau se construit grâce à un onglet "Quick Kaizen" donc à chaque fois que je remplis le "Quick Kaizen" des lignes vont s'ajouter dans la tableau selon une référence. J'arrive a copier grâce à une macro les ligne du tableau sur l'onglet "Quick Kaizen modification" car il m'arrive de modifier certaine valeurs après l'avoir rédigé. Les trucs que je comprend pas c'est que tu me dis de mettre une formule rechercheV dans la tableau :
    - Si je mets des formules dans le tableau, ça va me dénaturé le tableau car il ne va plus se remplir automatiquement via l'onglet "Quick Kaizen"
    - De plus, comment vais je mettre à jour les modifications apportées dans mon tableau sachant que le "Quick Kaizen modification" sera en constant changement (je change sans cesse la référence de la cellule B4).
    3/ je comprend pas le cheminement de ta pensée pour mettre à jour le fichier.
    je mets en pièce jointe tout mon document pour que se soit plus clair avec toutes les macro que j'ai faite

    En gros : je remplis la feuille "Quick Kaizen", j'appuis sur le bouton qui se trouve sur cette feuille. Les données vont s'incrémenter dans le tableau de la feuille "TEST". J'appuie sur l'un des bouton de la feuille "Quick Kaizen modification" ce qui va chercher les données du tableau dans la feuille "TEST" selon la référence taper en B4 (exemple : RC-15-08). Le problème que j'ai actuellement c'est de ré appuyer sur un autre bouton pour que les modifications apportés se remettent dans le tableau "TEST" sans créer de nouvelle ligne mais en mettant à jour le tableau (donc toutes les modifications apportées vont se mettre à leur emplacement sur la ligne contenant RC-15-08).

    Si ta pensée va dans ce sens dans ce cas peux tu bien m'expliquer comment changer la feuille "TEST" en tableau peut m'aider.

    Merci pour tes réponses et futur réponse
    RC 2015 test - Copie.xlsm
    Cordialement

  10. #10
    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
    L'utilisation du tableau permettra à chaque nouvelle ligne d'être prise en compte dans ta base de donnée (càd tu n'auras plus besoin de chercher les limites de ta plage de donnée). Aussi l'appel des ces données dans les formules est plus facile.

    Par contre au vu de ton dernier post et de ton post initial, il y a de l'ombre pour ne pas dire incohérence.

    Ce que j'avais compris, c'est que tu as une base de donnée (variable en lignes avec comme clé un n° de référence sans doublons). Sur une autre feuille, tu voudrais en écrivant une N° de référence en B1 que les cellules correspondantes soient remplies respectivement par les données issues de la base de donnée sur la ligne correspondant au n° de référence.

    Si maintenant ton souhait est de faire une sorte de formulaire de saisi/modification qui alimenterait/ modifierait ta base de donnée, l'approche sera différente

    [EDIT 13:41]

    Bon voilà, je me suis amusé à faire de ta feuille Quick kaizen un sorte de formulaire de saisie et de modification de ta base de donnée.

    Préparation du fichier:
    Pour te donner une piste, j'ai renommé les cellules de saisie en DESC, CAUS, VERIF et ACT. La cellule de saisie de la référence REF et la date DTE.

    En utilisant l'évènement Change de la feuille, les données sont importées si elles existent, sinon on inscrit les nouvelles données.

    Un seul Bouton sert à l'ajout ou à la modification.

    RC 2015.xlsm
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Désolé pour le retard de la réponse, je n'ai pas excel de chez moi.

    Merci beaucoup mercatog pour ta réponse. C'est pile ce qu'il me fallait mais j'avoue ne pas tout comprendre à ta macro

    En tout cas ça fonctionne parfaitement, merci beaucoup.

    Cordialement

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Excuse moi de te déranger mais si tu es d'accord j'aimerais bien quelque explication sur ta macro pour bien tout comprendre.

    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
    Option Explicit
     
    Private Sub ImpExp_Click()
    Dim LastLig As Long, TheLig As Long
    Dim Tmp As String
     
    Application.ScreenUpdating = False
    Tmp = Range("REF")
    If Tmp <> "" Then
        With Feuil2
            LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
            TheLig = TheRow(Tmp, .Range("A4:A" & LastLig))
            If TheLig > LastLig Then .Range("A" & TheLig).Resize(, 177).Borders.LineStyle = xlContinuous
     
            Export Tmp, .Range("A4:A" & LastLig), .Range("B:HP"), Range("DESC")
            Export Tmp, .Range("A4:A" & LastLig), .Range("I:DP"), Range("CAUS")
            Export Tmp, .Range("A4:A" & LastLig), .Range("DQ:ER"), Range("VERIF")
            Export Tmp, .Range("A4:A" & LastLig), .Range("ES:FT"), Range("ACT")
        End With
        Range("REF") = ""
        Range("DTE") = ""
    End If
    End Sub
    1- Que veut dire : Private Sub
    2- Dim XXX As YYY ça permet bien de définir une variable?
    3- Que veut dire Application.ScreenUpdating?
    4- Que veut dire Rows.Count?
    5- je comprend pas l'expression

    Code: Export Tmp, .Range("A4:A" & LastLig), .Range("B:HP"), Range("DESC")

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim LastLig As Long, TheLig As Long
    Dim Tmp As String
     
    Application.ScreenUpdating = False
    If Target(1, 1).Address = Range("REF")(1, 1).Address Then
        Tmp = Target(1, 1)
        Application.EnableEvents = False
        Range("REF") = UCase(Tmp)
        ClearForm
        With Feuil2
            LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
            TheLig = TheRow(Tmp, .Range("A4:A" & LastLig))
            If TheLig > LastLig Then
                Target.Font.Color = 255
                With ActiveSheet.OLEObjects("ImpExp").Object
                    .Caption = "Enregistrer nouvelle référence"
                    .ForeColor = 255
                End With
            Else
                Target.Font.Color = 0
                With ActiveSheet.OLEObjects("ImpExp").Object
                    .Caption = "Modifier référence"
                    .ForeColor = vbBlue
                End With
                Import Tmp, .Range("A:A"), .Range("B:H"), Range("DESC")
                Import Tmp, .Range("A:A"), .Range("I:DP"), Range("CAUS")
                Import Tmp, .Range("A:A"), .Range("DQ:ER"), Range("VERIF")
                Import Tmp, .Range("A:A"), .Range("ES:FT"), Range("ACT")
            End If
        End With
        Application.EnableEvents = True
    End If
    End Sub
    6- Que veut dire Application.EnableEvents
    7- Je ne comprend pas l'expression

    Code : LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
    TheLig = TheRow(Tmp, .Range("A4:A" & LastLig))

    8- La fonction OLEObjects, ça sert à créer le bouton sur la feuille quick kaizen?

    Et après je comprend plus rien du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Function TheRef(ByVal What As String, ByVal Where As Range) As Range
     
    If What <> "" Then Set TheRef = Where.Find(What, LookIn:=xlValues, lookat:=xlWhole)
    End Function
    9- Je comprend pas ce que font What et Where ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Function CLookUp(ByVal What As String, ByVal Where As Range, ByVal From As Range, ByVal Num As Integer)
    Dim c As Range
     
    Set c = TheRef(What, Where)
    If Not c Is Nothing Then
        CLookUp = Intersect(c.EntireRow, From(, Num).EntireColumn)
        Set c = Nothing
    End If
    End Function
    10- J'ai rien compris du tout à la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Function TheRow(ByVal What As String, ByVal Where As Range) As Long
    Dim c As Range
     
    Set c = TheRef(What, Where)
    If Not c Is Nothing Then
        TheRow = c.Row
        Set c = Nothing
    Else
        TheRow = Where.Offset(Where.Rows.Count).Row
    End If
    End Function
    11- J'ai rien compris du tout à la fonction

    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
    Private Sub Import(ByVal What As String, ByVal Where As Range, ByVal From As Range, ByVal Inside As Range)
    Dim i As Integer
    Dim c As Range
    Dim j As Long
     
    Application.ScreenUpdating = False
    Set c = TheRef(What, Where)
    If Not c Is Nothing Then
        For Each c In Inside
            If c.MergeArea(1, 1).Address = c.Address Then
                i = i + 1
                c = CLookUp(What, Where, From, i)
            End If
        Next c
        j = TheRow(What, Where)
        Range("DTE") = Where.Worksheet.Cells(j, 177)
    End If
    End Sub
    12- J'ai rien compris du tout à la fonction

    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
    Private Sub Export(ByVal What As String, ByVal Where As Range, ByVal From As Range, ByVal Inside As Range)
    Dim i As Integer
    Dim c As Range
    Dim j As Long
     
    Application.ScreenUpdating = False
    If What <> "" Then
        j = TheRow(What, Where)
        For Each c In Inside
            If c.MergeArea(1, 1).Address = c.Address Then
                i = i + 1
                From(j, i) = c
            End If
        Next c
        With Feuil2
            .Cells(j, 1) = What
            .Cells(j, 177) = Range("DTE")
        End With
    End If
    End Sub
    14- J'ai rien compris du tout à la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub ClearForm()
     
    Application.ScreenUpdating = False
    Range("DESC").ClearContents
    Range("CAUS").ClearContents
    Range("VERIF").ClearContents
    Range("ACT").ClearContents
    End Sub
    15- Cette fonction permet bien de tout nettoyer?

    Cordialement

    PS : je ne savais pas si je pouvais mettre ici ou si je devais faire une nouvelle discussion

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

Discussions similaires

  1. probleme d'affichage des informations dans un tableau
    Par fleurrouge dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/06/2012, 21h48
  2. Réponses: 7
    Dernier message: 21/05/2011, 11h34
  3. [POO] ajouter des données dans un tableau contenant une structure
    Par Peanut dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2009, 18h41
  4. [VBA-E] Copier des données d'un tableau a une feuille
    Par KKshi666 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/04/2007, 14h09
  5. Réponses: 9
    Dernier message: 04/04/2007, 11h16

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