Application.Match - problème d'incompatibilité de type

fandaor Messages postés 10 Statut Membre -  
fandaor Messages postés 10 Statut Membre -
Bonjour,

Je travaille sur deux onglets :
un onglet "statique" avec des champs et des tables de valeur définies
un onglet dynamique qui est généré "à la volée" lors d'un click sur un bouton.

J'ai réussi à faire une boucle de condition pour griser mes colonnes si ça tombe un samedi ou un dimanche et maintenant j'essaie de vérifier que ce n'est pas un jour férier.

J'ai donc un onglet "Configuration" dans lequel j'ai une colonne avec toutes les dates de jours fériers (colonne A)

Lorsque je fais mon planning à la volée, je créer les dates dans chaque cellule.
J'ai la variable : monjour = Date + j qui me retourne bien une date (avec j = 0 to 365).

Quand je veux faire ma condition pour vérifier je met le code :

If Application.Match(monjour, Worksheets("Configuration").Range("A1:A100").Value, 0) Then
ActiveCell.EntireColumn.Interior.ColorIndex = 15
Else
ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
End If

Et quand je lance ça j'ai une incompatibilité de type.

Pourtant j'ai bien
Dim monjour As Date
donc je suppose que même si la colonne A de Configuration est définie comme Date (type 14/03/2001) j'ai l'impression qu'il ne considère pas la valeur comme Date...

Est-ce que quelqu'un pourrait me dire comment faire pour que la comparaison fonctionne s'il vous plaît ?

Merci d'avance.

Fand'

3 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Déjà .. que vient faire le .value la dedans ?
    dans la doc (accessible en faisant F1 sur ton clavier après avoir surligné le mot match )

    Syntaxe

    expression.Match(Arg1, Arg2, Arg3)

    expression Variable représentant un objet WorksheetFunction.

    Paramètres

    Nom Obligatoire/Facultatif Type de données Description
    Arg1 Obligatoire Variante Valeur_cherchée - valeur que vous utilisez pour rechercher la valeur souhaitée dans un tableau.
    Arg2 Obligatoire Variante Matrice_recherche - plage de cellules contiguës contenant des valeurs de recherche possibles. Matrice_recherche doit être une matrice ou une référence à une matrice.
    Arg3 Facultatif Variante Type - nombre -1, 0 ou 1. Type spécifie la manière dont Microsoft Excel recherche valeur_cherchée dans matrice_recherche.



    Ensuite, il faut convertir la date en LONG
    
    res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
    If res Then
      ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
      ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
    

    0
    1. fandaor Messages postés 10 Statut Membre
       
      Merci bien pour la réponse, et désolé pour le retard mais j'étais en formation.

      Je comprend le coup de passage en Long mais du coup j'ai une incompatibilité de type qui apparaît au moment de la définition de res. D'un côté je passe une variable en Long que je tente de comparer avec un tableau de dates...
      J'ai tenté de passer les variables du tableau en long mais même sanction.
      C'est un peu bizarre...
      Quelqu'un aurait un exemple de comparaison de date vis à vis d'un tableau de dates ?

      Merci d'avance,

      Fand'
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > fandaor Messages postés 10 Statut Membre
         
        Normalement, si tes colonnes sont bien définies en DATE ... ça ne pose aucun problème.
        Excel traitant les dates comme des LONG (sans que tu n'aies rien à faire de particulier....)
        J'ai testé le code que je t'ai donné... et il fonctionne très bien....
        0
  2. fandaor Messages postés 10 Statut Membre
     
    oui c'erst hyper bizarre... pourtant mon code semble correct :

    Sub Creation_Calendrier_365()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
    Dim ferier As Date
    Dim res As Long
    Dim n As Long
     
        ActiveSheet.Rows(1).NumberFormat = "dd-mm-yyyy"
        ActiveSheet.Range("H1").Select
            For j = 1 To 365
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
     
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = monjour
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
     
    End If
    ActiveCell.Offset(RowOffset:=-1).Activate
             
    ' On grise les jours fériers
    ' For n = 1 To 100
            Worksheets("Configuration").Range("A1:A100").NumberFormat = "dd-mm-yyyy"
            ' res = Worksheets("Configuration").Range("A1:A100")
            res = Application.Match(monjour, Worksheets("Configuration").Range("A1:A100"), 0)
                'If Application.Match(monjour, res, 0) Then
                If res Then
                    ActiveCell.EntireColumn.Interior.ColorIndex = 15
                Else
                    ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
                    ActiveCell.Offset(RowOffset:=1).Activate
                    ActiveCell.FormulaR1C1 = res
                    ActiveCell.Offset(RowOffset:=-1).Activate
                End If
            ' ActiveCell.Offset(RowOffset:=-1).Activate
    ' Next n
     
                
            Next j
    End Sub
    


    EDIT : Ajout des balises de code (la coloration syntaxique).
    Explications disponibles ici :ICI

    Merci d'y penser dans tes prochains messages.


    Je deviens chèvre là...
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Sauf... que dans ton code... je ne vois la la conversion en LONG .... Oo ??
      0
    2. fandaor Messages postés 10 Statut Membre
       
      Oui, mais même quand je je passe monjour ou les deux valeurs en Long j'ai le même message :-/
      C'est bizarre...
      0
    3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      quelles "deux valeurs" ??
      Montres le code essayé avec le long !
      0
  3. fandaor Messages postés 10 Statut Membre
     
    Voilà la première partie :

    Option Explicit
    Dim n As Long
    Dim myFormul As String
    Sub creer_calendrier()
     
    ' #########################################################
    ' ###   Section création des onglets et du calendrier   ###
    ' #########################################################
     
    'On efface les trois onglets de planning
        ' désactivation de la confirmation de suppression
        Application.DisplayAlerts = False
       
        ' On supprime et on recrée les trois onglets de planning
       
           Sheets("Planning Annuel").Delete
            Sheets.Add.Move After:=Sheets(Sheets.Count)
            Sheets(Sheets.Count).Name = "Planning Annuel"
     
           
           Sheets("Planning 1 mois").Delete
           Sheets.Add.Move After:=Sheets(Sheets.Count)
           Sheets(Sheets.Count).Name = "Planning 1 mois"
           
          Sheets("Planning Hebdo").Delete
           Sheets.Add.Move After:=Sheets(Sheets.Count)
           Sheets(Sheets.Count).Name = "Planning Hebdo"
          
    ' On regénère les dates sur chaque onglet
         Sheets("Planning Annuel").Select
            Creation_Calendrier_5
            Creation_Calendrier_365
           
         Sheets("Planning 1 mois").Select
            Creation_Calendrier_5
            Creation_Calendrier_30
           
         Sheets("Planning Hebdo").Select
            Creation_Calendrier_5
            Creation_Calendrier_7
           
     
    End Sub
    Sub Creation_Calendrier_5()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("C1").Select
            For j = 4 To 0 Step -1
            monjour = Date - j
            stJS = WeekdayName(Weekday(monjour - 1))
                  
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = monjour
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
            Next j
    End Sub
    Sub Creation_Calendrier_7()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("H1").Select
            For j = 1 To 7
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
               
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = "=TODAY()+" & j
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
               
            Next j
    End Sub
    Sub Creation_Calendrier_30()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("H1").Select
            For j = 1 To 30
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
     
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = "=TODAY()+" & j
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
            Next j
    End Sub
    Sub Creation_Calendrier_365()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
    Dim ferier As Date
    Dim res As Long
    Dim n As Long
     
        ActiveSheet.Rows(1).NumberFormat = "dd-mm-yyyy"
        ActiveSheet.Range("H1").Select
            For j = 1 To 365
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
     
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = monjour
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
     
    End If
    ActiveCell.Offset(RowOffset:=-1).Activate
             
    ' On grise les jours fériers
    ' For n = 1 To 100
            Worksheets("Configuration").Range("A1:A100").NumberFormat = "dd-mm-yyyy"
            ' res = Worksheets("Configuration").Range("A1:A100")
            res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
                'If Application.Match(monjour, res, 0) Then
                If res Then
                    ActiveCell.EntireColumn.Interior.ColorIndex = 15
                Else
                    ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
                    ActiveCell.Offset(RowOffset:=1).Activate
                    ActiveCell.FormulaR1C1 = res
                    ActiveCell.Offset(RowOffset:=-1).Activate
                End If
            ' ActiveCell.Offset(RowOffset:=-1).Activate
    ' Next n
     
               
            Next j
    End Sub
    
     


    Et la deuxième version :

    Option Explicit
    Dim n As Long
    Dim myFormul As String
    Sub creer_calendrier()
     
    ' #########################################################
    ' ###   Section création des onglets et du calendrier   ###
    ' #########################################################
     
    'On efface les trois onglets de planning
        ' désactivation de la confirmation de suppression
        Application.DisplayAlerts = False
       
        ' On supprime et on recrée les trois onglets de planning
       
           Sheets("Planning Annuel").Delete
            Sheets.Add.Move After:=Sheets(Sheets.Count)
            Sheets(Sheets.Count).Name = "Planning Annuel"
     
           
           Sheets("Planning 1 mois").Delete
           Sheets.Add.Move After:=Sheets(Sheets.Count)
           Sheets(Sheets.Count).Name = "Planning 1 mois"
           
          Sheets("Planning Hebdo").Delete
           Sheets.Add.Move After:=Sheets(Sheets.Count)
           Sheets(Sheets.Count).Name = "Planning Hebdo"
          
    ' On regénère les dates sur chaque onglet
         Sheets("Planning Annuel").Select
            Creation_Calendrier_5
            Creation_Calendrier_365
           
         Sheets("Planning 1 mois").Select
            Creation_Calendrier_5
            Creation_Calendrier_30
           
         Sheets("Planning Hebdo").Select
            Creation_Calendrier_5
            Creation_Calendrier_7
           
     
    End Sub
    Sub Creation_Calendrier_5()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("C1").Select
            For j = 4 To 0 Step -1
            monjour = Date - j
            stJS = WeekdayName(Weekday(monjour - 1))
                  
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = monjour
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
            Next j
    End Sub
    Sub Creation_Calendrier_7()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("H1").Select
            For j = 1 To 7
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
               
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = "=TODAY()+" & j
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
               
            Next j
    End Sub
    Sub Creation_Calendrier_30()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
     
        ActiveSheet.Range("H1").Select
            For j = 1 To 30
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
     
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = "=TODAY()+" & j
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
    End If
                ActiveCell.Offset(RowOffset:=-1).Activate
            Next j
    End Sub
    Sub Creation_Calendrier_365()
    Dim j As Long
    Dim monjour As Date
    Dim stJS
    Dim ferier As Date
    Dim res As Long
    Dim n As Long
     
        ActiveSheet.Rows(1).NumberFormat = "dd-mm-yyyy"
        ActiveSheet.Range("H1").Select
            For j = 1 To 365
    monjour = Date + j
    stJS = WeekdayName(Weekday(monjour - 1))
     
                ActiveCell.Offset(ColumnOffset:=1).Activate
                ActiveCell.FormulaR1C1 = monjour
                ActiveCell.Offset(RowOffset:=1).Activate
                ActiveCell.FormulaR1C1 = stJS
     
    ' On grise les week-end
    If Weekday(monjour, 2) > 5 Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
    Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
     
    End If
    ActiveCell.Offset(RowOffset:=-1).Activate
             
    ' On grise les jours fériers
    ' For n = 1 To 100
            Worksheets("Configuration").Range("A1:A100").NumberFormat = "dd-mm-yyyy"
            res = Worksheets("Configuration").Range("A1:A100")
           
            ' res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
                If Application.Match(CLng(monjour), CLng(res), 0) Then
                ' If res Then
                    ActiveCell.EntireColumn.Interior.ColorIndex = 15
                Else
                    ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
                    ActiveCell.Offset(RowOffset:=1).Activate
                    ActiveCell.FormulaR1C1 = res
                    ActiveCell.Offset(RowOffset:=-1).Activate
                End If
            ' ActiveCell.Offset(RowOffset:=-1).Activate
    ' Next n
     
               
            Next j
    End Sub
     


    Les deux retournent la même erreur d'incompatibilité de type ...
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      (CLng(monjour), CLng(res)
      

      le CnLong sur mnjour .. ok .... mais sur RES ????

      En plus... tu n'as pas repris mon code... regarde bien ce que j'avais écrit :
      res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
      If res Then
        ActiveCell.EntireColumn.Interior.ColorIndex = 15
      Else
        ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
      End If
      

      Dans MON code ... res n'est pas une PLAGE de cellule... mais le resultat du MATCH ......
      0
    2. fandaor Messages postés 10 Statut Membre
       
      yup mais l'exemple 1 reprend comme ton code et pourtant j'ai la même erreur ...

      res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
      


      Très space...
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > fandaor Messages postés 10 Statut Membre
         
        Quand tu regardes le format de tes cellules directement sur ta feuille ... quel est-il ? iil est bien en "date" ?
        Si tu mets un point d'arrêt sur ton programme et et que tu regardes la valeur te tes variables (par exemple monjour) quelle est elle ?
        0
    3. fandaor Messages postés 10 Statut Membre
       
      Ah je crois avoir compris le soucis mais je ne sais pas trop comment le résoudre...
      Mes valeurs sont bien affichées en DATE avec le format dd-mm-yyyy mais elles sont entrées en dd/mm/yyyy
      Du coup sur la première valeur que je compare je trouve :
      13-01-2016 en affichage, mais 13/01/2016 en valeur entrée
      et ma première valeur du tableau c'est
      01-01-2016 affiché et 01/01/2016 en entrée...

      Du coup je pige plus trop pourquoi il me sort une incompatibilité de type...

      Crois tu que mon soucis vient de la valeur de res ?
      J'avais pensé faire une boucle n = 1 to 100 avec
      res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A" & n), 0)
      

      ce qui me prend bien la valeur de la cellule 01/01/2016 mais ensuite j'ai l'impression qu'il a du mal à la comparer avec monjour...

      Voilà le détail du code :

      Sub Creation_Calendrier_365()
      Dim j As Long
      Dim monjour As Date
      Dim stJS
      Dim ferier As Date
      Dim res As Long
      Dim n As Long
       
          ActiveSheet.Rows(1).NumberFormat = "dd-mm-yyyy"
          ActiveSheet.Range("H1").Select
              For j = 1 To 365
      monjour = Date + j
      stJS = WeekdayName(Weekday(monjour - 1))
       
                  ActiveCell.Offset(ColumnOffset:=1).Activate
                  ActiveCell.FormulaR1C1 = monjour
                  ActiveCell.Offset(RowOffset:=1).Activate
                  ActiveCell.FormulaR1C1 = stJS
       
      ' On grise les week-end
      If Weekday(monjour, 2) > 5 Then
          ActiveCell.EntireColumn.Interior.ColorIndex = 15
      Else
          ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
       
      End If
      ActiveCell.Offset(RowOffset:=-1).Activate
               
      ' On grise les jours fériers
      For n = 1 To 100
              Worksheets("Configuration").Columns(1).NumberFormat = "dd-mm-yyyy"
              
               ActiveCell.Offset(RowOffset:=1).Activate
                      ActiveCell.FormulaR1C1 = "res = " & Worksheets("Configuration").Range("A" & n)
                      ActiveCell.Offset(RowOffset:=1).Activate
                      ActiveCell.FormulaR1C1 = "monjour = " & monjour
              ' res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A33"), 0)
              res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A" & n), 0)
       
                     
                '  If Application.Match(CLng(monjour), CLng(res), 0) Then
                   If res Then
                      ActiveCell.EntireColumn.Interior.ColorIndex = 15
                  Else
                      ActiveCell.EntireColumn.Interior.ColorIndex = xlNone
                      ActiveCell.Offset(RowOffset:=1).Activate
                      ActiveCell.FormulaR1C1 = res
                      ActiveCell.Offset(RowOffset:=-1).Activate
                  End If
              ' ActiveCell.Offset(RowOffset:=-1).Activate
      Next n
       
                 
              Next j
      End Sub
      


      Du coup j'ai
      res = 01/01/216
      monjour = 13/01/2016
      mais en CLng j'ai monjour = 42382
      donc du coup il faudrait pas que je passe aussi res en CLng ?




      Fand'
      0