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 :

VBA_ Selectionner un onglet pour executer la macro


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
    Chef de projet MOA
    Inscrit en
    Janvier 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2020
    Messages : 11
    Par défaut VBA_ Selectionner un onglet pour executer la macro
    Bonjour à tous !

    Je vous sollicite à nouveau car j'aimerais améliorer ma macro ( et je ne trouve pas la solution peut être aurez vous une idée ?

    La macro ci dessous compare 2 feuilles et synthétise dans une feuille les écarts, les onglets à comparer sont écrit " en dur" dans la macro et je dois à chaque fois modifier la macro pour comparer des onglets différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     u = Sheets("PDC").Range("A2:CF" & Sheets("PDC").Range("A" & Rows.Count).End(xlUp).Row)
        v = Sheets("PDC_en cours").Range("A2:CF" & Sheets("PDC_en cours").Range("A" & Rows.Count).End(xlUp).Row)

    J'aimerais pouvoir sélectionner les onglets à comparer entre eux lorsque je lance ma macro, par exemple : ( PDC vs PDC_202301 ou PDC_202301 vs PDC en cours etc...)

    Il y a régulièrement des nouveaux onglets qui sont crées.

    Je peux modifier mon onglet synthèse en intégrant des listes (u et v ) ou alors peut être avec un message box qui permet de sélectionner les onglets à comparer ?

    Je ne sais pas ce qui est le mieux et surtout pensez vous que cela est possible ?

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Explicit
     
    Sub Synthèse()
        Dim u, v, Cel As Range
        Dim dico1 As Object, dico2 As Object
        Dim i As Long, j As Long, lgn As Long, k As Long
     
        Sheets("Synthèse").Select
        Range("A2:CF" & Rows.Count).Clear
        Application.ScreenUpdating = False
        u = Sheets("PDC").Range("A2:CF" & Sheets("PDC").Range("A" & Rows.Count).End(xlUp).Row)
        v = Sheets("PDC_en cours").Range("A2:CF" & Sheets("PDC_en cours").Range("A" & Rows.Count).End(xlUp).Row)
     
        Set dico1 = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(u, 1)
            dico1(u(i, 11)) = i
        Next i
     
        Set dico2 = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(v, 1)
            dico2(v(i, 11)) = i
        Next i
     
        lgn = 1
        For i = 1 To UBound(u, 1)
            'recopie les lignes de la feuille 1 sur la feuille Synthèse si elles n'existent pas sur la feuille 2
            If dico2.exists(u(i, 11)) = False Then
                Debug.Print "Ajout de 1: " & u(i, 11)
                lgn = lgn + 1
                For j = 1 To UBound(u, 2)
                    Sheets("Synthèse").Cells(lgn, j) = u(i, j)
                Next j
            End If
        Next i
     
        For i = 1 To UBound(v, 1)
            If v(i, 11) <> "" Then  '--- contient un ID
                lgn = lgn + 1
                If dico1.exists(v(i, 11)) Then
                    k = dico1(v(i, 11)) '--- n° ligne dans feuil1
                    Debug.Print u(k, 11) & "<>" & v(i, 11), dico1(v(i, 11)) & "<>" & dico2(v(i, 11))
                    'Si les lignes de f2 existent sur f1 on recopie sur Synthèse les ligne de f2 et on y colore les cellules différentes
                    For j = 1 To UBound(v, 2)
                        Sheets("Synthèse").Cells(lgn, j) = v(i, j)
                        If u(k, j) <> v(i, j) Then
                            Debug.Print "-- " & u(k, j) & " --> " & v(i, j)
                            Sheets("Synthèse").Cells(lgn, j).Interior.Color = RGB(255, 255, 0)
                        End If
                    Next j
                Else
                    'Si les lignes de f2 n'existent pas sur f1, on les recopie telles qu'elles sur Synthèse
                    Debug.Print "Ajout de 2: " & v(i, 11)
                    For j = 1 To UBound(v, 2)
                        Sheets("Synthèse").Cells(lgn, j) = v(i, j)
                    Next j
                End If
            End If
        Next i
        Application.ScreenUpdating = True
    End Sub

    Merci de m'avoir lu et pour votre aide !

    A.

  2. #2
    Membre averti
    Homme Profil pro
    Technicien R&D
    Inscrit en
    Juin 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2020
    Messages : 33
    Par défaut
    Salut,
    Je pense que le plus simple pour toi est de passer par un Userform avec 2 listbox pour sélectionner chacun des onglets à comparer et un bouton "OK" qui attribut à 2 variables les noms des onglets choisis et appelle ton code.
    Tu as essayé ?
    Bonne journée,

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 299
    Par défaut sheets.name
    Bonjour,

    il faut dans un premier temps faire une listbox
    et obtenir la liste des noms des tabs

    dim a as integer
    dim nom as string

    for a = 1 to sheets.count
    sheets(a).name
    next a

    sheets(name).select

  4. #4
    Membre averti
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2020
    Messages : 11
    Par défaut
    Bonjour à tous les deux ,
    Merci pour vos retour et votre aide je vais tester , et je reviendrais poster ce que j'aurais trouvé ...
    Bonne journée !

Discussions similaires

  1. Executer la macro pour les lignes selectionnees
    Par ced0802 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/01/2016, 10h54
  2. interdire le changement d'onglet sans avoir executer une macro
    Par fibule38 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/12/2015, 11h41
  3. [XL-2010] Macro Générique / choisir l'onglet pour appliquer la macro
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2014, 16h32
  4. [XL-2010] Nouvel onglet pour affecter macro
    Par Ginette54 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/06/2013, 14h52
  5. Réponses: 8
    Dernier message: 25/11/2011, 14h18

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