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

Fermé
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016 - 6 janv. 2016 à 17:34
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016 - 12 janv. 2016 à 16:16
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

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
6 janv. 2016 à 18:07
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
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 11:25
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 11:40
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
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
Modifié par jordane45 le 12/01/2016 à 12:17
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
12 janv. 2016 à 12:20
Sauf... que dans ton code... je ne vois la la conversion en LONG .... Oo ??
0
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 13:45
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
12 janv. 2016 à 13:50
quelles "deux valeurs" ??
Montres le code essayé avec le long !
0
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 13:58
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
12 janv. 2016 à 14:11
(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
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 14:15
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
12 janv. 2016 à 15:07
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
fandaor Messages postés 9 Date d'inscription mardi 5 janvier 2016 Statut Membre Dernière intervention 12 janvier 2016
Modifié par fandaor le 12/01/2016 à 16:22
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