Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb de date sous VBA

18 réponses
Avatar
Philou36
Bonjour les amis,

Je n'arive pas à travailler avec des dates sous VBA. Je m'explique : j'ai
une combo avec des périodes sous la forme mois en clair et année (ex:
janvier 2010) et avec votre aide j'ai deux textbox avec dans le premier le
premier jour du mois (ex: pour janvier => 1) et dans l'autre le dernier jour
du mois (ex : 31 pour le mois de janvier 2010).
Comment faire pour indiquer dans un label le nombre de jours en trentieme
entre premier et le dernier jour de la période. Comme c'est des textbox,
possibilité de modifier ces deux valeurs.

Un grand merci par avance pour votre aide.

Philippe

8 réponses

1 2
Avatar
Calou
On 3 nov, 15:08, isabelle wrote:
bonjour Philippe,

j'ai modifié comme ceci :

fin = Left(Me.CboPeriode, Len(Me.CboPeriode) - 5)

par ailleurs il y a un erreur sur cette macro
pour l'utilisation de RowSource, cette valeur doit être un adresse
.RowSource = "a1:e4"
est ce que Technique et Administrative sont des plages nommées ?

Private Sub CboFiliere1_Change()
'Changement de Filiere (Situation 1)
Select Case CboFiliere1.Value
Case Is = "Administrative"
    CboGrade1.RowSource = "Administrative"
Case Is = "Technique"
    CboGrade1.RowSource = "Technique"
End Select
End Sub

isabelle

Calou a écrit :



> Isabelle,
> le voilou !
>http://cjoint.com/?ldoVp4T080
> Bon courage
> Philippe
> PS : Merci de ton indulgence vis a vis du code et n'hesite pas a me
> dire ce que tu en penses !- Masquer le texte des messages précédent s -

- Afficher le texte des messages précédents -



Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe
Avatar
isabelle
bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :
Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe



Avatar
Calou
On 3 nov, 16:29, isabelle wrote:
bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :



> Isabelle,
> Pour alleger le fichier, j'ai volontairement supprimer des onglets
> dans lesquels se trouvaient des plages nommées Administrative et
> Technique.
> Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
> après quelques tests je me rend compte qu'il indique un nombre de
> jours calendaire et non en trentieme.
> En lancant l'enregistreur de macro, il m'indique dans le code la
> fonction days360 avec la syntaxe suivante :
> ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
> j'ai modifié ton code mais il plante  en m'indiquant : sun ou fonct ion
> non défini.
> Vois tu une solution ?
> En grand merci pour ta patience et ta perceverance.
> A+
> Philippe- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe
Avatar
isabelle
là c'est moi qui ne comprend pas

les deux premier argument de la formule
JOURS360(date_début;date_fin;méthode)
sont des dates, tu ne peut pas mettre des chiffres "jour"

date_début et date_fin sont les deux dates délimitant la période
dont vous voulez connaître le nombre de jours. Si date_début est
postérieure à date_fin, JOURS360 renvoie un valeur négative. Les dates
doivent être entrées à l'aide de la fonction DATE ou sous la forme de
résultats d'autres formules ou fonctions. Par exemple, utilisez
DATE(2008 ;5; 23) pour la date du 23 mai 2008. Certains problèmes
peuvent survenir si les dates sont entrées sous forme de texte.

par ailleurs sur ton formulaire il n'y a qu'une information soit "mmmm aaaa"

isabelle



Calou a écrit :
On 3 nov, 16:29, isabelle wrote:

bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :




Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe- Masquer le texte des messages précédents -



- Afficher le texte des messages précédents -




Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe



Avatar
Philou36
Isabelle,
Je suis vraiment désolé de ne pas avoir été assez clair dans mes
explications.
J'ai une combo 'CboPeriode' avec des période sous la forme mois année (ex :
octobre 2009)
j'ai ensuite deux txtbox 'TxtDebPeriode' et 'TxtFinPeriode'

j'ai la subroutine suivante :
Private Sub CboPeriode_Change()
TxtDebPeriode.Value = "01"
Me.TxtFinPeriode.Value = Day(DateSerial(Year(Me.CboPeriode.Value),
Month(Me.CboPeriode.Value) + 1, 0))
End Sub

qui me permet d'afficher le premier et le dernier jour de la période
selectionnée
A coté de ces deux txtbox, j'ai positionné un label où je souhaiterais
indiqué le nombre de jours en trentieme entre la date de début et de fin.

En fait, mon problème c'est que pour les mois, je ne sais pas convertir
'octobre' en 10.
Ce que j'aimerai faire c'est de concatener le 'TxtDebPeriode' avec le mois
en chiifre et enfin l'année. Et le meme principe pour définir la fin de la
période.

Merci encore pour tout ton travail.

Philippe




"isabelle" a écrit dtans le message de news:

là c'est moi qui ne comprend pas

les deux premier argument de la formule
JOURS360(date_début;date_fin;méthode)
sont des dates, tu ne peut pas mettre des chiffres "jour"

date_début et date_fin sont les deux dates délimitant la période dont
vous voulez connaître le nombre de jours. Si date_début est postérieure à
date_fin, JOURS360 renvoie un valeur négative. Les dates doivent être
entrées à l'aide de la fonction DATE ou sous la forme de résultats
d'autres formules ou fonctions. Par exemple, utilisez DATE(2008 ;5; 23)
pour la date du 23 mai 2008. Certains problèmes peuvent survenir si les
dates sont entrées sous forme de texte.

par ailleurs sur ton formulaire il n'y a qu'une information soit "mmmm
aaaa"

isabelle



Calou a écrit :
On 3 nov, 16:29, isabelle wrote:

bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :




Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe- Masquer le texte des messages précédents -



- Afficher le texte des messages précédents -




Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe






Avatar
Philou36
Isabelle,
Bon, je pensais avoir contourner le problème de la façon suivante :
Private Sub TxtFinPeriode_Change()
'mm = Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet",
"août", "septembre", "octobre", "novembre", "décembre")
Mois = Left(Me.CboPeriode, Len(Me.CboPeriode) - 5)
Select Case Mois
Case Is = "janvier"
MoisEnChiffre = "01"
Case Is = "février"
MoisEnChiffre = "02"
Case Is = "mars"
MoisEnChiffre = "03"
Case Is = "avril"
MoisEnChiffre = "04"
Case Is = "mai"
MoisEnChiffre = "05"
Case Is = "juin"
MoisEnChiffre = "06"
Case Is = "juillet"
MoisEnChiffre = "07"
Case Is = "aout"
MoisEnChiffre = "08"
Case Is = "septembre"
MoisEnChiffre = "09"
Case Is = "octobre"
MoisEnChiffre = "10"
Case Is = "novembre"
MoisEnChiffre = "11"
Case Is = "décembre"
MoisEnChiffre = "12"
End Select
année = CDbl(Right(Me.CboPeriode, 4))
PremierJour = TxtDebPeriode.Value & "/" & MoisEnChiffre & "/" & année
DernierJour = TxtFinPeriode.Value & "/" & MoisEnChiffre & "/" & année
x = Application.Days360(PremierJour, DernierJour + 1, True)
LblNbJrsTotal.Caption = x
End Sub

Mes variables 'PremierJour' et 'DernierJour' sont sous la forme 01/09/2009
mais je ne sais pas maintenant comment convertir ces dates en format date.
J'espère etre clair.
mais j'ai le message suivant :
Incompatibilié de type

http://cjoint.com/?ldwPsnwxFH

Qu'en penses tu ?





"Philou36" a écrit dans le message de news:

Isabelle,
Je suis vraiment désolé de ne pas avoir été assez clair dans mes
explications.
J'ai une combo 'CboPeriode' avec des période sous la forme mois année (ex
: octobre 2009)
j'ai ensuite deux txtbox 'TxtDebPeriode' et 'TxtFinPeriode'

j'ai la subroutine suivante :
Private Sub CboPeriode_Change()
TxtDebPeriode.Value = "01"
Me.TxtFinPeriode.Value = Day(DateSerial(Year(Me.CboPeriode.Value),
Month(Me.CboPeriode.Value) + 1, 0))
End Sub

qui me permet d'afficher le premier et le dernier jour de la période
selectionnée
A coté de ces deux txtbox, j'ai positionné un label où je souhaiterais
indiqué le nombre de jours en trentieme entre la date de début et de fin.

En fait, mon problème c'est que pour les mois, je ne sais pas convertir
'octobre' en 10.
Ce que j'aimerai faire c'est de concatener le 'TxtDebPeriode' avec le mois
en chiifre et enfin l'année. Et le meme principe pour définir la fin de la
période.

Merci encore pour tout ton travail.

Philippe




"isabelle" a écrit dtans le message de news:

là c'est moi qui ne comprend pas

les deux premier argument de la formule
JOURS360(date_début;date_fin;méthode)
sont des dates, tu ne peut pas mettre des chiffres "jour"

date_début et date_fin sont les deux dates délimitant la période dont
vous voulez connaître le nombre de jours. Si date_début est postérieure à
date_fin, JOURS360 renvoie un valeur négative. Les dates doivent être
entrées à l'aide de la fonction DATE ou sous la forme de résultats
d'autres formules ou fonctions. Par exemple, utilisez DATE(2008 ;5; 23)
pour la date du 23 mai 2008. Certains problèmes peuvent survenir si les
dates sont entrées sous forme de texte.

par ailleurs sur ton formulaire il n'y a qu'une information soit "mmmm
aaaa"

isabelle



Calou a écrit :
On 3 nov, 16:29, isabelle wrote:

bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :




Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe- Masquer le texte des messages précédents -



- Afficher le texte des messages précédents -




Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe











Avatar
isabelle
bonjour Philippe,

ne te décourage pas je pense qu'on y arrive,

mm = Array("janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre")
MoisLettre = Left(Me.CboPeriode, Len(Me.CboPeriode) - 5)
Année = Right(Me.CboPeriode, 4)
MoisChiffre = Application.Match(MoisLettre, mm, 0)
DateDébut = DateSerial(Année, MoisChiffre, 1)
DateFin = DateSerial(Année, MoisChiffre + 1, 1)-1
JourTrentieme = Application.Days360(DateDébut , DateFin + 1, True)

isabelle

Philou36 a écrit :
Isabelle,
Je suis vraiment désolé de ne pas avoir été assez clair dans mes
explications.
J'ai une combo 'CboPeriode' avec des période sous la forme mois année (ex :
octobre 2009)
j'ai ensuite deux txtbox 'TxtDebPeriode' et 'TxtFinPeriode'

j'ai la subroutine suivante :
Private Sub CboPeriode_Change()
TxtDebPeriode.Value = "01"
Me.TxtFinPeriode.Value = Day(DateSerial(Year(Me.CboPeriode.Value),
Month(Me.CboPeriode.Value) + 1, 0))
End Sub

qui me permet d'afficher le premier et le dernier jour de la période
selectionnée
A coté de ces deux txtbox, j'ai positionné un label où je souhaiterais
indiqué le nombre de jours en trentieme entre la date de début et de fin.

En fait, mon problème c'est que pour les mois, je ne sais pas convertir
'octobre' en 10.
Ce que j'aimerai faire c'est de concatener le 'TxtDebPeriode' avec le mois
en chiifre et enfin l'année. Et le meme principe pour définir la fin de la
période.

Merci encore pour tout ton travail.

Philippe




"isabelle" a écrit dtans le message de news:


là c'est moi qui ne comprend pas

les deux premier argument de la formule
JOURS360(date_début;date_fin;méthode)
sont des dates, tu ne peut pas mettre des chiffres "jour"

date_début et date_fin sont les deux dates délimitant la période dont
vous voulez connaître le nombre de jours. Si date_début est postérieure à
date_fin, JOURS360 renvoie un valeur négative. Les dates doivent être
entrées à l'aide de la fonction DATE ou sous la forme de résultats
d'autres formules ou fonctions. Par exemple, utilisez DATE(2008 ;5; 23)
pour la date du 23 mai 2008. Certains problèmes peuvent survenir si les
dates sont entrées sous forme de texte.

par ailleurs sur ton formulaire il n'y a qu'une information soit "mmmm
aaaa"

isabelle



Calou a écrit :

On 3 nov, 16:29, isabelle wrote:


bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :





Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe- Masquer le texte des messages précédents -




- Afficher le texte des messages précédents -




Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe











Avatar
Philou36
Bonjour Isabelle,
Je pense que c'est surtout toi qui y es arrive ! je ne suis qu'un spectateur
!
Par contre, j'ai integre pour la date de debut et de fin car ce sont des
textbox et susceptibre d'etre modifié par l'utilisateur.

Private Sub TxtFinPeriode_Change()
mm = Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet",
"août", "septembre", "octobre", "novembre", "décembre")
MoisLettre = Left(Me.CboPeriode, Len(Me.CboPeriode) - 5)
Année = Right(Me.CboPeriode, 4)
MoisChiffre = Application.Match(MoisLettre, mm, 0)
DateDébut = DateSerial(Année, MoisChiffre, TxtDebPeriode.Value)
DateFin = DateSerial(Année, MoisChiffre, TxtFinPeriode.Value)
JourTrentieme = Application.Days360(DateDébut, DateFin + 1, True)
LblNbJrsTotal.Caption = JourTrentieme
End Sub
Et ca marche !
Mille merci à toi, pour ta patiente...
C'est fou ce que j'apprend avec vous !
Tres bonne journée
Philippe
"isabelle" a écrit dans le message de news:

bonjour Philippe,

ne te décourage pas je pense qu'on y arrive,

mm = Array("janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre")
MoisLettre = Left(Me.CboPeriode, Len(Me.CboPeriode) - 5)
Année = Right(Me.CboPeriode, 4)
MoisChiffre = Application.Match(MoisLettre, mm, 0)
DateDébut = DateSerial(Année, MoisChiffre, 1)
DateFin = DateSerial(Année, MoisChiffre + 1, 1)-1
JourTrentieme = Application.Days360(DateDébut , DateFin + 1, True)

isabelle

Philou36 a écrit :
Isabelle,
Je suis vraiment désolé de ne pas avoir été assez clair dans mes
explications.
J'ai une combo 'CboPeriode' avec des période sous la forme mois année (ex
: octobre 2009)
j'ai ensuite deux txtbox 'TxtDebPeriode' et 'TxtFinPeriode'

j'ai la subroutine suivante :
Private Sub CboPeriode_Change()
TxtDebPeriode.Value = "01"
Me.TxtFinPeriode.Value = Day(DateSerial(Year(Me.CboPeriode.Value),
Month(Me.CboPeriode.Value) + 1, 0))
End Sub

qui me permet d'afficher le premier et le dernier jour de la période
selectionnée
A coté de ces deux txtbox, j'ai positionné un label où je souhaiterais
indiqué le nombre de jours en trentieme entre la date de début et de fin.

En fait, mon problème c'est que pour les mois, je ne sais pas convertir
'octobre' en 10.
Ce que j'aimerai faire c'est de concatener le 'TxtDebPeriode' avec le
mois en chiifre et enfin l'année. Et le meme principe pour définir la fin
de la période.

Merci encore pour tout ton travail.

Philippe




"isabelle" a écrit dtans le message de news:


là c'est moi qui ne comprend pas

les deux premier argument de la formule
JOURS360(date_début;date_fin;méthode)
sont des dates, tu ne peut pas mettre des chiffres "jour"

date_début et date_fin sont les deux dates délimitant la période
dont vous voulez connaître le nombre de jours. Si date_début est
postérieure à date_fin, JOURS360 renvoie un valeur négative. Les dates
doivent être entrées à l'aide de la fonction DATE ou sous la forme de
résultats d'autres formules ou fonctions. Par exemple, utilisez
DATE(2008 ;5; 23) pour la date du 23 mai 2008. Certains problèmes
peuvent survenir si les dates sont entrées sous forme de texte.

par ailleurs sur ton formulaire il n'y a qu'une information soit "mmmm
aaaa"

isabelle



Calou a écrit :

On 3 nov, 16:29, isabelle wrote:


bonjour Philippe,

la formule se traduit comme ça,

x = Application.Days360(Range("A1"), Range("B1") + 1, True)

isabelle

Calou a écrit :





Isabelle,
Pour alleger le fichier, j'ai volontairement supprimer des onglets
dans lesquels se trouvaient des plages nommées Administrative et
Technique.
Maintenant, le champs LblNbJrsTotal.Caption est bien renseigné mais
après quelques tests je me rend compte qu'il indique un nombre de
jours calendaire et non en trentieme.
En lancant l'enregistreur de macro, il m'indique dans le code la
fonction days360 avec la syntaxe suivante :
ActiveCell.FormulaR1C1 = "ÚYS360(RC[-2],RC[-1]+1,TRUE)"
j'ai modifié ton code mais il plante en m'indiquant : sun ou
fonction
non défini.
Vois tu une solution ?
En grand merci pour ta patience et ta perceverance.
A+
Philippe- Masquer le texte des messages précédents -




- Afficher le texte des messages précédents -




Isabelle,
je suis desole de t'inportuner avec mon probleme mais comment lui
indiquer dans la ligne x = Application.Days360(Range("A1"), Range
("B1") + 1, True)
en remplacant A1 par le premier jour du mois et B1 par le dernier jour
du mois ?
Je ne sais vraiment pas comment faire !
peux tu m'aider ?
A +
Philippe














1 2