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 :

Utilisation "SET" & "Range" [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 37
    Par défaut Utilisation "SET" & "Range"
    Bonjour à tous,
    malgré la lecture de nombreux messages ici et là, je passe à oté de la solution de mon probleme sur l'utilisation de l'objet range.
    L'idée de la macro est de trouver la valeur min d'une plage de données.
    Pour cela :
    il y a n paire de colonne (le nombre de ligne est variable)
    • je saisi une valeur approximative (nombre entier) a chercher
    • je cherche la valeur supérieur approchante (décimale) dans la première colonne de la paire.
    • Je cherche la valeur min dans la seconde colonne de la paire sur une plage de 50 lignes avant et après la position de la valeur décimale


    mais ça plante sur le Set maPlage=xxxxxx dans le code suivant.
    Qu'est-ce que je loupe?
    Et question subsidiaire pour les amateurs, est-ce la bonne méthode?
    Merci

    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
     
    Sub Calculs()
    Dim position_freq, valeur
    Dim colonne_freq As Integer
    Dim maPlage As Range
     
    colonne_freq = 1
     
     
    Nbr_séries = Worksheets("Calcul").Range("ZZ1").Value
    For Nbr_freq = 1 To 4
        Réponse = Worksheets("Calcul").Cells(Nbr_freq, 701).Value
        For i = 1 To Nbr_séries
            colonne_freq = 2 * i - 1
            DerLigne = Worksheets("Résultats_Log").Cells(66000, colonne_freq).End(xlUp).Row
            'trouve la position  recherchée  Worksheets("Résultats_Log").Select
            Set maPlage = Worksheets("Résultats_Log").Range(Cells(1, colonne_freq), Cells(DerLigne, colonne_freq))
            answer = Application.WorksheetFunction.Match(Réponse, myRange, -1)
            'trouve le min dans une plage de autour de la fréquence recherché
            Set maPlage = Worksheets("Résultats_Log").Range(answer.Offset(-50, 1), answer.Offset(50, 1))
            answer = Application.WorksheetFunction.Min(myRange)
        Next i
    Next Nbr_freq
    End Sub

  2. #2
    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 Stef31 Voir le message
    mais ça plante sur le Set maPlage=xxxxxx dans le code suivant.
    Quel est le message d'erreur ?

    Pour info, il est peu probable que le problème soit à gauche du "=".

    Sans connaitre le message d'erreur, je ne garantis rien mais je miserais sur le contenu des variables colonne_freq ou DerLigne.
    Quand le bug de produit, clique sur "Débagage" et va voir la valeur de ces deux variable dans la liste des variables locale (ou passe ton pointeur dessus pour afficher leurs valeurs).

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 078
    Billets dans le blog
    2
    Par défaut
    Bonjour Stef, Bonjour Menhir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set maPlage = Worksheets("Résultats_Log").Range(Cells(1, colonne_freq), Cells(DerLigne, colonne_freq))
    Le danger avec les Range(cells), c'est le risque que Range soit dans une feuille et Cells dans une autre. Avec cette écriture, Cells est considéré dans la feuille active, ce qui peut être source de plantage.
    Pour éviter ça, je l'écrirais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Worksheets("Résultats_Log")
    Set maPlage = .Range(.Cells(1, colonne_freq), .Cells(DerLigne, colonne_freq))
    End With
    Si ça ne vient pas de là, vérifier les valeurs de colonne_freq et Derligne

  4. #4
    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 tototiti2008 Voir le message
    Le danger avec les Range(cells), c'est le risque que Range soit dans une feuille et Cells dans une autre.
    Tu as raison. Je suis complètement passé à côté de cette erreur classique.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 37
    Par défaut
    Merci Tototiti2008, Merci Menhir, c'est bien ça.

    par contre maintenant ça plante sur la fonction MATCH (erreur 1004, impossible de lire la propriété Match de la classe WorkshetteFunction)
    Réponse a bien une valeur (2762), maPlage également ( : Variant/Variant(1 to 1604, 1 to 1) : )....
    est-ce la même raison?
    Merci
    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
     
    Sub Calculs()
    Dim position_freq, valeur
    Dim colonne_freq As Integer
    Dim maPlage As Range
     
    colonne_freq = 1
    Nbr_séries = Worksheets("Calcul").Range("ZZ1").Value
    For Nbr_freq = 1 To nbr_réponse
        Réponse = Worksheets("Calcul").Cells(Nbr_freq, 701).Value
        For i = 1 To Nbr_séries
            colonne_freq = 2 * i - 1
            DerLigne = Worksheets("Résultats_Log").Cells(66000, colonne_freq).End(xlUp).Row
            'trouve la position  recherchée  Worksheets("Résultats_Log").Select
            With Worksheets("Résultats_Log")
                Set maPlage = .Range(.Cells(1, colonne_freq), .Cells(DerLigne, colonne_freq))
                answer = Application.WorksheetFunction.Match(Réponse, maPlage, -1)
            'trouve le min dans une plage de autour de la fréquence recherché
                Set maPlage = .Range(answer.Offset(-10, 1), answer.Offset(10, 1))
            End With
            answer = Application.WorksheetFunction.Min(myRange)
        Next i
    Next Nbr_freq
    End Sub

  6. #6
    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 Stef31 Voir le message
    maPlage également ( : Variant/Variant(1 to 1604, 1 to 1) : )
    Ca veut dire quoi, ça ?
    MaPlage devrait être une zone de cellules.

    Commence par essayer de voir si une fonction EQUIV dans la feuille de calcul avec les mêmes paramètre renvoie bien un numéro de ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set maPlage = .Range(answer.Offset(-10, 1), answer.Offset(10, 1))
    Ca c'est pas bon.
    answer est une valeur numérique. On ne peut pas lui appliquer un Offset.
    Par contre, on peut lui faire -10.
    Encore faut-il ajouter la colonne dans le Range.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 37
    Par défaut
    Bonjour Menhir,
    ça veut dire que "maPlage" est bien définie par 1 colonne et 1604 lignes (j'ai récupéré ça avec l'espion)

    la fonction equiv ne fonctionne pas sur la feuille de calcul
    Nom : Capture.PNG
Affichages : 3998
Taille : 65,0 Ko
    pourtant j'ai bien la valeur 1500 rechercher dans la première colonne

    Ok pour anwser, je pensais que ça donnait une adresse de cellule....
    Merci

  8. #8
    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 Stef31 Voir le message
    ça veut dire que "maPlage" est bien définie par 1 colonne et 1604 lignes
    C'est un avis que je ne partage pas.
    "MaPlage" devrait être un objet Range dans indice de variable.

    Je crois que tu confonds les indices de variables et les lignes/colonne d'une plage de cellules.

    la fonction equiv ne fonctionne pas sur la feuille de calcul
    Est-il normal que les séparateurs décimaux de tes données en colonne A soient des "." ?

    En J805, mets la formule =A805+A806.
    Qu'est-ce que ça donne ?

    pourtant j'ai bien la valeur 1500 rechercher dans la première colonne
    Mais es-tu sûr que Excel la considère comme une valeur numérique ?

    Ok pour anwser, je pensais que ça donnait une adresse de cellule....
    MATCH ne renvoie pas une adresse de cellule ni même un numéro de ligne mais un numéro d'ordre.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 37
    Par défaut
    Bonjour Menhir, merci de t'attarder sur mon sujet.
    pour te répondre
    Je crois que tu confonds les indices de variables et les lignes/colonne d'une plage de cellules.
    c'est bien possible.
    Est-il normal que les séparateurs décimaux de tes données en colonne A soient des "." ?
    oui, défini comme tel dans les paramètres régionaux.
    En J805, mets la formule =A805+A806.
    Qu'est-ce que ça donne ?
    1479.51, j'en conclu que ce sont bien 2 valeurs numériques?
    MATCH ne renvoie pas une adresse de cellule ni même un numéro de ligne mais un numéro d'ordre.
    je viens de le comprendre en tâtonnant. Du coup, je change de méthode https://www.developpez.net/forums/d2...artie-entiere/ mais je bloque sur la partie entière

    merci

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

Discussions similaires

  1. Utilisation des set
    Par Ikit dans le forum C++
    Réponses: 16
    Dernier message: 22/11/2006, 16h12
  2. Utilisation des sets
    Par Original Prankster dans le forum SL & STL
    Réponses: 6
    Dernier message: 08/02/2006, 21h28
  3. utiliser les set en C++
    Par yaskiki dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2005, 16h04
  4. utilisation de set locale
    Par ColonelHati dans le forum C
    Réponses: 7
    Dernier message: 02/05/2005, 14h25

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