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 :

Problème : ThisWorkbook.Sheets


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut Problème : ThisWorkbook.Sheets
    Bonjour,

    J'ai un petit soucis,

    Dans une macro, je veux compter le nombre de cellules ayant une valeur différente de 20 dans une plage. Pour se faire, j'ai réalisé la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Nbr As Integer
     
    Nbr = 0
     
    For Each cell In ThisWorkbook.Sheets("Feuil1").Range(Cells(25, 4), Cells(27, 4))
    If cell.Value <> 20 Then Nbr = Nbr + 1
    Next
    Le compilateur m'affiche l'erreur suivante : "Erreur d'exécution '1004'. Erreur définie par l'application ou par l'objet".
    Cette erreur semble être due à "For Each cell In ThisWorkbook.Sheets("Feuil1").Range(Cells(25, 4), Cells(27, 4))".
    La macro fonctionne lorsque je l'exécute en me trouvant sur la feuille où s'effectue le comtpage, mais ne marche pas quand je l'exécute alors que je me trouve sur une autre feuille du classeur.

    Merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 101
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Essaie comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Nbr As Integer
     
    Nbr = 0
     
    For Each cell In ThisWorkbook.ActiveSheet.Range(Cells(25, 4), Cells(27, 4))
    If cell.Value <> 20 Then Nbr = Nbr + 1
    Next
    Cdt,
    S.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    ton problème vient de la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(25, 4), Cells(27, 4)
    Car comme tu fais référence à un objet "plus haut" dans l'arbre que les cells, il faut appliquer le même niveau pour les Cells.

    Donc deux solutions principales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In ThisWorkbook.Sheets("Feuil1").Range(ThisWorkbook.Sheets("Feuil1").Cells(25, 4), ThisWorkbook.Sheets("Feuil1").Cells(27, 4))
    ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In ThisWorkbook.Sheets("Feuil1").Range("D25:D27")
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup jpcheck !

    Tu as effectivement raison, j'avais complètement omis cette subtilité !!

    Merci aussi SMBeccaria.

    A bientôt,

  5. #5
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    ton problème vient de la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(25, 4), Cells(27, 4)
    Car comme tu fais référence à un objet "plus haut" dans l'arbre que les cells, il faut appliquer le même niveau pour les Cells.

    Donc deux solutions principales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In ThisWorkbook.Sheets("Feuil1").Range(ThisWorkbook.Sheets("Feuil1").Cells(25, 4), ThisWorkbook.Sheets("Feuil1").Cells(27, 4))
    ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In ThisWorkbook.Sheets("Feuil1").Range("D25:D27")

    bonjour !
    j'exhume ce "vieux" post : je ne comprends pas bien l'histoire de l'arbre (je débute en VBA...), je suppose que c'est une histoire de hierarchie dans la structure VB, mais quoi précisément ?
    merci !

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    la logique VBA veut qu'à partir du moment où tu travailles à un "niveau" (Classeur, feuille, plage de cellules, cellule), l'ensemble de tes références doit être traité avec la même "considération".

    Si tu utilises Worksheets() dans ta ligne, toutes les cellules doivent être déterminées en prenant en compte leur feuille d'appartenance.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    la logique VBA veut qu'à partir du moment où tu travailles à un "niveau" (Classeur, feuille, plage de cellules, cellule), l'ensemble de tes références doit être traité avec la même "considération".

    Si tu utilises Worksheets() dans ta ligne, toutes les cellules doivent être déterminées en prenant en compte leur feuille d'appartenance.
    ok merci, c'est pas encore complètement clair mais je suis sur la piste.

    en fait, j'ai un pb avec le code suivant, voir fichier test ci joint : sur mon poste, la variable "a" revient vide alors qu'elle devrait contenir la liste Tableau2[clients]
    ça fait 2 heures que je patine sur le pb sans trouver la solution, une idée ?

    merci !

    Nom : 2023-01-29_15h45_09.png
Affichages : 1220
Taille : 94,2 Ko
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 101
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 101
    Points : 1 621
    Points
    1 621
    Par défaut
    Toi, tu cherches les emmerdes !!
    Si des erreurs (ou exceptions, comme tu veux) surviennent, c'est qu'il y a une raison, et les ignorer est tout sauf la bonne réponse à y apporter !!!
    Commence par virer cette horreur sans nom.

    La discipline n'a jamais tué personne, Option Explicit c'est pour qui ?

    Et la solution du lien ci-dessous ne serait-elle pas plus adaptée a ce que tu veux faire ?
    https://www.excel-exercice.com/menu-...ant-dynamique/

  9. #9
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Toi, tu cherches les emmerdes !!
    Si des erreurs (ou exceptions, comme tu veux) surviennent, c'est qu'il y a une raison, et les ignorer est tout sauf la bonne réponse à y apporter !!!
    Commence par virer cette horreur sans nom.

    La discipline n'a jamais tué personne, Option Explicit c'est pour qui ?

    Et la solution du lien ci-dessous ne serait-elle pas plus adaptée a ce que tu veux faire ?
    https://www.excel-exercice.com/menu-...ant-dynamique/
    euh... non je ne cherches pas les emmerdes comme tu dis

    j'ai juste récupéré ce code assez "standard" semble t il pour gérer une combobox
    je débute en VBA, et j'ai mis au moins 2h pour essayer de comprendre ce que ça faisait

    mon besoin est de pouvoir sélectionner une valeur dans une liste, mais en entrant quelques caractères pour qu'il me propose une liste réduite
    typiquement saisir "a" pour qu'il ne me propose que "banane" et "ananas" parmi la liste de fruits

    la fonctionnalité "validation de données" standard de excel ne le permet pas
    est ce que ce que tu proposes le permet, avant que je m'y plonge ?

    et surtout pouvoir mettre la liste sur une feuille différente de celle de la combobox : c'est la que ce code plante, impossible de savoir pourquoi !

    merci pour tes conseils
    Raphaël

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 101
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 101
    Points : 1 621
    Points
    1 621
    Par défaut
    Le code que tu nous as présenté était naïf et extrêmement mauvais (a ce demander s'il a été testé), j'ai tout scratché.

    Ce que tu désire requiert de programmer plusieurs d'évènements, et de bien avoir en tête leur mécaniques.
    En d'autre termes, connaitre ce qui les déclenche, et il n'y a pas que les interactions utilisateur (les propriétés / méthodes tel que value, text, dropdown le font aussi).
    Il faut aussi être capable de traquer l'état de la combobox (liste ouverte ou fermée), ce qui n'est pas possible en standard,
    ainsi que savoir quand court-circuiter les évènements (ils interfèrent entre eux).

    Bref, voila ce que j'ai pu faire de mieux (c'est lent, et malheureusement, on y peut rien):
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Option Explicit
     
    Private DropDown As Boolean         '// track l'etat de la combobox (ouvert / fermé)
    Private UpdateDropDown As Boolean   '// track le besoin de mise à jour de la liste
     
    Private Sub ComboBox1_DropButtonClick()
            '// affiche la liste restreinte
        If Not (DropDown) Then
            If (UpdateDropDown) Then
                Dim ListValeurs As Variant
                ListValeurs = getList
     
                If ComboBox1.Value <> "" Then
                    Dim D1 As Scripting.Dictionary
                    Set D1 = CreateObject("Scripting.Dictionary")
     
                    Dim Key As String
                    Key = UCase("*" & Replace(ComboBox1.Value, " ", "*") & "*")
     
                    Dim Item As Variant
                    For Each Item In ListValeurs
                        If UCase(Item) Like Key Then
                            D1(Item) = ""
                        End If
                    Next
                    ComboBox1.List = D1.keys
                End If
            End If
        End If
        DropDown = Not DropDown
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
            '// affiche et rafraichis la combobox (si besoin)
        If Not Intersect(Range("Tableau1[cc2]"), Target) Is Nothing And Target.Count = 1 Then
            ComboBox1.List = getList
            setPosition ComboBox1, Target
     
            ComboBox1.Value = Target.Value
            ComboBox1.Visible = True
        Else
            Me.ComboBox1.Visible = False
        End If
    End Sub
     
    Private Function getList() As Variant
            '// obtiens la liste des valeurs
        Dim Wb As Excel.Workbook
        Set Wb = Me.Parent
        Dim valuesRange As Range
        Set valuesRange = Worksheets("Feuil2").Range("Tableau2[clients]")
     
        Dim ListValeurs As Variant
        ListValeurs = Application.Transpose(valuesRange.Value)
        getList = ListValeurs
    End Function
     
    Private Sub setPosition(ByRef Cb As MSForms.ComboBox, ByRef Rng As Excel.Range)
            '// positionne la cb sur une cellule
        Cb.Height = Rng.Height + 3
        Cb.Width = Rng.Width
        Cb.Top = Rng.Top
        Cb.Left = Rng.Left
    End Sub
     
    Private Sub ComboBox1_Change()
            '// repercute la valeur de la cb dans la cellule
        ActiveCell.Value = ComboBox1.Value
    End Sub
     
    Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
            '// Affiche la liste complete
        ComboBox1.List = getList
        UpdateDropDown = False  '// court-circuite l'evennement ComboBox1_DropButtonClick
                                '// sinon la liste sera mise à jour (et restreinte)
        ComboBox1.DropDown
        UpdateDropDown = True
    End Sub
     
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
            '// reproduit l'appuis sur la touche entrée
            '// lorsqu'on saisit une cellule
        If KeyCode = 13 Then
            ActiveCell.Offset(1).Select
        End If
    End Sub
    PS: Par expérience, vouloir altérer le comportement de contrôles n'est pas une bonne idée.
    Pour la simple raison que les contrôles réalisent des opérations en interne qui sont totalement hors de notre champ d'action.
    VBA n'a malheureusement pas à sa disposition la toute puissance de .Net.

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

Discussions similaires

  1. [XL-2003] problème avec des feuilles du type "Thisworkbook" dans un meme classeur !
    Par Krokro dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/08/2009, 02h46
  2. [XL-2003] Problème avec la sélection d'une feuille excel -Sheets("Feuille").Select-
    Par -Naek- dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/04/2009, 17h13
  3. [E-07] problème de fermeture (thisworkbook)
    Par law56100 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/03/2009, 12h29
  4. probléme avec sheet
    Par stéphanie123 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/05/2008, 23h23
  5. Réponses: 1
    Dernier message: 26/04/2008, 15h16

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