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 :

Application de la maco sur le mauvais sheet


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Application de la maco sur le mauvais sheet
    Bonjour,

    Dans mon fichier Excel j'ai deux feuilles. Une feuille "A" et une feuille "B".
    Dans un userforme ou se trouve un Combobox que j'alimente à l'aide d'un code prenant les données de la feuille "A".
    Si ma feuille active est la feuille "B" alors je n'arrive pas à compilé les données vers le Combobox.
    Il faut savoir qu'au final il n'y aura qu'afficher que mon formulaire et le classeur dont les feuilles ne seront plus visible par les utilisateurs.

    Voici le code en question :
    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 CBoxMateriel_DropButtonClick() ' prend la liste des UM
    Dim X As String
    Dim LFTS As Object
    Dim Cel As Range ' défini les variables
    Set LFTS = CreateObject("Scripting.Dictionary") ' créer un répertoire de l'UM
    With Sheets("A") ' Prend les informations dans le feuille A
     
        For Each Cel In .Range("C2:C" & .[B1048576].End(xlUp).Row)
            X = Cel.Row
            If Range(Cells(X, 3), Cells(X, 3)).Value = "FTS" Or Range(Cells(X, 3), Cells(X, 3)).Value = "FTA" Then If Not LFTS.Exists(UCase(Range(Cells(X, 4), Cells(X, 4)).Value)) And Cel.Value <> "" _
                Then LFTS.Add UCase(Range(Cells(X, 4), Cells(X, 4)).Value), UCase(Range(Cells(X, 4), Cells(X, 4)).Value)
     
     
        Next Cel
    End With
    Me.CBoxMateriel.List = Application.Transpose(LFTS.items)
     
    End Sub
    Il y à donc cette ligne qui n'est pas prise en compte quand j'ai le feuille "B" activé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Sheets("A") ' Prend les informations dans le feuille Base de données
    Et cela créer donc une erreur à cette ligne car LFTS.items est vide et on y retrouve rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.CBoxMateriel.List = Application.Transpose(LFTS.items)
    Je sais que la solution doit être toute simple, mais j'aimerais aussi qu'elle fonctionne quand le classeur est masqué. "Besoin de votre aide","N'hésitez pas à me lance sur des pistes", "J'aime comprendre ce que je fais"

    Cordialement,
    Passepartout007

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    c'est normal
    regarde ton 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
    Private Sub CBoxMateriel_DropButtonClick() ' prend la liste des UM
    Dim X As String
    Dim LFTS As Object
    Dim Cel As Range ' défini les variables
    Set LFTS = CreateObject("Scripting.Dictionary") ' créer un répertoire de l'UM
    With Sheets("A") ' Prend les informations dans le feuille A
     
        For Each Cel In .Range("C2:C" & .[B1048576].End(xlUp).Row)
            X = Cel.Row
            If Range(Cells(X, 3), Cells(X, 3)).Value = "FTS" Or Range(Cells(X, 3), Cells(X, 3)).Value = "FTA" Then If Not LFTS.Exists(UCase(Range(Cells(X, 4), Cells(X, 4)).Value)) And Cel.Value <> "" _
                Then LFTS.Add UCase(Range(Cells(X, 4), Cells(X, 4)).Value), UCase(Range(Cells(X, 4), Cells(X, 4)).Value)
     
     
        Next Cel
    End With
    Me.CBoxMateriel.List = Application.Transpose(LFTS.items)
     
    End Sub
    plus precisément ici, il n'y a pas quelque chose qui te dérange ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Range(Cells(X, 3), Cells(X, 3)).Value = "FTS" Or Range(Cells(X, 3), Cells(X, 3)).Value = "FTA" Then If Not LFTS.Exists(UCase(Range(Cells(X, 4), Cells(X, 4)).Value)) And Cel.Value <> "" _            Then LFTS.Add UCase(Range(Cells(X, 4), Cells(X, 4)).Value), UCase(Range(Cells(X, 4), Cells(X, 4)).Value)
    Range(Cells(X, 3) c'est le range de quel sheets et les autres ranges aussi d'ailleurs
    que met on devant range dans un with sheets(xxxx)?????

    le plus etonnant c'est que tu fait bien au depart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Cel In .Range("C2:C" & .[B1048576].End(xlUp).Row)

    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re
    Bonjour mon chère patricktoulon,
    C'est un plaisir de te revoir.
    Cette ligne de code indique que c'est sur le sheet "A"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Sheets("A") ' Prend les informations dans le feuille A
    Cependant cela ne fonctionne pas.
    J'ai bien essayer de faire :
    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 CBoxMateriel_DropButtonClick() ' prend la liste des UM
    Dim X As String
    Dim LFTS As Object
    Dim Cel As Range ' défini les variables
    Set LFTS = CreateObject("Scripting.Dictionary") ' créer un répertoire de l'UM
    With Sheets("A") ' Prend les informations dans le feuille A
     
        For Each Cel In .Range("C2:C" & .[B1048576].End(xlUp).Row)
            X = Cel.Row
            If Sheet("A").Range(Cells(X, 3), Cells(X, 3)).Value = "FTS" Or Sheet("A").Range(Cells(X, 3), Cells(X, 3)).Value = "FTA" Then If Not LFTS.Exists(UCase(Sheet("A").Range(Cells(X, 4), Cells(X, 4)).Value)) And Cel.Value <> "" _
                Then LFTS.Add UCase(Sheet("A").Range(Cells(X, 4), Cells(X, 4)).Value), UCase(Sheet("A").Range(Cells(X, 4), Cells(X, 4)).Value)
     
     
        Next Cel
    End With
    Me.CBoxMateriel.List = Application.Transpose(LFTS.items)
     
    End Sub
    Ou 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
    Private Sub CBoxMateriel_DropButtonClick() ' prend la liste des UM
    Dim X As String
    Dim LFTS As Object
    Dim Cel As Range ' défini les variables
    Dim Feuille As Worksheets
    Feuille = Worksheets("A")
    Set LFTS = CreateObject("Scripting.Dictionary") ' créer un répertoire de l'UM
    With Sheets("A") ' Prend les informations dans le feuille A
     
        For Each Cel In .Range("C2:C" & .[B1048576].End(xlUp).Row)
            X = Cel.Row
            If Feuille.range(Cells(X, 3), Cells(X, 3)).Value = "FTS" Or Feuille.Range(Cells(X, 3), Cells(X, 3)).Value = "FTA" Then If Not LFTS.Exists(UCase(Feuille.Range(Cells(X, 4), Cells(X, 4)).Value)) And Cel.Value <> "" _
                Then LFTS.Add UCase(Feuille.Range(Cells(X, 4), Cells(X, 4)).Value), UCase(Feuille.Range(Cells(X, 4), Cells(X, 4)).Value)
     
     
        Next Cel
    End With
    Me.CBoxMateriel.List = Application.Transpose(LFTS.items)
     
    End Sub
    J'ai essayer d'autre cas avec workbooks ou worksheets en mettant le nom avant le range et en utilisant le with et même en enlevant les with et je ne comprend pas pourquoi cela ne fonctionne pas.

    Peux tu m'indiqué qu'elle fonction te semble la plus correcte à utiliser ? (même si la feuille est masqué)
    Cordialement,
    Passepartout007

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re
    Bonjour je viens de comprendre un truc j'ai mi un "." devant les ranges mais cela ne fonctionne pas. je ne comprend pas.
    Cordialement,
    Passepartout007

  5. #5
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Le pointage dans le code n'est pas à prendre à la légère, et il faut toujours être vigilant là dessus selon le type de contextes :
    • Code qui s'exécute entre classeur
    • code qui s'exécute entre feuille

    3 types d'utilisation :

    • Via variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim sh As Worksheet ' feuille ou
    Dim wb As Workbook ' classeur ou
    Dim rg As Range ' plage
    • de façon direct
    Classeur.feuille.plage
    Ou
    Feuille.plage

    • de façon sous-entendus via With - ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With classeur.feuille
         .PlageA.value = .PlageB.value
    End With
    Bien respecter ces principes d'écriture évite les problèmes dans un code

    PS : qu'en est-il de mon MP ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    En complément, tu peux simplifier tes écritures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range(.cells(1,3), .cells(1,3))
    équivaut à pointer une plage Range allant de la cellule C1 à la cellule C1, donc la plage ne contiendra que la cellule C1, ainsi autant écrire
    Pour ce qui est du dictionnaire, par défaut il a un mode de comparaison binaire, il prend en compte la valeur ascii des caractères, donc "A" est différent de "a" dans ce mode de comparaison. Mais il est possible de passer en comparaison de type texte ou "A" = "a". Dans ce dernier cas, il ne tient plus compte de la case pour regarder si la valeur est déjà dans sa liste.

    ça donne ça
    LFTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim LFTS As Dictionary
     
    Set LFTS = CreateObject("Scripting.Dictionary")
    'On rend le dictionnaire insenssible à la case (plus besoin ds UCase()
    LFTS.CompareMode = TextCompare
     
    '[...] Suite du code
     
    If (.Cells(X, 3).Value = "FTS") Or (.Cells(X, 3).Value = "FTA") Then
        If Not LFTS.Exists(.Cells(X, 4).Value) And (Cel.Value <> "") Then LFTS.Add .Cells(X, 4).Value, .Cells(X, 4).Value
    ++
    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

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Passepartout007 Voir le message
    Cette ligne de code indique que c'est sur le sheet "A"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Sheets("A") ' Prend les informations dans le feuille A
    Cependant cela ne fonctionne pas.
    Encore faut-il penser à mettre un "." devant les Range concernés...

    Pas sûr aussi que With fonctionne avec un Evaluate (les références entre crochets).
    Il faudrait tester.

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    J'en avais laissé passer des bouts...

    Il faut aussi préciser le classeur sur lequel tu travailles, sinon, si le classeur actif change en cours de route (un clique utilisateur sur un autre classeur) ta macro va continuer à dérouler et prendre en compte ce nouveau classeur lors de la prise en compte du prochain Sheets("A")...

    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 LFTS As Dictionary
    Dim Cel As Range
    Set LFTS = CreateObject("Scripting.Dictionary")
    'On rend le dictionnaire insenssible à la case (plus besoin ds UCase()
    LFTS.CompareMode = TextCompare
     
    'on tient copte du classeur sur lequel on travail en plus de la feuille
    'Ici ThisWorkbook est adapté car il représente le classeur où est contenu le code qui s'execute
    With ThisWorkbook.Sheets("A")
        For Each Cel In .Range("C2", .Cells(.Rows.Count, "A").End(xlUp).Row)
            If (.Cells(X, 3).Value = "FTS") Or (.Cells(X, 3).Value = "FTA") Then
                If Not LFTS.Exists(.Cells(X, 4).Value) And (Cel.Value <> "") Then LFTS.Add .Cells(X, 4).Value, .Cells(X, 4).Value
            End Sub
        Next
    End With

    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

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re
    Bonjour à tous,

    Que dire sinon WOOAAWW, j'ai compris mon erreur et vous remercie de votre aide à tous. Il est sur que je ne la referais plus .

    Merci de m'avoir également aidez à s'simplifier mon code.
    Je marque le sujet comme résolu.
    Cordialement,
    Passepartout

  10. #10
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Quelques petites corrections dans 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
    Dim LFTS As Dictionary
    Dim Cel As Range
    Set LFTS = CreateObject("Scripting.Dictionary")
    'On rend le dictionnaire insenssible à la case (plus besoin ds UCase()
    LFTS.CompareMode = TextCompare
     
    'on tient copte du classeur sur lequel on travail en plus de la feuille
    'Ici ThisWorkbook est adapté car il représente le classeur où est contenu le code qui s'execute
    With ThisWorkbook.Sheets("A")
        For Each Cel In .Range("C2", .Cells(.Rows.Count, "C").End(xlUp))
            If Cel.Value = "FTS" Or Cel.Value = "FTA" Then
                If Not LFTS.Exists(Cel.Offset(0, 1).Value) Then LFTS.Add UCase(Cel.Offset(0, 1).Value), UCase(Cel.Offset(0, 1).Value)
            End If
        Next Cel
    End With

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Merci Menhir, j'avais oublié de reprendre l'intérieur de la boucle

    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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/08/2006, 13h17
  2. application installant un raccourci sur le bureau
    Par ricotrutt dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 24/07/2006, 15h23
  3. Thème de MacOs sur Windows XP
    Par Faith's Fall dans le forum Windows XP
    Réponses: 7
    Dernier message: 27/06/2005, 20h18
  4. Réponses: 1
    Dernier message: 30/05/2005, 17h02
  5. Application.OnHelp et appui sur F1
    Par mathieutlse dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2003, 11h19

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