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 :

Macro évènementielle avec données à copier sur feuille EXCEL variables


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Responsable ADV
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable ADV
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut Macro évènementielle avec données à copier sur feuille EXCEL variables
    Re-Bonjour à tous,

    Vous avez réussi à m'aider une première fois donc je recommence avec le même espoir!
    Toujours dans un soucis de gain de temps pour mes collaborateurs, je souhaite créer un classeur avec une feuille de saisie gobale et autant de feuille que j'ai de commerciaux. Dans la feuille de saisie, je voudrais que mes collaborateurs puissent remplir les données demandées et ensuite que celles-ci s'enregistrent automatiquement sur la feuille du commercial concerné, pour ensuite obtenir ses dépenses totales.

    En m'appuyant sur un code similaire, que j'ai essayé de travailler, je ne trouve pas de solution à mon problème!!
    Peut-être que ce n'est même pas possible!!

    Code dans ma feuille base :

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Target.Count > 1 Then Exit Sub
     
        If Not Intersect(Target, Range("A4:A42")) Is Nothing Then
     
        CopMat Sheets("Base"), Target
     
        If Target = "" Then
     
            Range(Target.Offset(0, 1), Target.Offset(0, 7)).ClearContents
     
        End If
        End If
     
    End Sub
    Code dans module :

    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
    Sub CopMat(ByVal FeuilleBase As Worksheet, ByVal FeuilleDest As Worksheet)
     
    Dim ShBase As Worksheet 'Source
    Dim AireBase As Range, CelluleBase As Range
    Dim DerniereLigneBase As String, TitreBase As String
    Dim FeuilleDest As Integer
     
     
        With FeuilleBase
             TitreBase = 1
             DerniereLigneBase = .Cells(.Rows.Count, 1).End(xlUp).Row
             Set AireBase = .Range(.Cells(TitreBase + 1, 1), .Cells(DerniereLigneBase, 1))
        End With
     
        For Each CelluleBase In AireBase
            If CStr(CelluleBase) = CStr(CelluleGrille) Then
              Range(CelluleBase.Offset(0, 1), CelluleBase.Offset(0, 7)).Copy Destination:=FeuilleDest.Offset(0, 1)
     
            End If
     
        Next CelluleBase
     
        Set AireBase = Nothing
     
    End Sub
    En pièce jointe mon document, bien évidemment j'ai raccourci, normalement j'ai au moins 50 feuilles(car au moins 50 commerciaux) et plus de lignes de saisies sur ma feuille("Saisie).

    Vous remerciant d'avance pour toute aide!!
    Bonne soirée à tous.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    De ce que je comprends, tu devrais utiliser la procédure Change (qui survient lors du changement de valeur) plutôt que SelectionChange (qui survient lors du changement d'endroit)
    De plus, tu pourrais l'utiliser au niveau du module ThisWorkbook qui te donne une variable de plus: Sh qui est la feuille appelante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  3. #3
    Membre du Club
    Femme Profil pro
    Responsable ADV
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable ADV
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour ta réponse, je vais essayer de retravailler le code dans ce sens.
    Concernant le code dans la feuille de destination (que j'ai mis dans le module) est-il bon ou dois je également le retravailler?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Il semble y avoir un problème avec ta procédure CopMat et son appel
    Tu passes une feuille et une cellule en paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopMat Sheets("Base"), Target
    Et la procédure demande 2 feuilles comme paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub CopMat(ByVal FeuilleBase As Worksheet, ByVal FeuilleDest As Worksheet)

  5. #5
    Membre du Club
    Femme Profil pro
    Responsable ADV
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable ADV
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Bonjour,

    Je crois que j'ai vu trop gros, je pense que c'est trop poussé encore pour mon tout petit niveau.
    Je pensais pouvoir prendre un code et l'adapter à mes besoins, ça fait deux jours que je suis dessus...

    Puis je suis reparti de zéro avec ta proposition mais je suis dans le flou artistique.
    Malheureusement je crois que je vais devoir reprendre les bases de VBA et attendre quelques années pour pouvoir mener mon projet à terme..

    En français c'est pas compliqué mais en traduction VBA....c'est une autre histoire!

    Je vais essayer une dernière fois en reprenant de zéro et en m'appuyant sur des tutos pour essayer de bien comprendre la macro Workbook_SheetChange, et ensuite je reprendrais le second code dans la feuille de destination!!

    Merci pour votre aide quand même, je sais au moins par quoi commencer!!!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sandrine888 Voir le message
    Bonjour,

    Ci-joint le code corrigé, mais ce n'est pas la bonne méthode pour faire ce que vous souhaitez.

    Code corrigé :

    Dans le module standard :
    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
     
     
    Sub CopMat(ByVal AireBase As Range, ByVal FeuilleDest As Worksheet)
     
    Dim DerniereLigneDest As String, TitreDest As String
     
        With FeuilleDest
             TitreDest = 8
             DerniereLigneDest = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
             If DerniereLigneDest <= 8 Then DerniereLigneDest = 9
             AireBase.Copy Destination:=.Cells(DerniereLigneDest, 1)
        End With
     
    End Sub
     
    Function OngletPresent(ByVal NomOngletCherche As String) As Boolean
     
    Dim I As Integer
     
        OngletPresent = False
     
        For I = 1 To Sheets.Count
            If Sheets(I).Name = NomOngletCherche Then
                OngletPresent = True
                Exit For
            End If
        Next I
     
    End Function
    Dans le module de l'onglet Base :

    Il faut déclencher l'événement sur la dernière cellule saisie. Nb : Il faut modifier l'ordre d'une des cellules dans l'onglet Base.

    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
     
    Option Explicit
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Count > 1 Then Exit Sub
     
        If Not Intersect(Target, Range("G4:G42")) Is Nothing Then
     
           If OngletPresent(UCase(Target.Offset(0, -6).Value)) = True Then
              Target.Offset(0, -6) = UCase(Target.Offset(0, -6))
              CopMat Range(Target.Offset(0, -6), Target), Sheets(UCase(Target.Offset(0, -6).Value))
           Else
              MsgBox "L'onglet : " & Target.Offset(0, -6).Value & " n'existe pas !", vbCritical
           End If
        End If
     
    End Sub
    La méthode n'est pas bonne car vous ne contrôlez pas ce que vous injectez dans les différents onglets. Il suffit en effet de modifier la dernière cellule sur chaque ligne pour injecter autant de fois la ligne dans l'onglet correspondant. Pour faire ce que vous faites, il faudrait un champ qui serve d'index (un numéro de commande par exemple ou de devis, uniques) et faire une boucle sur l'onglet correspondant pour vérifier son absence avant d'injecter.

    Vous pourriez faire une énorme économie de tout ce travail de développement en n'utilisant que l'onglet Base et au choix :
    - En créant un tableau croisé dynamique ou mieux un graphique dynamique pour rendre compte de l'activité. Pour cela, il vous faut dater vos enregistrements avec une vraie date.
    - En utilisant un filtre avancé également très puissant et très rapide pour retrouver votre format de tableau par correspondant voir le tuto de Philippe TULLIEZ.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2018, 13h02
  2. Macro transfert de données d'une feuille Excel à une autre
    Par marion2 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/11/2009, 14h20
  3. Stocker des données dans la mémoire pour exploitation sur feuilles excel
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/09/2008, 12h03
  4. Copier des données d'une feuille excel vers plusieurs autres
    Par LeeBamboo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/08/2008, 15h46
  5. Réponses: 9
    Dernier message: 30/08/2006, 23h13

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