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 avec un objet Range


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Problème avec un objet Range
    Bonjour à tous,

    Je suis toujours dans mon projet d'automatisation de planning de tournoi sportif (voir ici), et je bloque sur une ligne depuis ce matin...
    Voilà le contexte : je crée un dictionnaire de données associant une lettre (correspondant à un groupe) à l'adresse d'une cellule. Illustrons avec un exemple : le groupe A se trouve dans la feuille "wJA", à la cellule "D11". L'adresse est alors : wJAD11. Voilà le code me permettant de remplir mon dico :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Dim i As Byte
        Dim k As Byte
        Dim Count As Byte
        Count = 1
        For i = 4 To 14 'sheets
            Sheets(i).Activate
            k = 0
            Do Until Cells(4, 4 + 6 * k).Value = "" 'groupes
                DicoAdresse.Add Convert(Count), ActiveSheet.Name! & Split(Cells(11, 4 + 6 * k).Address(), "$")(1) & Split(Cells(11, 4 + 6 * k).Address(), "$")(2)
                Count = Count + 1
                k = k + 1
            Loop
        Next
    Convert est une fonction perso prenant en argument un entier et renvoyant la lettre (string) dont la place dans l'alphabet est l'entier en question.
    Jusqu'ici tout va bien, j'ai affiché les keys/items dans un Tableau et j'ai bien ce que je veux.

    Je veux ensuite me servir de cette adresse, et c'est là que ca coince.
    Voilà comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim inc As Byte 'incrément de la boucle sur les Staffel
        Dim spiel As Integer
        Dim rng As Range
        For inc = 1 To DicoTaille.Count 'NB: DicoTaille défini plus haut, le problème n'est pas là
     
            Dim X As String
            X = Convert(inc)
     
            'On jumpe à l'adresse du staffel
            rng = Sheets(Left(DicoAdresse.Item(X), 3)).Range(Chr(34) & Right(DicoAdresse.Item(X), 3) & Chr(34))
    C'est cette dernière ligne qui bloque ; le code de la boucle For continue derrière mais je ne l'ai pas copié.

    En gros j'utilise Left et Right pour séparer l'adresse et utiliser une moitié pour activer la feuille que je veux, et l'autre pour la cellule dans cette feuille.

    J'utilise Chr(34) pour rajouter des guillemets, et j'obtiens une erreur 1004 (la méthode Range a échoué).
    Si j'enlève ces guillemets, j'ai une erreur 91 (variable objet non définie).

    Quelqu'un voit le problème ? Pas moi
    Merci d'avance pour votre aide.

    MJ

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour MagicJambond. bonjour le forum,

    essaie comme ça (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rng = Sheets(Left(DicoAdresse.Item(X), 3)).Range(Chr(34) & Right(DicoAdresse.Item(X), 3) & Chr(34))

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour, bonjour !

    Les guillemets servent à encadrer du texte dans un code pour le distinguer d'une variable.

    Quand un texte est contenu dans une variable, les guillemets sont inutiles : retirer alors Chr(34) du code, m'enfin ‼

    Ensuite vérifier l'extraction du texte afin de voir si elle correspond à quelque chose d'existant … (pas le cas vu l'erreur 91 !)

    En conservant un espace (ou autre caractère dédié) dans le stockage du dictionnaire ("wJA D11"),
    l'extraction serait bien plus simple avec la fonction Split

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    @Thautheme: Non ca ne fonctionne pas non plus.

    @Marc-L: j'ai tapé le code suivant juste après le remplissage de mon dictionnaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(20, 20).Value = Right(DicoAdresse.Item(Convert(1)), 3)
    Et il m'affiche "D11" (sans les guillemets bien sûr) dans la cellule en question. Donc l'extraction fonctionne. Ou alors je n'ai pas compris ta remarque ?

    Edit: j'ai posté avant ta dernière modif ; je vais essayer avec Split.

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Citation Envoyé par Marc-L Voir le message
    Quand un texte est contenu dans une variable, les guillemets sont inutiles : retirer alors Chr(34) du code, m'enfin ‼

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Oui, j'avais bien compris la première fois, merci... Quel rapport avec l'extraction ? Ca n'apparaît pas du tout dans mon code.

    Edit:
    Trouvé ! En combinant vos 2 solutions J'ai ajouté un "+" dans mon dictionnaire comme conseillé, et un "set" devant rng... Pourquoi on doit faire ca d'ailleurs ?
    Merci beaucoup pour votre aide !

    MJ

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Exemples pour pointer une feuille nommée wJA :

    Worksheets("wJA") : le B-A-BA …

    FEUILLE = "wJA": WorkSheets(FEUILLE) : donc sans guillemets inutiles
    apparaissant pourtant clairement dans ton code via les Chr(34)


    Quant à l'erreur 91, quelque chose n'existant pas est appelé …

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Convert est une fonction perso prenant en argument un entier et renvoyant la lettre (string) dont la place dans l'alphabet est l'entier en question.
    Ce n'est pas la peine de créer une fonction qui existe déjà. Regarde du coté de Chr() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MsgBox Chr(97)  '97 = "a" 122 = "z"
    MsgBox Chr(65)  '65 = "A" 90 = "Z"
    Pour avoir l'adresse relative d'une plage (sans les $) il suffit de paramétrer les arguments à 0 ou à False :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DicoAdresse.Add Convert(Count), ActiveSheet.Name & Cells(11, 4 + 6 * k).Address(0, 0)
    Je pense qu'il serait plus simple de rajouter un caractère (tiret bas par exemple) dans la concaténation afin de récupérer l'adresse de la cellule plus facilement avec la fonction Split() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Chaine = "wJA_D11"
    MsgBox Split(Chaine, "_")(1)
    Ce qui deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DicoAdresse.Add Convert(Count), ActiveSheet.Name & "_" & Cells(11, 4 + 6 * k).Address(0, 0)
    Et la récup serait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set rng = Sheets(Split(DicoAdresse.Item(X), "_")(0)).Range(Split(DicoAdresse.Item(X), "_")(1))
    et j'obtiens une erreur 1004 (la méthode Range a échoué)
    Un Range s'affecte avec l'instruction "Set"

    Hervé.

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Exact pour le Set bien que je pensais que ce fusse corrigé vu le post #2 …

    Il peut y avoir aussi un futur problème en ligne n°4 du second code avec la non concordance des types de données …


  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Exemples pour pointer une feuille nommée wJA :

    Worksheets("wJA") : le B-A-BA …

    FEUILLE = "wJA": WorkSheets(FEUILLE) : donc sans guillemets inutiles
    apparaissant pourtant clairement dans ton code via les Chr(34)


    Quant à l'erreur 91, quelque chose n'existant pas est appelé …
    J'ai d'une part dit que l'erreur 91 apparaissait quand j'enlevais ces Chr(34), et d'autre part cette ligne n'avait rien à voir avec l'extraction en elle-même dont nous étions en train de parler. A savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(20, 20).Value = Right(DicoAdresse.Item(Convert(1)), 3)
    J'étais peut-être pas super clair je te l'accorde, mais pas la peine d'être limite agressif non plus.

    Merci beaucoup Hervé pour ces précisions, même si elles recoupent ce que j'ai essayé avant d'éditer.. Je vais modifier mon code qui est loin d'être parfait.
    Saurais tu m'expliquer pourquoi on doit rajouter ce "Set" ? Simple curiosité

    MJ

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    L'instruction Set est utilisé pour affecter les objets (Range, Sheets, Workbook, etc...) aux variables. Les variables doivent, bien évidemment, être déclarées de type objet compatible avec l'objet qu'on veut leurs attribuer ou alors déclarées Variant et dans ce cas, il y a conversion implicite par le compilateur. Souvent, quand on a l'erreur 91 on a oublié l'instruction Set.

    Hervé.

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

Discussions similaires

  1. [COM] Problème avec l'objet COM
    Par Commodore dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 16/05/2006, 20h36
  2. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49
  3. Problème avec l'Objet "Session"
    Par ghislain007 dans le forum ASP
    Réponses: 4
    Dernier message: 03/03/2006, 22h07
  4. Problème avec l'objet FileSystemObject
    Par Poussy-Puce dans le forum ASP
    Réponses: 4
    Dernier message: 27/10/2005, 16h25
  5. [FLASH MX] Problème avec l'objet Date
    Par n_tony dans le forum Flash
    Réponses: 13
    Dernier message: 22/03/2005, 13h44

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