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
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
A voir également:
- Application.match vba
- Mkdir vba ✓ - Forum VB / VBA
- Vba récupérer valeur cellule ✓ - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
- Vba range avec variable ✓ - Forum VB / VBA
- Vba dépassement de capacité ✓ - Forum Excel
3 réponses
jordane45
Messages postés
38321
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2024
4 707
6 janv. 2016 à 18:07
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 )
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
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
Modifié par jordane45 le 12/01/2016 à 12:17
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à...
jordane45
Messages postés
38321
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2024
4 707
12 janv. 2016 à 12:20
12 janv. 2016 à 12:20
Sauf... que dans ton code... je ne vois la la conversion en LONG .... Oo ??
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
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...
C'est bizarre...
jordane45
Messages postés
38321
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2024
4 707
12 janv. 2016 à 13:50
12 janv. 2016 à 13:50
quelles "deux valeurs" ??
Montres le code essayé avec le long !
Montres le code essayé avec le long !
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
12 janv. 2016 à 13:58
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 ...
jordane45
Messages postés
38321
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2024
4 707
12 janv. 2016 à 14:11
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 ......
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
12 janv. 2016 à 14:15
yup mais l'exemple 1 reprend comme ton code et pourtant j'ai la même erreur ...
Très space...
res = Application.Match(CLng(monjour), Worksheets("Configuration").Range("A1:A100"), 0)
Très space...
jordane45
Messages postés
38321
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2024
4 707
>
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
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 ?
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 ?
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
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
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'
12 janv. 2016 à 11:25
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'
12 janv. 2016 à 11:40
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....