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 de compatibilité de type lors de la compilation [XL-2007]


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
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut Problème de compatibilité de type lors de la compilation
    Bonjour à tous!

    Je suis actuellement en stage dans le cadre de ma 2ème année de BTS Info Gestion Option Développeur.

    Je dois 'automatiser' la saisie d'informations dans un fichier excel, recensant toutes les subventions reçues par l'entreprise, leur répartition et leur utilisation.
    Ce fichier doit se remplir à partir des fiches info des contrats de subventions.

    Le langage imposé est donc VBA (je n'en ai fais qu'une fois quand j'étais en 1ère STG Gestion...)

    Dans un premier temps j'ai créé une fonction récupérant tous les noms des fichiers commençant par Fiches Info (stockés dans un tableau à une dimension).
    Puis j'ai essayé de mettre le nom des fichiers dans la Colonne 'Contrat' de mon tableur. Lorsque je veux exécuter ma macro ce message d'erreur apparaît :

    Erreur de compilation : Incompatibilité de type
    (CF ligne en rose dans le code, et variable soulignée)

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    'Cette fonction récupère les noms de tous les fichiers comportant "Fiche INFO dans leur intitulé
    Public Function ListeFichier(ByVal maListe As String) As String
        Set FichierSch = Application.FileSearch
    
        With FichierSch
            'Dossier dans lequel chercher les fichiers
            .LookIn = "C:\Users\Akhane\Desktop\STAGE_IG2\excel"
            'Extension des fichiers à trouver
            .Filename = "*.xls"
            'Des fichiers on été trouvés
            If .Execute > 0 Then
                For compteur = 1 To .FoundFiles.Count
                    'Si le fichier commence "par Fiche Info" et est de type *.xsl
                    If Left(Right(.FoundFiles(compteur), Len(.FoundFiles(compteur)) - Len(.LookIn)), 21) = "Fiche INFO " Then
                        ReDim Preserve maListe(0 To .FoundFiles.Count)
                        If Not .FoundFiles.Count = 0 Then
                            'Initialisation du tableau grâce aux noms trouvés
                            maListe [compteur - 1] = .FoundFiles(compteur)
                        End If
                    End If
                MsgBox (compteur & "fichiers trouvés")
                Else
                    MsgBox ("pas de fichier excel trouvé")
    
            End If
        End With
    End Function
    
    
    'Cette procédure permet de remplir de manière automatique les colonnes liées au nom d un contrat
    Sub remplirInfosContrat()
        Dim compteur As Integer
        Dim k As Integer
        Dim myTab(2) As String
        Dim maListe(1) As String
        
        'Initialisation de k
        k = 0
        
        'Appel de la fonction ListeFichier
        maListe = Me.ListeFichier(maListe)
        
        'Boucle sur la liste des noms de fichiers
        For compteur = 0 To UBond(maListe, 1)
            'Ouverture du fichier correspondant à l'indice i
            Workbooks.Open Filename = maListe(i)
            
            'Séparation de la chaîne de caractères comportant le nom du fichier pour ne garder que le nom de l'acteur concerné
            myTab = Split(maListe(i), "-")
            
            'Affectation de ce nom à la cellule "contrat"
            Cells(15 + k, 7) = myTab(1)
            
            'incrémentation de k pour passer à la ligne d'en dessous s'il y a un nouveau fichier
            k = k + 1
        Next compteur
        
    End Sub
    En espérant que quelqu'un puisse éclairer ma lanterne...

    Merci d'avance

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour,

    dans Dim de Maliste, il ne faut pas mettre de (1) c'est un simple string, et c'est le cas.

    Je pense qu'il crois que tu veux passer une table à ta fonction et pas un string alors... il rale.

    Je ne comprend pas trop bien cette instruction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        maListe = Me.ListeFichier(maListe)
    Comment cela peut-il donne run résultat alors que maListe est à la fois parametre, résultat et non initialisé.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    maListe est sensé être un tableau où je stocke les noms des fichiers...
    J'ai essayé sans dimension, avec (1), etc... Le résultat est le même.

    Je ne vois pas trop comment récupérer le tableau retourné par ma fonction ListeFichiers!
    Je ne sais pas comment notifier à la fonction que maListe doit être le paramètre de sortie car à priori return maListe() ne fonctionne pas
    (Habituellement je code en PHP Objet et en Java Object :s)

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour
    Public Function ListeFichier(ByVal maListe As String) As String
    Attention à dissocier le parametre à passer et le résultat de la fonction.

    Je pense que ta fonction n'a pas besoin de paramètre (car tu ne lui envoies rien à l'appel) et qu'elle doit te retourner un tableau, ce qui nécessite une petite bidouille.

    Essaie ceci, que je n'ai pas testé.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    'Cette fonction récupère les noms de tous les fichiers comportant "Fiche INFO dans leur intitulé
    Public Function ListeFichier() As Variant
        Dim maListe() as string
        Set FichierSch = Application.FileSearch
    
        With FichierSch
            'Dossier dans lequel chercher les fichiers
            .LookIn = "C:\Users\Akhane\Desktop\STAGE_IG2\excel"
            'Extension des fichiers à trouver
            .Filename = "*.xls"
            'Des fichiers on été trouvés
            If .Execute > 0 Then
                For compteur = 1 To .FoundFiles.Count
                    'Si le fichier commence "par Fiche Info" et est de type *.xsl
                    If Left(Right(.FoundFiles(compteur), Len(.FoundFiles(compteur)) - Len(.LookIn)), 21) = "Fiche INFO " Then
                        ReDim Preserve maListe(0 To .FoundFiles.Count)
                        If Not .FoundFiles.Count = 0 Then
                            'Initialisation du tableau grâce aux noms trouvés
                           redim preserve maListe(compteur)
                            maListe [compteur - 1] = .FoundFiles(compteur)
                        End If
                    End If
                MsgBox (compteur & "fichiers trouvés")
                Else
                    MsgBox ("pas de fichier excel trouvé")
    
            End If
        End With
    
    ListeFichier=maliste
    End Function
    
    
    'Cette procédure permet de remplir de manière automatique les colonnes liées au nom d un contrat
    Sub remplirInfosContrat()
        Dim compteur As Integer
        Dim k As Integer
        Dim myTab(2) As String
        Dim maListe(1) As String
        
        'Initialisation de k
        k = 0
        
        'Appel de la fonction ListeFichier
        maListe = Me.ListeFichier()
        
        'Boucle sur la liste des noms de fichiers
        For compteur = 0 To UBond(maListe, 1)
            'Ouverture du fichier correspondant à l'indice i
            Workbooks.Open Filename = maListe(i)
            
            'Séparation de la chaîne de caractères comportant le nom du fichier pour ne garder que le nom de l'acteur concerné
            myTab = Split(maListe(i), "-")
            
            'Affectation de ce nom à la cellule "contrat"
            Cells(15 + k, 7) = myTab(1)
            
            'incrémentation de k pour passer à la ligne d'en dessous s'il y a un nouveau fichier
            k = k + 1
        Next compteur
        
    End Sub

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    Merci beaucoup pour l'aide!

    En effet c'est plus cohérent.

    Maintenant le hic c'est que j'utilise FileSearch et que excel 2007 ne le supporte plus... alors j'ai trouvé, peut être une solution, mais bon faut bidouiller du coup.

    Encore merci pour le temps passé

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Utilise donc Dir
    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
    35
    36
    37
    38
    39
    40
    41
    42
    Function ListeFichier() As Variant
    Dim Chemin As String, Fichier As String, maList() As String, Txt As String
    Dim Compteur As Integer
     
    Chemin = "C:\Users\Akhane\Desktop\STAGE_IG2\excel\"
    Txt = "Fiche INFO"
    Fichier = Dir(Chemin & "*.xls*")
    Do While Fichier <> ""
       If InStr(Fichier, Txt) Then
          Compteur = Compteur + 1
          ReDim Preserve maList(1 To Compteur)
          maList(Compteur) = Fichier
       End If
       Fichier = Dir()
    Loop
    If Compteur > 0 Then ListeFichier = maList
    MsgBox Compteur & " fichiers trouvés"
    End Function
     
     
    'Cette procédure permet de remplir de manière automatique les colonnes liées au nom d un contrat
    Sub remplirInfosContrat()
    Dim Compteur As Integer, k As Integer
    Dim myTab As Variant, maListe As Variant
     
    maListe = ListeFichier()
    If IsArray(maListe) Then
       'Appel de la fonction ListeFichier
       'Boucle sur la liste des noms de fichiers
       For Compteur = 1 To UBound(maListe)
          'Séparation de la chaîne de caractères comportant le nom du fichier pour ne garder que le nom de l'acteur concerné
          myTab = Split(maListe(Compteur), "-")
          'Affectation de ce nom à la cellule "contrat"
          With ThisWorkbook.Sheets("Feuil1").Cells(15 + k, 7)
             .Value = Left(myTab(1), InStrRev(myTab(1), ".") - 1)
             .Offset(0, 1).Value = maListe(Compteur)
          End With
          'incrémentation de k pour passer à la ligne d'en dessous s'il y a un nouveau fichier
          k = k + 1
       Next Compteur
    End If
    End Sub

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    Merci beaucoup!
    J'avais effectivement vu qu'il fallait utiliser un Dir...

    J'ai une erreur par contre sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myTab = Split(maListe(Compteur), "-")
    D'ailleurs sur mon code j'ai modifié un peu cette ligne car un tableau démarre à indice 0 et Compteur démarre à 1...
    J'ai mis maListe(Compteur - 1)

    Du coup j'ai une erreur d'éxecution : 9 "l'indice n'appartient pas à la sélection"

    Et si je laisse maListe(Compteur) j'ai une erreur qui apparaît et qui dit que l'appel de la fonction n'est pas fait correctement sur cette ligne là aussi...

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Reprenons dès le début
    Tu as dans ton dossier C:\Users\Akhane\Desktop\STAGE_IG2\excel\ un ensemble de fichiers.
    Tu cherche à récupérer dans un tableau l'ensemble des fichiers excel dont le nom contient le mot Fiche INFO
    Ces fichiers sont nommés de la sorte Fiche INFO - XXXXX.xls; où XXXXX est le nom du contact que tu veux insérer dans ta feuille excel.

    J'attends confirmation, parce que le code tel que j'avais posté fonctionne pile poile sous les conditions énumérées ci-haut

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

Discussions similaires

  1. XE5, problème de compatibilité de type
    Par Papy214 dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2013, 15h50
  2. Réponses: 3
    Dernier message: 15/09/2011, 11h39
  3. Problème de content type lors d'un l'appel de WebService
    Par fab76000 dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 10/12/2010, 16h46
  4. Réponses: 4
    Dernier message: 31/03/2008, 14h07
  5. Problème de compatibilité de types avec Delphi et SQLServer
    Par scrat88 dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/05/2006, 11h31

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