Application.Match - problème d'incompatibilité de type
fandaor
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
fandaor Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
fandaor Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
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'
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'
A voir également:
- Application.match vba
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
3 réponses
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 )
Ensuite, il faut convertir la date en LONG
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
oui c'erst hyper bizarre... pourtant mon code semble correct :
Je deviens chèvre là...
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à...
Voilà la première partie :
Et la deuxième version :
Les deux retournent la même erreur d'incompatibilité de type ...
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 ...
(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 ......
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
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 :
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'
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'
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'
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....