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 :

Ondelettes de Haar Version Macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut Ondelettes de Haar Version Macro
    Bonsoir,

    Je me suis écrit une petite fonction qui transforme un tableau de nombres suivant la méthode des ondelettes de Haar :

    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
    Function HAAR1(Table As Range)
        n = Table.Rows.Count
        ReDim Table1(n - 1, n - 1)
        ReDim Table2(n - 1, n - 1)
     
        For i = 1 To n
            For j = 1 To n / 2
                Table1(i - 1, j - 1) = Table(i, 2 * j - 1) + Table(i, 2 * j)
                Table1(i - 1, n / 2 - 1 + j) = Table(i, 2 * j - 1) - Table(i, 2 * j)
            Next j
        Next i
     
        For j = 0 To n - 1
            For i = 0 To n / 2 - 1
                Table2(i, j) = (Table1(2 * i, j) + Table1(2 * i + 1, j)) / 2
                Table2(n / 2 + i, j) = (Table1(2 * i, j) - Table1(2 * i + 1, j)) / 2
            Next i
        Next j
     
        HAAR1 = Table2
     
    End Function
    C'est juste la première étape. Elle marche très bien quand je l'applique "à la main", mais je voudrais l'appliquer à la chaîne et je ne sais pas comment l'intégrer dans une procédure. J'ai trois questions en fait.

    1) Par miracle, ma fonction fonctionne, mais je n'ai pas compris quel type de variable elle me sort...! Elle prend un type Range en entrée, mais je ne crois pas qu'elle sorte un Range en sortie... du coup, je ne sais pas comment manipuler le tableau que j'obtiens en sortie.

    2) Comment je peux récupérer sur la feuille 1 de mon classeur la plage de cellules contenant toutes les cellules non vides (c'est un bloc carré commençant en A1 mais de dimension variable) et la mettre dans une variable "Tableau_de_depart" (type Range) sur laquelle je pourrai appliquer ma fonction HAAR ?

    3) Quand j'aurai transformé mon tableau_de_départ en appliquant la fonction HAAR plusieurs fois, je retrouve le résultat dans une variable "Tableau_d_arrive". Comment je fais pour l'afficher sur la feuille 2 ? Je dois l'afficher cellule par cellule avec deux boucles For Next et la fonction Cells par exemple ou il y a une instruction pour l'afficher directement ? Bien sûr, cette question est liée à la première !

    Merci beaucoup d'avance.

    Greg

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Quelques éléments de réponses
    Citation Envoyé par galigori Voir le message
    1) Par miracle, ma fonction fonctionne, mais je n'ai pas compris quel type de variable elle me sort...! Elle prend un type Range en entrée, mais je ne crois pas qu'elle sorte un Range en sortie... du coup, je ne sais pas comment manipuler le tableau que j'obtiens en sortie.
    Comme tu n'as pas donné de type à la fonction, par défaut c'est un variant. Comme tu lui affectes la valeur Table2, la fonction retourne un tableau identique à Table2

    Citation Envoyé par galigori Voir le message
    2) Comment je peux récupérer sur la feuille 1 de mon classeur la plage de cellules contenant toutes les cellules non vides (c'est un bloc carré commençant en A1 mais de dimension variable) et la mettre dans une variable "Tableau_de_depart" (type Range) sur laquelle je pourrai appliquer ma fonction HAAR ?
    La méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkBook.Worksheets("NomFeuille").Range("A1").CurrentRegion
    devrait renvoyer la plage que tu cherches.



    Citation Envoyé par galigori Voir le message
    3) Quand j'aurai transformé mon tableau_de_départ en appliquant la fonction HAAR plusieurs fois, je retrouve le résultat dans une variable "Tableau_d_arrive". Comment je fais pour l'afficher sur la feuille 2 ? Je dois l'afficher cellule par cellule avec deux boucles For Next et la fonction Cells par exemple ou il y a une instruction pour l'afficher directement ? Bien sûr, cette question est liée à la première !
    SI tu veux afficher à partir de la cellule A1, tu crées une plage de la même taille que le tableau en utilisant la métode resize. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oRng = Thisworkbook.Worksheets("Feuil2").Range("A1").Resize(ubound(Montab,1), Ubound(MonTab,2)
    et tu copies en une foisMais attention le tableau doit être indicé à partir de 1 et pas de 0.

    COrdialement,

    PGZ

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    Merci beaucoup pour ces réponses... je dois aller bosser et ne peux pas tester ça de suite mais je vais m'y remettre dès que possible !

    J'ai peur d'avoir des problèmes dus au fait que je mélange un peu deux objets différents (des Range pour Table, et des Array ou des Variant pour Table1 et Table2, je ne sais pas trop !), mais on verra bien

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    Merci PGZ.

    Grâce à tes morceaux de codes, j'ai une macro HAAR qui marche très bien, en appelant ma fonction précédente (légèrement modifiée pour être indicée à partir de 1 comme tu me l'as dit) qui écrit en Feuil2 un tableau de nombres modifiés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub HAAR()
        Montab = ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion
        m = UBound(Montab, 1)
     
        Montab = HAAR1(ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion)
        Set oRng = ThisWorkbook.Worksheets("Feuil2").Range("A1").Resize(m, m)
        oRng.Value = Montab
     
    End Sub
    Maintenant, j'ai deux autres problèmes :
    1) Je ne comprends pas pourquoi ceci ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub HAAR()
        Montab = ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion
        m = UBound(Montab, 1)
     
        Montab = HAAR1(Montab)
        Set oRng = ThisWorkbook.Worksheets("Feuil2").Range("A1").Resize(m, m)
        oRng.Value = Montab
     
    End Sub
    Si Montab = ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion, pourquoi HAAR1(Montab) ne marche pas alors que HAAR1(ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion) fonctionne très bien ?

    2) Je prends au départ un tableau de taille m... j'aurais besoin de réappliquer ma procédure à un tableau de taille m/2 ensuite. Quelle es l'instruction pour affecter à Montab la plage de cellules carrée commençant en A1 et de taille m/2 ?

    Merci d'avance encore une fois.

    Greg

  5. #5
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    1.Je crois que ta procédure HAAR1 attend un paramètre de type Excel.Range. DOnc quand tu passes un Range, cela fonctionne, quand tu passes le tableau correspondant cela ne peut pas marcher.

    2. Si m est pair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets("Feuil2").Range("A1").Resize(m/2, m/2)
    Cordialement,

    PGZ

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    Je pensais que "ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion" renvoyait un Range (puisqu'il marche avec ma fonction qui attend un Range), et qu'en écrivant Montab = "ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion", j'obtenais un Range... Mais forcément, ça ne pouvait pas être aussi simple

    Encore merci !

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

Discussions similaires

  1. Ondelette de Haar sur Excel
    Par galigori dans le forum Excel
    Réponses: 8
    Dernier message: 27/02/2011, 16h34
  2. ondelette de haar
    Par raida8 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 18/04/2008, 16h49
  3. decomposition en ondelette de haar
    Par yacineess19 dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/04/2008, 19h27
  4. transformée en ondelette de Haar
    Par contremaitre dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 07/02/2008, 10h41

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