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 :

Erreur D'exécution'1004' La méthode Delete de la classe Range a échoué. [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Superviseur en transport
    Inscrit en
    août 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Superviseur en transport
    Secteur : Transports

    Informations forums :
    Inscription : août 2019
    Messages : 30
    Points : 22
    Points
    22
    Par défaut Erreur D'exécution'1004' La méthode Delete de la classe Range a échoué.
    Bonjour,

    Je fais face à un code d'horreur pour une formule, qui fonctionne plusieurs fois dans mon code mais pour une raison que je ne peux comprendre, lors ce que j'ai une donnée dans ma cellule BB2, le message d'erreur m'apparait. Voici une partie de mon 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
        '9B
        If Range("R2").Value > 0 Then
        Range("AA3").Value = Range("R2").Value
        Range("R2", "S2").Delete shift:=xlShiftUp
        Else
            If Range("X2").Value > 0 Then
            Range("AA3").Value = Range("X2").Value
            Range("X2", "Y2").Delete shift:=xlShiftUp
            Else
            MsgBox ("Manque d'autobus 9B")
            End If
        End If
        '9C Split
        If Range("AP2").Value > 0 Then
        Range("AA10").Value = Range("AP2").Value
        Range("AP2", "AQ2").Delete shift:=x1ShiftUp
        Else
            If Range("BB2").Value > 0 Then
            Range("AA10").Value = Range("BB2").Value
            Range("BB2", "BC2").Delete shift:=x1ShiftUp
            Else
                If Range("R2").Value > 0 Then
                Range("AA10").Value = Range("R2").Value
                Range("R2", "S2").Delete shift:=xlShiftUp
                Else
                    If Range("X2").Value > 0 Then
                    Range("AA10").Value = Range("X2").Value
                    Range("X2", "Y2").Delete shift:=xlShiftUp
                    Else
                    MsgBox ("Manque d'autobus 9C")
                    End If
                End If
            End If
        End If
    L'erreur arrive à la ligne 20. Touvez-vous un problème à mon code?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    septembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : septembre 2019
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Bonjour,
    pour Range, il faut mettre les 2 points au lieu de la virgule,
    en exemple
    il faut la remplacer sur tous les Range("…:...")
    Bonne journée à tous

  3. #3
    Membre émérite
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    juillet 2016
    Messages
    1 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 403
    Points : 2 478
    Points
    2 478
    Par défaut
    Bonjour,

    Ne serait-ce pas plutôt
    Cdlt

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    7 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 7 433
    Points : 12 609
    Points
    12 609
    Par défaut
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Range("BB2", "BC2").Address & vbCrLf & Range("BB2:BC2").Address
    montre que ce n'est pas la syntaxe utilisée qui est en cause ici.
    La cause est probablement autre et ailleurs que dans le seul code montré.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Les convictions les plus suspectes sont presque toujours les mieux enracinées et la base des limites intellectuelles de certains.

  5. #5
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Bonjour,

    Salut Unparia.

    MsgBox Range("BB2", "BC2").Address & vbCrLf & Range("BB2:BC2").Address
    C'est ce que j'allais mentionner.

    Le fait est que notre ami a codé

    au lieu de

    A remplacer dans toute la procédure (CTRL + H, "x1S", "xls").

    D'autre part, je ne peux que donner 2 conseils:
    - Attacher les Objets Range à leur feuille parent, en utilisant éventuellement le bloc With
    - Un bloc Select Case contribuerait à une meilleure lisibilité

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    septembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : septembre 2019
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Ne serait-ce pas plutôt
    Cdlt
    autant pour moi,
    j'ai été trop vite

  7. #7
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Bonjour,

    autant pour moi,
    j'ai été trop vite
    Comme Unparia, que je salue au passage, je ne suis pas d'accord.
    L'argumentation reste valable.

    Par ailleurs, c'est, au moins, le 1 dans la valeur de propriété Shift qui provoquait une erreur.
    Il est codé "x 1(le chiffre) ShiftUp" au lieu de " x l(comme "LacdeGardeenItalie").

    Essaie de rechercher "x1"(le chiffre) dans la procédure. Tu constateras ainsi la mauvaise syntaxe.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  8. #8
    Membre à l'essai
    Homme Profil pro
    Superviseur en transport
    Inscrit en
    août 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Superviseur en transport
    Secteur : Transports

    Informations forums :
    Inscription : août 2019
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Merci à tous vous êtes géniaux!

    J'ai toujours cru que xlShiftUp s'agissait d'une fois shift up, plutôt xl Shift Up. Donc, je vais me coucher moins niaiseux ce soir.


    Toujours mille et une fois merci pour votre aide.

  9. #9
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 487
    Points : 39 940
    Points
    39 940
    Billets dans le blog
    55
    Par défaut
    Salut

    Autres conseils en plus de ceux de MarcelG:

    Option Explicit devrait toujours figurer en entête de module! L'erreur de saisie aurait été immédiatement trouvée car la déclaration des variables devient alors obligatoire et au lancement du code, le VBE aurait bloqué en surlignant le mot mal orthographié.

    De plus, toujours saisir les mots du VBA en minuscules. A la validation de la ligne, les mots bien orthographiés et donc reconnus par le VBE prennent les majuscules là où il faut, et ceux qui sont mal orthographiés restent en minuscules. Avec un (tout petit) peu d'habitude, on repère les problèmes avant qu'ils ne surgissent.


    Pour avoir Option Explicit au début de chaque nouveau module, il faut aller dans Outils/Options/Editeur et cocher la case "Déclaration des variables obligatoire". Pour les anciens modules, ajouter (éventuellement) la ligne à la main en tout début de module.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Bonsoir à vous, Bonsoir le Forum,

    Hé salut Pierre.

    J'avais oublié Option Explicit, en effet.

    A ce sujet, il peut y avoir d'autres options intéressantes.
    Par exemple
    évite de distinguer les majuscules et les minuscules.
    Mais cette précaution est moins fondamentale que la déclaration de variables.

    Allons plus avant.
    Tu faisais référence au VBE.
    La déclaration de variable doit bannir les Variant. Le seul exemple que je connaisse concerne les Array.
    On en voit trop.
    Cette précision dans la déclaration permet une saisie des propriétés et méthodes plus aisées si les options d'éditeur sont toutes cochées.

    Par exemple;
    On voit trop souvent
    Je préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim mondico As Scripting.Dictionary
    (à condition d'activer la référence adéquate)
    Je la préfère également à la déclaration en Objet.

    Quant à la saisie, personnellement, je la préfère en majuscules.
    Les codes finalisés étant rédigés, du moins pour une large part, en minuscules, la reconnaissance par le VBE est plus évidente.
    C'est juste mon avis.

    A Ciao. Si vedremo piu tardi.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  11. #11
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 487
    Points : 39 940
    Points
    39 940
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    [...]
    J'avais oublié Option Explicit, en effet.[...]
    Avec Option Explicit, le problème était trouvé en même pas une seconde ^^. Et dire que j'ai encore lu dernièrement quelqu'un qui soutenait que ce n'était pas toujours important...

    Citation Envoyé par MarcelG Voir le message
    [...]
    [...]
    Perso, j'aime pas. Ca empêche une réutilisation du code dans un module qui ne contiendrait pas l'option. A la limite, dans un module de classe, pourquoi pas, mais je préfère travailler systématiquement sans ce truc. Si je ne veux pas la différenciation, sur une comparaison par exemple, j'utilise l'une ou l'autre de ces lignes de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Dim A As String
      Dim B As String
     
      If UCase(A) = UCase(B) Then
      If StrComp(A, B, vbTextCompare) = 0 Then
    Les fonctions de manipulation de texte de VBA ont systématiquement l'argument permettant de travailler avec ou sans la différenciation de casse. Ca m'évite de me poser la question "quelle est l'option de comparaison"?... De plus, l'option vaut pour tout le module mais uniquement pour le module. Ca veut dire que la même ligne de code pourrait produire un résultat différent dans deux modules différents du même projet. Je trouve que c'est perturbant et source d'erreur d'avoir un code qui ne produit pas toujours le même résultat. Et j'aime par dessus tout la systématisation en programmation.

    Avec Option Compare Binary (ou pas d'option, car c'est l'option par défaut)
    Nom : 2019-10-15_201640.png
Affichages : 21
Taille : 4,2 Ko

    Avec Option Compare Text
    Nom : 2019-10-15_201706.png
Affichages : 21
Taille : 8,3 Ko


    C'est comme le Option Base, je n'aime pas l'utiliser, pour les mêmes raisons de "non-portabilité" du code. Il y a suffisamment de possibilités de déterminer la base d'un tableau ou d'un array sans figer cette base dans les options de compilation du module, pour moi. D'autant plus que de (trop) nombreuses d'exceptions ne respectent pas Option Base. Je pense notamment à:
    • Array(...) qui tient compte de l'option;
    • vba.Array() qui part toujours de 0;
    • tablo = range("a1:a1000") qui part toujours de 1;
    • Split() qui part toujours de 0.


    Avec Option Base 0 ou sans option (car option par défaut): Dim t(5) renvoie un tableau de 6 lignes. Avec Option Base 1, t(5) renvoie un tableau de 5 lignes. Je préfère piloter cela moi-même de façon explicite: dim t(0 to 5) ou dim t(1 to 5) ou encore dim t(25 to 50) ou dim t(-10 to 10) si je préfère commencer à un indice i qui me convient pour x raisons.


    Cela dit, chacun ses choix et ses préférences (alors que pour Option Explicit, je pense qu'il ne s'agit vraiment pas de choix pour qui veut coder de façon professionnelle.)


    Citation Envoyé par MarcelG Voir le message
    [...]
    La déclaration de variable doit bannir les Variant.
    On en voit trop.
    Cette précision dans la déclaration permet une saisie des propriétés et méthodes plus aisées si les options d'éditeur sont toutes cochées.
    [...]
    Je suis moins catégorique car parfois, tu n'as pas le choix. Il faut d'ailleurs noter que vb.net a introduit le type Dynamic qui correspond au Variant de VBA. Par exemple, seule une variable Variant peut être Null, ce qui a tout de même des avantages dans une série de situations, alors que les types tels que String ou Long initialisent la variable lors de la déclaration. Or, une chaine vide ou 0 peuvent avoir une autre signification que Null ou Empty. C'est notamment le cas lorsque tu récupères des données d'Access qui permet Null comme valeur de donnée. Par exemple, si tu as une variable reprenant le nombre de jours de maladie d'une personne, 0 veut dire qu'elle a 0 jours, là où Null veut dire "je n'ai pas l'info"... Cela dit, d'accord pour dire que c'est à utiliser avec parcimonie dans des cas bien délimités.

    Par exemple, j'ai une fonction générique qui renvoie un ListRow d'un tableau structuré sur base d'un identifiant. L'identifiant peut être du texte, un entier long ou une date. Sans Variant, je devrais proposer 3 paramètres optionnels (un par type de données), alors que As Variant me permet de passer la valeur cherchée à la fonction générique qui, par définition, ne sait pas ce qu'elle va recevoir comme type de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function GetListRow(Table As ListObject, ColumnName As String, Value As Variant) As ListRow


    Citation Envoyé par MarcelG Voir le message
    [...]Je la préfère également à la déclaration en Objet.[...]
    On n'a pas toujours le choix. Si tu travailles en Late Binding, tu seras obligé de déclarer les variables As Object. Avec certains objets Excel, c'est également le cas, par exemple si tu cherches une feuille sur base de son nom, car il n'y a pas d'objet As Sheet, la classe Sheet n'étant pas instanciable et ne pouvant être utilisée que par ses classes dérivées. Si tu veux boucler sur toutes les feuilles, tu n'as pas d'autre choix que Dim sh As Object... For Each sh In ThisWorkbook.Sheets


    Citation Envoyé par MarcelG Voir le message
    [...]
    Quant à la saisie, personnellement, je la préfère en majuscules.
    Les codes finalisés étant rédigés, du moins pour une large part, en minuscules, la reconnaissance par le VBE est plus évidente.[...]
    Chacun ses choix En tout cas, nos deux techniques de saisie montrent qu'il est important de ne pas essayer de saisir "comme ce sera écrit", car choisir nos méthodes permet de mettre en évidence les fautes de frappe.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Bonjour le Forum, Bonjour (quand même) Pierre,

    Merci pour ces précieux compléments.
    Tu vois, à juste titre, ces notions avec plus de hauteur.
    Pour ma part, je me réfère à mes développements réalisés ces 10 dernières années.

    La déclaration d'objet que j'ai mentionné faisait seulement référence aux dictionnaires.
    Ce qui, je présume, ne change rien à ce que tu avances.

    tu n'as pas d'autre choix que Dim sh As Object... For Each sh In ThisWorkbook.Sheets
    J'en prends note.
    (Pour ma part, j'ai toujours effectué cette déclaration en Sheet).

    En espérant que ces échanges puissent servir à nos amis du Forum.

    Bonne journée à tous.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  13. #13
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 487
    Points : 39 940
    Points
    39 940
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    [...]
    (Pour ma part, j'ai toujours effectué cette déclaration en Sheet).[...]
    Dubitatif je suis... (ou alors on ne se comprend pas)

    Nom : 2019-10-16_090803.png
Affichages : 16
Taille : 8,4 Ko



    Travaillerais-tu sur Mac? Dans cette autre discussion, Transitoire m'a fait remarqué une différence entre Mac et Windows relative au modèle objet de VBA. Il en va peut-être de même pour la déclaration As Sheet. Sur Windows en tout cas, le As Sheet n'est pas accepté.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Dubitatif, je le suis aussi.

    En effet, je confirme l'erreur que tu signales pour une déclaration en Sheet

    Mais.

    La déclaration en Worksheet ne pose pas de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub essai_déclar()
     
    Dim sh As Worksheet
     
    For Each sh In Worksheets
            Debug.Print sh.Name
    Next sh
     
    End Sub
    aucune erreur.

    Question: Pourquoi la déclaration en Sheet (pour la collection Sheets) est-elle acceptée, non celle en Worksheet (pour la collection WorkSheets)?

    Sauf erreur,
    La différence entre la collection Sheets et celle Worksheets est que la 1ère comporte les feuilles graphiques.

    Dois-je en déduire que cette différence de déclaration provienne de cette différence de collection?

    (Je dois dire que je travaille exclusivement sur la collection Worksheets.)(sous Windows PC, Office 2016.)

    A plus donc.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  15. #15
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 487
    Points : 39 940
    Points
    39 940
    Billets dans le blog
    55
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    [...]
    Question: Pourquoi la déclaration en Sheet (pour la collection Sheets) est-elle acceptée, non celle en Worksheet (pour la collection WorkSheets)?[...]
    Je ne comprends pas ta question car en fait, c'est l'inverse de ce que tu dis qui est: As Sheet n'est pas permis et on doit utiliser As Object, et As Worksheet est permis mais renvoie un objet Worksheet.

    Si donc tu veux boucler sur tous les onglets d'un classeur (feuilles de calculs, feuilles de graphique, feuilles de boite de dialogue,...), tu n'as d'autre choix que d'utiliser une variable de type Object, car tu ne peux utiliser ni un objet Worksheet, ni un objet Chart, ni un objet DialogSheet (plus du tout utilisé aujourd'hui, je suppose).

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Dim sh As Object
     
      For Each sh In Sheets
        ...
        ...
      Next sh

    Cela dit, n'étant pas dans la tête des ingénieurs de Microsoft, je ne saurais pas te dire pourquoi ils ont créé la classe Sheet non instanciable, ni pourquoi ils n'ont pas créé une interface ISheet
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    Oui, je me suis emmêlé les pinceaux. C'est l'inverse qu'il fallait comprendre. Worksheet autorisé, non Sheet..

    J'ai bien acté ton explication.
    Au demeurant, comme toi, je me pose la - dernière - question quant à la différence de traitement des 2 classes (Point de détail, j'aurais employé le terme "Collection").

    A plus tard.

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  17. #17
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 487
    Points : 39 940
    Points
    39 940
    Billets dans le blog
    55
    Par défaut
    Point de détail (quoique): la collection, c'est
    • SheetS (pour toutes les feuilles) qui contient des objets (Mais qui aurait pu contenir des objets Sheet, s'ils existaient);
    • WorksheetS (pour les feuilles de calcul) qui contient des objets Worksheet;
    • ChartS (pour les feuilles de graphique), qui contient des objets Chart.



    Je pense qu'en programmation, chaque terme à son importance...

    Ciao
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Expert confirmé Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2009
    Messages
    2 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 748
    Points : 5 634
    Points
    5 634
    Par défaut
    J'ai lu trop vite.
    Je croyais avoir aperçu un S d'où ma remarque, qui, en définitive, rejoint la tienne. (J'avais lu l'espace Microsoft à ce sujet).

    Ciao également

    Bien Cordialement.

    Marcel

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2015, 09h46
  2. Réponses: 4
    Dernier message: 16/02/2015, 13h06
  3. Réponses: 1
    Dernier message: 18/11/2014, 16h00
  4. Réponses: 13
    Dernier message: 29/06/2007, 18h03

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