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 :

Maintenir une feuille à jour


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut Maintenir une feuille à jour
    Bonjour a tous et a toutes,

    après plusieurs recherches sur le forum, j'ai trouvé comment copier des cellules d'une feuille vers une autre mais je n'arrive pas à réaliser ce que je veux vraiment et votre aide serait apprécié.

    Je possède une feuille excel de 5 colonnes que j'ai nommé reporting :
    no_demande, nom_demande, quantite, prix, commentaires
    J'ai une autre feuille dans le meme classeur qui contient exactement la meme structure (meme colonne) avec des données, cette feuille se nomme source. Les données sont récupéré à partir d'un ODBC.

    Je veux pouvoir prendre les données de la feuille source et les mettre dans la feuille Reporting mais des validations sont requises. Seulement 2 précisement.

    En fonction du no_demande, si celui-ci n'existe pas dans la feuille Reporting, copier la ligne de la feuille Source et ajouter cette ligne dans la feuille Reporting.
    Si no_demande existe déjà dans la feuille Reporting, mettre à jour cette ligne simplement en vérifiant que les autres colonnes de la feuille Source sont identiques à la feuille Reporting, sinon les modifiées.

    La feuille Reporting est comme son nom l'indique, c'est la feuille qui me permettra de générer un rapport avec les derniers données à jour en fonction des modificaton et nouvelles demandes recu dans Source.

    En espérant avoir été clair, merci de m'éclaircir sur une piste pour la création de cette macro VBA.

    Merci

  2. #2
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    rebonjour,

    j'ai reussi a recuperer les donnes de ma feuille source sur ma feuille Reporting mais a chaque fois que je clique sur mon bouton qui execute la macro suivante, on dirait qu'il efface toutes les donnees sur ma feuille Reporting et recommence a nouveau. Normalement, il devrait executer le IF la deuxieme fois car les donnees sont maintenant existantes mais helas, il se rend toujours au ELSE. A ne rien comprendre.

    Merci de votre aide.

    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
    Dim j As Integer
        For i = 2 To Sheet3.Cells(Rows.Count, 1).End(xlUp).Row
            j = 1
     
            If Sheet2.Cells(i, j).Value = Sheet3.Cells(i, j).Value Then
                MsgBox Cells(i, j) + "existe deja"
            Else
                'MsgBox Sheet3.Cells(i, j) + " n'existe pas"
                'Exit Sub
                For k = 1 To 24
                Sheet2.Cells(i, k).Value = Sheet3.Cells(i, k).Value
                Next
            End If
     
        Next
    P.S : Sheet2 = Reporting et Sheet3 = Source

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 926
    Par défaut
    Salut
    Quelque chose comme ca
    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
    Sub MiseAJour()
    Dim ShtReport As Worksheet, ShtBase As Worksheet
    Dim TheCell As Range, TheCellFinded As Range
     
    Set ShtReport = Sheets("Feuil1") ' a adapter
    Set ShtBase = Sheets("Feuil2")
     
     
    With ShtBase
        'on scan toutes les cellules de la colonne A qui sont renseignées
        For Each TheCell In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            'On cherche la cellule qui correspond le mieux dans Report
            TheCellFinded = ShtReport.Cells(Application.WorksheetFunction.Match(TheCell.Value, ShtReport.Columns("A"), -1), "A")
            'On regarde si la valeur est exactement la meme
            'la valeur retouné par Match plus haut sera toujours soit egal soit la valeur imediatement superieur
            If TheCellFinded.Value = TheCell.Value Then 'meme vameur
                'Ici ton code qui met a jour les autres colonnes
            Else 'valeur superieur
                'Ici on insert une nouvelle ligne avec les données de Base
                TheCell.EntireRow.Copy
                TheCellFind.Insert
                Application.CutCopyMode = False
            End If
        Next
    End With
     
    End Sub
    A adapter a ton besoin exact, ici j'ai supposé que no_demande était en colonne A, si c variable, on peut facilement retrouver la bonne colonne en fonction de sont contenu.

    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Salut Qwazerty,

    merci pour ta réponse mais cela me génère une erreur 400 dont je ne vois pourquoi. Voici le code adapter :
    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
    Sub MiseAJour()
    Dim ShtReport As Worksheet, ShtBase As Worksheet
    Dim TheCell As Range, TheCellFinded As Range
     
    Set ShtReport = Sheets("Reporting") ' a adapter
    Set ShtBase = Sheets("Source")
     
     
    With ShtBase
        'on scan toutes les cellules de la colonne A qui sont renseignées
        For Each TheCell In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            'On cherche la cellule qui correspond le mieux dans Report
            TheCellFinded = ShtReport.Cells(Application.WorksheetFunction.Match(TheCell.Value, ShtReport.Columns("A"), -1), "A")
            'On regarde si la valeur est exactement la meme
            'la valeur retouné par Match plus haut sera toujours soit egal soit la valeur imediatement superieur
            If TheCellFinded.Value = TheCell.Value Then 'meme valeur
                'Ici ton code qui met a jour les autres colonnes
                MsgBox "salut"
            Else 'valeur superieur
                'Ici on insert une nouvelle ligne avec les données de Base
                TheCell.EntireRow.Copy
                TheCellFind.Insert
                Application.CutCopyMode = False
            End If
        Next
    End With
     
    End Sub
    Merci.

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 926
    Par défaut
    Salut
    Indique la ligne qui pose probleme (enfin g un doute, 2 meme... :s)

    au lieu de
    et j'ai une erreur lorsque Match ne trouve pas de valeur adaptée, je regarde pour gérer l'erreur au pire.
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Salut,

    l'erreur se produit une fois rendu a la condition IF.

    J'ai aussi modifié cellfind pour cellfinded mais cela ne regle pas le bug.

    Merci de ton aide !

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 926
    Par défaut
    re
    Alors il faut que les valeur soient triées par ordre décroissant sur ta feuille report (est ce un problème ?)

    Sinon voici le code testé cette fois

    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
    Sub MiseAJour2()
    Dim ShtReport As Worksheet, ShtBase As Worksheet
    Dim TheCell As Range, TheCellFinded As Range
    Dim I As Integer
     
    Set ShtReport = Sheets("Feuil1") 'Sheets("Reporting") ' a adapter
    Set ShtBase = Sheets("Feuil2") 'Sheets("Source")
     
     
    With ShtBase
        'on scan toutes les cellules de la colonne A qui sont renseignées
        For Each TheCell In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            'On recupert la valeur la plus haute contenu dans la colonne
            I = Application.WorksheetFunction.Max(ShtReport.Columns("A").Value)
            'Si cette valeur est inferieur a celle contenue dans TheCell
            If I < TheCell.Value Then
                'On rajoute la ligne en fin de colonne
                Set TheCellFinded = ShtReport.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
            Else
                'On cherche la cellule qui correspond le mieux dans Report
                Set TheCellFinded = ShtReport.Cells(Application.WorksheetFunction.Match(TheCell.Value, ShtReport.Columns("A"), -1), "A")
            End If
            'On regarde si la valeur est exactement la meme
            'la valeur retouné par Match plus haut sera toujours soit egal soit la valeur immediatement superieure
            If TheCellFinded.Value = TheCell.Value Then 'meme valeur
                'Ici ton code qui met a jour les autres colonnes
                'MsgBox "salut"
            Else 'valeur superieur
                'Ici on insert une nouvelle ligne avec les données de Base
                TheCell.EntireRow.Copy
                TheCellFinded.Insert
                Application.CutCopyMode = False
            End If
        Next
    End With
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Merci Qwazerty, plus d'erreur. Par ailleurs, lorsque je clique deux fois sur le bouton executant la macro, cela recopie de nouveau les données de la feuille source dans ma feuille rerporting en double. C'est a dire qu'il ne tient pas compte de la condition if qui dit que si c'est identique, on ne fait rien et affiche moi seulement le message 'Pareil'

    Voila le 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
    Sub MiseAJour2()
    Dim ShtReport As Worksheet, ShtBase As Worksheet
    Dim TheCell As Range, TheCellFinded As Range
    Dim I As Integer
     
    Set ShtReport = Sheets("Reporting") 'Sheets("Reporting") ' a adapter
    Set ShtBase = Sheets("Source") 'Sheets("Source")
     
     
    With ShtBase
        'on scan toutes les cellules de la colonne A qui sont renseignées
        For Each TheCell In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            'On recupert la valeur la plus haute contenu dans la colonne
            I = Application.WorksheetFunction.Max(ShtReport.Columns("A").Value)
            'Si cette valeur est inferieur a celle contenue dans TheCell
            If I < TheCell.Value Then
                'On rajoute la ligne en fin de colonne
                Set TheCellFinded = ShtReport.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
            Else
                'On cherche la cellule qui correspond le mieux dans Report
                Set TheCellFinded = ShtReport.Cells(Application.WorksheetFunction.Match(TheCell.Value, ShtReport.Columns("A"), -1), "A")
            End If
            'On regarde si la valeur est exactement la meme
            'la valeur retouné par Match plus haut sera toujours soit egal soit la valeur immediatement superieure
            If TheCellFinded.Value = TheCell.Value Then 'meme valeur
                MsgBox "Pareil"
            Else 'valeur superieur
                'Ici on insert une nouvelle ligne avec les données de Base
                TheCell.EntireRow.Copy
                TheCellFinded.Insert
                Application.CutCopyMode = False
            End If
        Next
    End With
     
    End Sub

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 926
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 926
    Par défaut
    Salut
    Je ne trouve pas d'erreur, le code dans mon cas passe bien par le message.
    Je te remet le code j'ai sorti I = Application.... inutil de faire appelle 50 fois a cette 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub MiseAJour2()
    Dim ShtReport As Worksheet, ShtBase As Worksheet
    Dim TheCell As Range, TheCellFinded As Range
    Dim I As Integer
     
    Set ShtReport = Sheets("Feuil1") 'Sheets("Reporting") ' a adapter
    Set ShtBase = Sheets("Feuil2") 'Sheets("Source")
     
     
    With ShtBase
        'On recupert la valeur la plus haute contenu dans la colonne
        I = Application.WorksheetFunction.Max(ShtReport.Columns("A").Value)
        'on scan toutes les cellules de la colonne A qui sont renseignées
        For Each TheCell In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            'Si cette valeur est inferieur a celle contenue dans TheCell
            If I < TheCell.Value Then
                'On defini la nouvelle valeur de I
                I = TheCell.Value
                'On rajoute la ligne en fin de colonne
                Set TheCellFinded = ShtReport.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
            Else
                'On cherche la cellule qui correspond le mieux dans Report
                Set TheCellFinded = ShtReport.Cells(Application.WorksheetFunction.Match(TheCell.Value, ShtReport.Columns("A"), -1), "A")
            End If
            'On regarde si la valeur est exactement la meme
            'la valeur retouné par Match plus haut sera toujours soit egal soit la valeur immediatement superieure
            If TheCellFinded.Value = TheCell.Value Then 'meme valeur
                'Ici ton code qui met a jour les autres colonnes
                MsgBox "salut"
            Else 'valeur superieur
                'Ici on insert une nouvelle ligne avec les données de Base
                TheCell.EntireRow.Copy
                TheCellFinded.Insert
                Application.CutCopyMode = False
            End If
        Next
    End With
     
    End Sub
    Tu devrais faire du pas a pas (tu cliques dans ton code et tu appuie sur F8 pour lancer sont exécution en pas a pas, ainsi a chque F8 tu avanceras d'un pas, tu peux a chaque pas mettre ta souris au dessus des variables et connaitre ainsi leur valeurs.

    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Merci a tous pour votre aide. C'est OK maintenant !

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

Discussions similaires

  1. mise a jour d'un formulaire a partir d'une feuille
    Par alex.a dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/06/2007, 16h57
  2. nommer une feuille excel par la date du jour.
    Par Bourezak dans le forum Access
    Réponses: 3
    Dernier message: 22/01/2007, 16h22
  3. Réponses: 2
    Dernier message: 30/08/2006, 23h51
  4. Réponses: 6
    Dernier message: 15/05/2006, 18h04
  5. [VBA]mettre a jour une feuille à l'ouverture
    Par kermitdive dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/01/2006, 16h35

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