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 :

Recherchev avec tableau module de classe


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    consultant actuariat
    Inscrit en
    Septembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant actuariat

    Informations forums :
    Inscription : Septembre 2016
    Messages : 8
    Par défaut Recherchev avec tableau module de classe
    Bonjour,

    Mon but est simple : identifier les écarts de contrats entre les matrices tImport et tExport. Mon problème est que je n'arrive pas à trouver la syntaxe neccésaire en utilisant des modules de classes pour mes 2 matrices.

    Je déclare mes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    'Déclaration de mon module 
    Public Type MatriceDonnees
        sContrat As String
        sSerie As String
        sSituation As String
    End Type
     
    'Tables
    Public tImport() As MatriceDonnees
    Public tExport() As MatriceDonnees
    La macro censé relever tous les contrats de la matrice tImport qui ne sont pas présents dans tExport :

    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
     
    Sub ContratsEcarts()
     
    Dim i As Integer
    Dim k as Integer
     
    k = 1
    For i = 1 To 100
        If IsError(Application.Match(tImport(i).sContrat, tExport().sContrat, 0)) Then
            Sheets("feuil1").Range("A1").Offset(k, 0) = tImport(i).sContrat
            k = k + 1
        End If
    Next i
     
    End Sub
    La syntaxe de "IsError(Application.Match(tImport(i).sContrat, tExport().sContrat, 0))" est fausse, plus précisément de """tExport().scontrat", j'ai essayé tout type de syntaxe mais je ne trouve pas.

    Merci d'avance pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut Une piste
    Bonjour,

    Quand vous parlez de module de classe, je ne vois qu'un structure dans votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Type MatriceDonnees
        sContrat As String
        sSerie As String
        sSituation As String
    End Type
    L'erreur que vous avez viens du fait de ne pas cibler un index dans votre tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'Si vous déclarez un tableau :
    Public tExport() As MatriceDonnees
     
    'Vous ne pouvez pas l'utilisez de manière globale comme ceci :
        'tExport().sContrat
    'Dans :
        'If IsError(Application.Match(tImport(i).sContrat, tExport().sContrat, 0)) Then
    'Il faut mettre un index dans le tableau :
        'tExport(INDEX).sContrat
    J'espère que cela vous aidera!

  3. #3
    Membre averti
    Homme Profil pro
    consultant actuariat
    Inscrit en
    Septembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant actuariat

    Informations forums :
    Inscription : Septembre 2016
    Messages : 8
    Par défaut
    Bonjour,

    Désolé pour le retard, mais je ne suis pas sure de comprendre votre réponse, bien entendu, je déclare mon tableau tExport de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    'Table des données export
    ReDim tExport(lNbContratExport)
     
    For i = 1 To lNbContratExport
        With Sheets(csSheetDatabase).Range(csDonnees)
            tExport(i).sBon = .Offset(i, 0)
            tExport(i).sContrat = .Offset(i, 1)
            tExport(i).dValRachat = .Offset(i, 4)
        End With
    Next i
    Et mon tableau tImport d'une manière similaire.

    Pour donner un exemple plus pratique, ce code fonctionne très bien :

    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
     
    Sub test()
     
    Dim table1() As Variant, table2() As Variant
    Dim i As Integer, k As Integer
     
    ReDim table1(3)
    ReDim table2(3)
     
    table1(1) = 1
    table1(2) = 2
    table1(3) = 3
    table2(1) = 2
    table2(2) = 3
    table2(3) = 4
     
    k = 1
    For i = 1 To 3
        If IsError(Application.Match(table1(i), table2(), 0)) Then
            Sheets(csSheetTableEcart).Range(csTableEcart).Offset(k, 0) = table1(i)
            k = k + 1
        End If
    Next i
     
    End Sub
    Mais si je remplacer table2() par tExport().sContrat, la macro ne fonctionne plus

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut Quelques précisions
    Bonjour,

    Depuis msdn vous pouvez voir la fonction Match (lien) avec les arguments d'entrée...

    Ce que vous tentez de faire ne peut pas fonctionner car vous essayez de passer une structure de donnée là où l'on attend un variant.

    Pour être plus précis (concernant l'argument 2) :
    Lookup_array - plage de cellules contiguës contenant des valeurs de recherche possibles.
    Lookup_array doit être une matrice ou une référence à une matrice.
    En conclusion, vous devez convertir votre tableau de structure en un tableau de type variant pour le passer à la fonction.

    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
     
    'Fonction de conversion du type MatriceDonnees vers Variant (uniquement le .sContrat)
    Function MatriceDonneesToVariant(Mat() As MatriceDonnees) As Variant()
     
        Dim Result() As Variant
        ReDim Result(UBound(Mat))
     
        Dim i As Long
        For i = 0 To UBound(Mat)
            Result(i) = Mat(i).sContrat
        Next
     
        MatriceDonneesToVariant = Result
     
    End Function
    Et enfin à l'usage

    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
     
    'Ton programme 1er de nom
    Sub ContratsEcarts()
     
    Dim i As Integer
    Dim k As Integer
     
    'En plus :
    Dim ListeDesContrats() As Variant
    ListeDesContrats = MatriceDonneesToVariant(tExport)
     
    k = 1
    For i = 1 To 100
        'If IsError(Application.Match(tImport(i).sContrat, tExport().sContrat, 0)) Then
        If IsError(Application.Match(tImport(i).sContrat, ListeDesContrats, 0)) Then
            Sheets("feuil1").Range("A1").Offset(k, 0) = tImport(i).sContrat
            k = k + 1
        End If
    Next i
     
    End Sub

    Une autre piste :

    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
     
    'Fonction de recherche adapté à ta structure
    Function FindItem(Item As MatriceDonnees, List() As MatriceDonnees) As Long
     
        Dim i As Long
        For i = 0 To UBound(List)
            If Shared_Equals(Item, List(i)) Then Exit For
        Next
     
        If i <= UBound(List) Then
            FindItem = i
        Else
            FindItem = -1
        End If
     
    End Function
     
    'Fonction opérateur "=" pour 2 éléments de ta structure
    Function Shared_Equals(ItemA As MatriceDonnees, ItemB As MatriceDonnees) As Boolean
     
        Shared_Equals = (ItemA.sContrat = ItemB.sContrat)
     
    End Function
    A l'usage :
    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
     
    'Ton programme 1er de nom
    Sub ContratsEcarts()
     
    Dim i As Integer
    Dim k As Integer
     
    k = 1
    For i = 1 To 100
        'If IsError(Application.Match(tImport(i).sContrat, ListeDesContrats, 0)) Then
        If FindItem(tImport(i), tExport) = -1 Then
            Sheets("feuil1").Range("A1").Offset(k, 0) = tImport(i).sContrat
            k = k + 1
        End If
    Next i
     
    End Sub
    Reste encore une faiblesse dans tous cela : le Ubound qui n'est pas suffisamment robuste.
    Pour cela, créez une 2 ème structure étant un tableau de votre matrice avec un nombre d'éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Type MatriceDonnees
        sContrat As String
        sSerie As String
        sSituation As String
    End Type
     
    Public Type ListOfMatriceDonnees
        NbItems As Long
        Items() As MatriceDonnees
    End Type
    Bonne chance!

  5. #5
    Membre averti
    Homme Profil pro
    consultant actuariat
    Inscrit en
    Septembre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant actuariat

    Informations forums :
    Inscription : Septembre 2016
    Messages : 8
    Par défaut
    Merci beaucoup pour cette réponse détaillée.

    C'est parfait !

    A+

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

Discussions similaires

  1. Recherchev avec tableau module de classe
    Par kevinourg dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/03/2017, 17h26
  2. [Toutes versions] Problème avec un module de classe
    Par LeForestier dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2009, 11h19
  3. [XL-2003] Soucis avec un module de classe en Vba
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2009, 11h09
  4. Classe avec tableau
    Par coberle dans le forum C++
    Réponses: 4
    Dernier message: 29/03/2009, 11h52
  5. erreur avec withevents dans un module de classe
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/12/2007, 04h32

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