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 :

Excel 2010 - VBA - Erreur 13 (incompatibilité de type) et fonction Année


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut Excel 2010 - VBA - Erreur 13 (incompatibilité de type) et fonction Année
    Bonjour amis du forum,

    Voici une macro qui exporte des colonnes d'une table de données (plan d'actions - fichier source) dans un fichier "Rapport" (cible).
    Cette macro fonctionne, sauf à une partie de l'étape de mise en forme :

    A l'étape 7 du code, la macro doit (entre autres) "Colorier les lignes des actions >= à une date de référence, qui est saisie dans une autre feuille que le fichier".
    Cette partie du code génère une Erreur 13 (incompatibilité de type) sur la ligne 97 : "Annee = Year(DueDate)".

    J'ai copié cette partie du code dans un autre fichier pour la tester séparémment du reste.... et cela fonctionne bien !
    Je ne trouve pas pourquoi ce code ne fonctionne pas quand il est installé à l'interieur de la macro principale.

    La seule difference entre le code du fichier test et celui du classeur de la table de données est l'adresse de la cellule qui contient l'année de référence (ligne 89), car j'ai du l'adapter.
    (En revanche, la cellule de l'annee de reference est au même format dans les 2 fichers)

    Un oeil averti et acéré pourrait il me venir en aide ?

    Remerciements
    Marino



    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    Sub Etat_Annee_Prochaine()
    '
    ''Exporter les colonnes et la valeur du filtre Priorités + valeurs du fichier EnTete
     
      ' Etape 1 : Déclarer les fichiers sans Chemin d'accès, car tous dans le même répertoire
      Dim Chemin As String, FichierDestinataire As String, NouveauFichier As String
     
      Chemin = ThisWorkbook.Path & "\"
      FichierSource = ThisWorkbook.Name
      FichierDestinataire = "Rapport_AnneeProchaine.xls"
      NouveauFichier = "Rapport_AnneeProchaine_" & Format(Date, "dd-mmmm-yyyy") & "_" & Format(Time, "hh-mm-ss") & ".xls"
     
      ' Etape 2 : Ouvrir le 2eme fichiers (cible), le 1er est déjà ouvert (Origine) car c'est celui de la macro
      Workbooks.Open Chemin & FichierDestinataire
     
      ' Etape3 : Déclarer les feuilles de travail
      Dim Source As Workbook, Destinataire As Workbook
      Dim ActionDatabase As Worksheet, BoutonMacro As Worksheet, Departements As Range, DepartementsCible As Range, Cible As Worksheet, EnTete As Worksheet
     
      Set Source = ThisWorkbook
      Set ActionDatabase = Source.Sheets("Action Database")
      Set BoutonMacro = Source.Sheets("Rapports")
      Set Departements = Source.Sheets("Data Craponne").Columns("I:I")
      Set Destinataire = Workbooks("Rapport_AnneeProchaine")
      Set Cible = Destinataire.Sheets("Cible")
      Set EnTete = Destinataire.Sheets("EnTete")
      Set DepartementsCible = Destinataire.Sheets("EnTete").Columns("H:H")
     
     
      Windows(FichierSource).Activate 'action nécessaire
     
      'Etape 4 : Pour injecter dans la table à filtrer (Celule du filtre dan Action Database), la sélection des "priorités" dont on souhaite le rapport
      ActionDatabase.Range("BS2") = BoutonMacro.Range("C17")
      ActionDatabase.Range("BS3") = BoutonMacro.Range("C18")
      ActionDatabase.Range("BS4") = BoutonMacro.Range("C19")
     
      ActionDatabase.Activate
     
      ' Etape 5 : Exporter les valeurs des colonnes du Rapport des Status (Filtre)
      Range("A1:BC1000").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("BS1:BU4"), CopyToRange:=Cible.Range("A1:N1"), Unique:=False
     
      ' Etape 6 : Puis, copier de Origine vers Cible-onglet EnTete, la valeur des Priorités saisies et de la date de l'export, pour les intégrer à l'en-tête et copier la lise des départements
      EnTete.Range("A2") = ActionDatabase.Range("BS2")
      EnTete.Range("A3") = ActionDatabase.Range("BS3")
      EnTete.Range("A4") = ActionDatabase.Range("BS4")
      EnTete.Range("C2") = ActionDatabase.Range("BR2")
     
      Departements.Copy DepartementsCible
     
     
      ' Etape 7 : Mises en forme
     
      Cible.Activate
     
        With Cible
     
            ' Mise en forme du tableau
            ' Réglage des largeurs de colonne
            Cible.Columns("A:A").ColumnWidth = 10
            Cible.Columns("B:B").ColumnWidth = 50
            Cible.Columns("C:C").ColumnWidth = 35
            Cible.Columns("D:D").ColumnWidth = 35
            Cible.Columns("E:E").ColumnWidth = 10
            Cible.Columns("F:F").ColumnWidth = 15
            Cible.Columns("G:G").ColumnWidth = 9
            Cible.Columns("H:H").ColumnWidth = 11
            Cible.Columns("I:I").ColumnWidth = 15
            Cible.Columns("J:J").ColumnWidth = 9
            Cible.Columns("K:K").ColumnWidth = 7
            Cible.Columns("L:L").ColumnWidth = 23
            Cible.Columns("M:M").ColumnWidth = 50
            Cible.Columns("N:N").ColumnWidth = 17
     
     
            ' Réglage de la police
            Cells.Select
     
                With Selection.Font
                    .Name = "Calibri"
                    .Size = 10
                End With
     
            ' Colorier les lignes des actions 2017 et plus
                Dim Ligne As Long, PlageLigne As Variant
                Dim ActionNumber As Variant
                Dim DueDate As Variant, Annee As Variant, SelectionAnnee As Variant
     
                SelectionAnnee = Source.Sheets("Rapports").Cells(25, 3)      'Seletion de l'année de referrence - Seule ligne differente de celle du fichier test
     
                    For Ligne = 2 To Rows.Count
     
                        Set ActionNumber = Cells(Ligne, 1)                
                        Set PlageLigne = Range("A" & Ligne, "N" & Ligne)
     
                        DueDate = Cells(Ligne, 5)                             
                        Annee = Year(DueDate)                                            'BUG = Erreur 13 - incompatibilité de type
     
     
                            If ActionNumber = "" Then
                                Exit For ' pour sortir de cette routine FOR...NEXT
                            Else
                                If Annee >= SelectionAnnee Then
                                PlageLigne.Interior.Color = RGB(255, 224, 192)
                                End If
                            End If
     
                    Next Ligne
     
            ' Ajustement des hauteurs de ligne au texte
            Cells.EntireRow.AutoFit
     
            ' Réglage format pge marges zoom et en-tête
                With Cible.PageSetup
     
                    .Orientation = xlLandscape
                    .LeftMargin = Application.InchesToPoints(0.236220472440945)
                    .RightMargin = Application.InchesToPoints(0.236220472440945)
                    .TopMargin = Application.InchesToPoints(0.748031496062992)
                    .BottomMargin = Application.InchesToPoints(0.748031496062992)
                    .HeaderMargin = Application.InchesToPoints(0.31496062992126)
                    .FooterMargin = Application.InchesToPoints(0.31496062992126)
     
                    ' Réglage de l'en-tête du rapport
                    Dim Police As Variant, Taille As Integer
                    Police = "Arial"
                    'Taille = 20 'comment utilisr la variables taille ?
     
                    ' Imprimer la 1ere ligne sur toutes les pages
                    .PrintTitleRows = "$1:$1"
                    .PrintTitleColumns = ""
     
                    'Mettre l'en-tête de l'impression
                    Dim CentreEnTete As Variant, GaucheEnTete As Variant
                    GaucheEnTete = EnTete.Range("B6")
                    CentreEnTete = EnTete.Range("B7")
                    .CenterHeader = "&""" & Police & """&20" & CentreEnTete 'comment utilisr la variables taille ?
                    .LeftHeader = "&""" & Police & """&20" & GaucheEnTete
     
                    'Pour terminer l'enchainement sur la cellule A1 du rapport
                    Cible.Range("A1").Select
     
                End With
        End With
     
      ' Etape 7 : Sauvegarder sous le nom défini pour NouveauFichier
      Destinataire.SaveAs Chemin & NouveauFichier
     
    '
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    la grande tolérance de vba fera que ton code fonctionnera en dépit de ce que ta variable duedate n'est pas typée en date et que tu ne précises pas non plus la propriété utilisée de la cellule concernée.
    Il faut donc en conclure que cette cellule ne contient pas une valeur correspondant à une date valide !

    Je te conseille d'ailleurs fortement de :
    - formater en date les cellules devant en contenir une
    - typer duedate en date et non en variant
    - préciser la propriété utilisée de la cellule (propriété value)
    mais même ainsi : si date non valide, tu auras cette erreur. Validité de la date à vérifier par If Isdate

  3. #3
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut
    Bonjour unparia,

    Merci pour tes conseils qui m'ont remis sur la piste d'une solution.

    Comme conseillé, j'ai déclaré , Duedate de type date et précisé la propriété ".Value" pour décrire Duedate avant de l'utiliser avec la fonction Annee.
    Et comme tu l'avais prévu il s'est produit encore une erreur ... cependant, toutes les cellules Duedate sont bien au format date.
    Par contre, certaines cellules Duedate sont vide, (date = 00:00:00) j'ai donc ajouté une condition pour exclure l'exploitation des cellules vides : succès ! (voir code)

    J'ai bien noté l'interrêt du test sur la Validité de la date à vérifier par If Isdate, mais je n'ai pas réussi à le mettre en oeuvre pour l'instant.

    Voilà ce que j'ai essayé mais j'ai des pb de "next sans for" ...(= pb avec les If /End if je suppose)
    If Isdate(DueDate) = faux then Annee = "faux"
    puis plus bas
    If Annee = "faux"
    PlageLigne.Interior.Color = RGB(224, 0, 0) pour repérer la ligne en rouge

    Je continuerai plus tard - Pourrais-tu me dire si je suis dans la bonne voie, coté synthaxe ?

    Merci encore
    Marino


    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
     
    ' Colorier les cellules des actions 2017 et plus
                Dim Ligne As Long, PlageLigne As Variant
                Dim ActionNumber As Variant
                Dim CellDueDate As Range
     
                Dim DueDate As Date, Annee As Variant, SelectionAnnee As Integer 
                     'DueDate en Date; Annee en Variant (la fonction Annee renvoie un integer mais Annee peut ausi être = "") ; SelectionAnnee en Integer (car utilisée pour comparaison avec annee)
     
                SelectionAnnee = Source.Sheets("Rapports").Cells(25, 3)
     
                    For Ligne = 2 To Rows.Count
     
                        Set ActionNumber = Cells(Ligne, 8)
                        Set CellDueDate = Cells(Ligne, 5)
                        Set PlageLigne = Range("A" & Ligne, "N" & Ligne)
     
     
                        If ActionNumber = "" Then
                            Exit For                                                     'Pour sortir de cette routine FOR...NEXT
                        End If
     
                        If CellDueDate = "" Then                                   'Pour exclure les cellules vides de l'exploitation avec la fonction Année
                            Annee = ""
                        Else
                            DueDate = Cells(Ligne, 5).Value                      'Ajout propriété value pour l'exploitation avec la fonction Année
                            Annee = Year(DueDate)
                        End If
     
                        If Annee <> "" And Annee >= SelectionAnnee Then
                            PlageLigne.Interior.Color = RGB(255, 224, 192)
                        End If
     
                    Next Ligne

  4. #4
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut
    Merci unparia pour ton aide - Je clos la discussion.
    A bientôt,
    Marino

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

Discussions similaires

  1. Erreur &H8004005 - Excel 2010 - VBA - MSForms
    Par gb78630 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/01/2016, 11h05
  2. Erreur d'incompatibilité de types
    Par étoile de mer dans le forum Débuter
    Réponses: 27
    Dernier message: 01/06/2008, 17h14
  3. DLookup, Erreur d'incompatibilité de type (13)
    Par athos7776 dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/08/2007, 17h25
  4. Erreur 13 : incompatibilité de type
    Par Donatelli dans le forum Access
    Réponses: 1
    Dernier message: 03/01/2007, 12h19
  5. [VBA-A] ADO - Erreur 13 Incompatibilité de Type
    Par db30 dans le forum VBA Access
    Réponses: 4
    Dernier message: 15/04/2006, 14h30

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